XMLWorkerHelper性能慢
问题描述:
我在java中使用itext 5.3来生成PDF。我正在使用HTMLWorker.parseToList(Reader, StyleSheet)
将部分转换为包含HTML标记(如粗体,斜体,href等)到PDF的字符串。我不想生成完整的HTML到PDF,而是PDF中的部分文本将是HTML。例如,像“这是测试粗体文本”这样的字符串将文本的一部分转换为粗体。XMLWorkerHelper性能慢
性能很好,HTMLWorker
。
由于现在不推荐使用,我开始使用XMLWorkerHelper.parseXHtml(ElementHandler, Reader)
,我发现与HTMLWorker
相比,性能非常差。
如果有人对解决方案或任何其他解决方法有任何想法,请让我知道。
下面是示例代码和其他发布与样本代码为
HTML to List using XMLWorker
public class HTMLElementHandler implements ElementHandler {
private Phrase phrase;
private Font font;
private HTMLElementHandler(Phrase phrase, Font font) {
super();
setPhrase(phrase);
setFont(font);
}
@Override
public void add(Writable writable) {
if (writable instanceof WritableElement) {
List<Element> elements = ((WritableElement) writable).elements();
for (Element elem : elements) {
List<Chunk> chunks = elem.getChunks();
for (Chunk chunk : chunks) {
Font chunkFont = chunk.getFont();
//Do something with fonts here
}
phrase.setFont(font);
phrase.add(elem);
}
}
}
public Phrase getPhrase() {
return this.phrase;
}
public void setPhrase(Phrase phrase) {
this.phrase = phrase;
}
public Font getFont() {
return this.font;
}
public void setFont(Font font) {
this.font = font;
}
}
AnotherJavafile.java
Phrase ph = new Phrase();
Font font = FontFactory.getFont(FontFactory.getFont("Arial").getFamilyname(), 12, new BaseColor(0, 102, 153));
XMLWorkerHelper.getInstance().parseXHtml(new HTMLElementHandler(phrase, font), "This is test <bold> bold </bold> text");
答
这个问题的原因是,其登记完成字体目录的作为操作的一部分,在(X)HTML被有效地解析之前。这花费了很多时间。
这可以通过提供不寻找任何字体的字体提供者来避开,即不会注册任何字体目录。此字体提供者可以创建:
new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS)
可以将此字体提供者作为参数来XMLWorkerHelper.getInstance().parseXHtml(...)
,但你不能,如果你有一个ElementHandler
作为你的第一个参数。我不知道为什么,我只偶尔使用iText。
我将在(X)HTML是一个字符串的情况下举个例子:
File tempPdfFile = File.createTempFile("temp_pdf_", ".pdf");
tempPdfFile.deleteOnExit();
try(OutputStream os = new FileOutputStream(tempPdfFile))
{
Document pdfDocument = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, os);
pdfDocument.open();
String htmlText = getHtmlText(); // your method that returns HTML as text
XMLWorkerHelper.getInstance().parseXHtml (
pdfWriter,
pdfDocument,
new ByteArrayInputStream(htmlText.getBytes(StandardCharsets.UTF_8)),
StandardCharsets.UTF_8,
new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS)
);
pdfDocument.close();
pdfWriter.close();
}
Desktop.getDesktop().open(tempPdfFile);
我也很遗憾的是从该类看到了一些比较差的表现,虽然不是从Java,从iTextSharp的,同一个库的C#端口。 – 2013-10-18 17:58:58
我也是。公式是ParseXHtml内部的以下方法: iTextSharp.text.FontFactoryImp.RegisterDirectories – 2014-06-20 14:50:02
另请参阅itextsharp问题 - http://stackoverflow.com/q/21275800/179972 – 2014-09-29 18:18:32