2013-03-25 8 views
2

Я использую itext 5.3 в java для создания PDF. Я использовал HTMLWorker.parseToList(Reader, StyleSheet) для преобразования части в String, которая содержит HTML-теги, такие как Bold, Italic, href и т. Д. В PDF. Я не хочу генерировать полный HTML в PDF, а часть текста в формате PDF будет HTML. Например, строки, такие как «Это тестовый полужирный текст», чтобы преобразовать часть текста в полужирный.XMLWorkerHelper performance slow

Производительность хороша с 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# той же библиотеки. –

+1

Я тоже. Последним является внутренний метод ParseXHtml: iTextSharp.text.FontFactoryImp.RegisterDirectories –

+0

см. Также itextsharp issue - http://stackoverflow.com/q/21275800/179972 –

ответ

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