2

PDFを生成するためにJavaでitext 5.3を使用しています。HTMLWorker.parseToList(Reader, StyleSheet)Bold、Italic、href などの HTML タグを含む一部を 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");
4

1 に答える 1

0

この問題の原因は、(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 );
于 2017-12-16T10:13:45.143 に答える