2013-03-25 95 views
2

我在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"); 
+0

我也很遺憾的是從該類看到了一些比較差的表現,雖然不是從Java,從iTextSharp的,同一個庫的C#端口。 – 2013-10-18 17:58:58

+1

我也是。公式是ParseXHtml內部的以下方法: iTextSharp.text.FontFactoryImp.RegisterDirectories – 2014-06-20 14:50:02

+0

另請參閱itextsharp問題 - http://stackoverflow.com/q/21275800/179972 – 2014-09-29 18:18:32

回答

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);