我在 java 中使用 itext 5.3 生成 PDF。我正在使用 HTMLWorker.parseToList(Reader, StyleSheet)
将部分转换为包含 HTML 标签(如粗体、斜体、href 等)的字符串到 PDF。我不想将完整的 HTML 生成为 PDF,而是 PDF 中的一部分文本将是 HTML。例如,像“This is test bold text”这样的字符串将部分文本转换为粗体。
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;
}
}
另一个Javafile.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 - XMLWorkerHelper 性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15621218/