当前位置: 首页 > 知识库问答 >
问题:

将XMLWorkerHelper与IText一起使用

郎经纶
2023-03-14

我刚开始使用iText,我不知道XMLWorkerHelper类是如何工作的。我正在尝试创建一个方法,该方法接受包含html文档的字符串,将html转换为pdf文档,并将pdf作为字节数组返回。如果有人能指出下面代码中的错误,我将不胜感激。

Document document = new Document(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
document.open();
StringReader stringReader = new StringReader(articleString);
StringWriter stringWriter = new StringWriter();<br/>
Tidy tidy = new Tidy();
tidy.setXHTML(true);
tidy.parse(stringReader, stringWriter);
System.out.println("Before XMLWorkerHelper");
XMLWorkerHelper xwh = XMLWorkerHelper.getInstance();
xwh.parseXHtml(pdfWriter, document, new StringReader(stringWriter.toString()));
System.out.println("After XMLWorkerHelper");
document.close();
stringReader.close();
result = baos.toByteArray();

我使用的代码如上所述。html代码位于变量articleString中。重要的部分是介于这两个系统之间。出来println语句。这是web应用程序和系统的一部分。out写入服务器日志以及任何错误或异常消息,但实际情况是,应用程序似乎在两个println语句之间终止,而不引发任何异常。因此,打印的是“XMLWorkerHelper之前”一行,而不是“XMLWorkerHelper之后”一行。

我使用的jar文件是itextpdf-5.4.0。jar,itext-pdfa-5.4.0。jar,itext-xtra-5.4.0。jar,xmlworker-5.4.0。罐子

我试图转换的html文件只是“测试人员文章”,jTidy正在将其转换为

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
Tester Article
</body>
</html>

我尝试使用iText 5.0 jar中的旧HTMLWorker类代替XMLWorkerHelper代码,一切都很好。我用来代替上述XMLWorkerHelper行的HTMLWorker代码是:

HTMLWorker htmlWorker = new HTMLWorker(document);
htmlWorker.parse(new StringReader(stringWriter.toString()));

共有1个答案

龙星辰
2023-03-14

我希望这个问题已经解决了。如果没有,请尝试删除代码。如果这没有帮助,请尝试放置stringWriter。在InputStream中使用toString(),然后在parseXHtml上使用该流代替stringWriter。toString()

输入流

InputStream stream = new ByteArrayInputStream(stringWriter.toString().getBytes("UTF-8"));

XMLWorkerHelper:

XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document, stream);

希望这有助于你或任何人谁有同样的问题看这个

 类似资料:
  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您

  • 问题内容: 最近,我开始与路由器一起使用来构建应用程序。 我通常将use 用于依赖项和代码管理。但是,当我尝试包含包含语法的文件时会出现问题。 这就是我目前所拥有的: 如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于语法错误。 问题答案: 所以我自己弄清楚了。 我从此仓库获得了必要的文件和说明:jsx- requirejs-p

  • 所以我一定是错过了什么,我希望执行一个语句块,如果可选的存在,否则抛出异常。 如果不是null,则打印hellow world。如果是,则抛出运行时异常。