我正在使用java中的itext5.3来生成PDF。我正在使用HTMLWorker.parseToList(Reader, StyleSheet)转换部分到字符串,其中包含的HTML标签,如粗体,斜体,href等。我不想生成完整的HTML到PDF,而是PDF中的文本的一部分将是HTML。例如,像"This is test粗体文本“这样的字符串可以将部分文本转换为粗体。
使用HTMLWorker时,性能很好。
由于它现在已经被弃用,我开始使用XMLWorkerHelper.parseXHtml(ElementHandler, Reader),我发现与HTMLWorker相比,它的性能非常差。
如果任何人对解决方案或任何其他解决方法有任何想法,请让我知道。
下面是示例代码,其他带有示例代码的帖子位于
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");发布于 2017-12-16 18:13:45
此问题的原因是在有效解析(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 );https://stackoverflow.com/questions/15621218
复制相似问题