2013-03-25 3 views
2

PDF를 생성하려면 java에서 itext 5.3을 사용하고 있습니다. 나는 HTMLWorker.parseToList(Reader, StyleSheet)을 사용하여 굵게, 기울임 꼴, href 등의 HTML 태그가 포함 된 String으로 부분을 PDF로 변환했습니다. HTML로 완성 된 HTML을 PDF로 생성하는 대신 PDF의 텍스트 부분을 HTML로 생성하고 싶습니다. 예를 들어, "This is test bold text"와 같은 문자열은 텍스트의 일부를 굵게 변환합니다.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

내가 너무 불행하게도이 클래스에서 다소 저조한 실적을보고하고, 아니지만 자바에서, iTextSharp에서, 같은 라이브러리의 C# 포트. –

+1

나도 그래. culperate는 다음과 같은 ParseXHtml 내부 메서드입니다. iTextSharp.text.FontFactoryImp.RegisterDirectories –

+0

또한보십시오 itextsharp 문제 - http://stackoverflow.com/q/21275800/179972 –

답변

0

입니다 (X) HTML이 효과적으로 구문 분석되기 전에 작업의 일부로 이것은 엄청난 시간을 필요로합니다.

이것은 폰트를 찾지 않는 폰트 프로 바이더를 제공함으로써 즉, 폰트 디렉토리를 등록하지 않기 때문에 피할 수있다. 그러나 당신이 당신의 첫 번째 매개 변수로 ElementHandler을 할 수없는 경우, 당신은 XMLWorkerHelper.getInstance().parseXHtml(...)에 매개 변수로이 글꼴 제공자를 제공 할 수 있습니다

new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS) 

:이 글꼴 제공자는 만들 수 있습니다. 나는 진짜로, 나는 단지 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); 
관련 문제