2015-01-07 5 views
3

iText를 사용하여 일련의 HTML 파일을 PDF로 변환하려고합니다. 예를 들어여러 HTML 파일을 단일 PDF로 구문 분석하는 방법은 무엇입니까?

:이 파일이있는 경우 :

  • page1.html을
  • page2.html
  • page3.html

가 지금 만들려는

  • ... 하나의 PDF 파일 (page1.html은 첫 번째 페이지, page2.html은 두 번째 페이지 등) ...

    하나의 HTML 파일을 PDF로 변환하는 방법을 알고 있지만이 작업으로 인해 생성 된 여러 PDF를 하나의 PDF로 결합하는 방법을 모르겠습니다.

  • +0

    이 질문에 이미 두 개의 downvotes가 표시되어 있지만 명확한 설명이 추가되면 질문을 저장할 수 있다고 생각합니다. (1.)'HtmlWorker'를 XML Worker로 대체하십시오 (왜냐하면'HtmlWorker'는 더 이상 지원되지 않으며 여러분의 필요를 충족시키지 않기 때문입니다). (2) 우리가 당신의 질문을 정확하게 해석하도록하는 의사 코드를 작성하십시오. 일련의 HTML 파일에서 가져온 내용으로 채워지는 1 개의 PDF를 만들고 싶지만 "페이지 매김"은 무엇입니까? 모든 새 HTML 파일에 대해 새 페이지를 시작 하시겠습니까? 명확히하십시오. –

    +0

    예를 들어, HTML1이 첫 번째 페이지이고, html2가 두 번째 페이지이고, 모든 htmls가 동일한 pdf 인 PDF 시리즈를 만들려는 것입니다. – kyzh101

    +0

    위대한 분들은 희망에 대한 질문을 업데이트 할 것입니다. 귀하의 질문을 재검토하기 위해 투표했습니다 ;-) –

    답변

    7

    시작하기 전에 : 저는 C# 개발자가 아니므로 C#으로 예제를 제공 할 수는 없습니다. 필자가 작성한 모든 iText 예제는 Java로 작성되었습니다. 다행히 iText와 iTextSharp는 항상 동기화 상태를 유지합니다. 이 질문의 맥락에서, 당신은 iText의 모든 작업이 iTextSharp에서도 작동한다는 것을 확신 할 수 있지만, C#과 관련된 작은 적응을해야 할 것입니다. C# 개발자의 의견에 따르면 일반적으로 달성하기가 어렵지 않습니다.

    답변 : 두 가지 답변이 있는데 답변 # 2는 일반적으로 답변 # 1보다 낫지 만 답변 # 1이 더 좋은 특정 사례가있을 수 있으므로 두 가지 옵션을 모두 제공합니다.

    데이터 테스트 :

    • page1.html : 캘리포니아
    • page2.html : 나는 3 개 간단한 HTML 파일, 미국의 국가에 대한 몇 가지 정보를 포함하는 각을 만든 뉴욕
    • page3.html : 매사추세츠

    XML 작업자를 사용하여이 세 파일을 구문 분석하고 노래를 원합니다. 결과적으로 PDF 파일.

    답변 # 1 : 전체 코드 샘플은 ParseMultipleHtmlFiles1이고 결과 코드는 multiple_html_pages1.pdf입니다.

    당신은 이미 하나의 HTML 파일을 하나의 PDF 파일로 변환하는 데 성공했다고 말합니다.

    public byte[] parseHtml(String html) throws DocumentException, IOException { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        // step 1 
        Document document = new Document(); 
        // step 2 
        PdfWriter writer = PdfWriter.getInstance(document, baos); 
        // step 3 
        document.open(); 
        // step 4 
        XMLWorkerHelper.getInstance().parseXHtml(writer, document, 
          new FileInputStream(html)); 
        // step 5 
        document.close(); 
        // return the bytes of the PDF 
        return baos.toByteArray(); 
    } 
    

    이 (웹 사이트의 다른 예제가있는) HTML 파일을 구문 분석하는 가장 효율적인 방법은 아니지만, 가장 간단한 방법 :이처럼했다는 것을 가정한다.

    이 메소드는 HTML을 PDF 파일로 구문 분석 한 후 해당 PDF 파일을 byte[] 형태로 반환합니다. 단일 PDF를 만들려고 할 때이 바이트 배열을 PdfCopy 인스턴스에 공급하여 여러 문서를 연결할 수 있습니다.

    우리는 세 가지 문서를 가지고 있다고 가정하자 :

    public static final String[] HTML = { 
        "resources/xml/page1.html", 
        "resources/xml/page2.html", 
        "resources/xml/page3.html" 
    }; 
    

    우리는이 세 가지 문서를 통해 루프하는 byte[]에 그들에게 하나 하나를 분석 할 수는 PDF 바이트와 PdfReader 인스턴스를 생성하고에 문서를 추가 PdfCopy 인스턴스 addDocument() 방법 사용 :이 문제를 해결

    public void createPdf(String file) throws IOException, DocumentException { 
        Document document = new Document(); 
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(file)); 
        document.open(); 
        PdfReader reader; 
        for (String html : HTML) { 
         reader = new PdfReader(parseHtml(html)); 
         copy.addDocument(reader); 
         reader.close(); 
        } 
        document.close(); 
    } 
    

    을, 그런데 왜 나는 그것이 최적의 솔루션이 아니다 생각하십니까?

    포함해야하는 특수 글꼴을 사용해야한다고 가정합니다. 이 경우 모든 개별 PDF 파일에는 해당 글꼴의 하위 집합이 포함됩니다. 서로 다른 파일은 다른 글꼴 하위 집합을 필요로하며, PdfCopy (해당 내용의 경우 PdfSmartCopy)은 글꼴 하위 집합을 병합 할 수 있습니다. 이로 인해 동일한 글꼴의 글꼴 하위 집합이 너무 많은 부풀린 PDF 파일이 생성 될 수 있습니다.

    어떻게 해결할 수 있습니까? 답변 # 2에서 설명했습니다.

    답변 # 2 : 전체 코드 샘플은 ParseMultipleHtmlFiles2이고 결과 코드는 multiple_html_pages2.pdf을 참조하십시오. 이미 파일 크기의 차이를 볼 수 있습니다 : 4.61KB 대 5.05KB (우리는 임베디드 글꼴을 도입하지 않았습니다).

    이 경우 answer # 1의 parseHtml() 메소드에서와 같이 HTML을 PDF 파일로 구문 분석하지 않습니다. 대신, parseToElementList() 메소드를 사용하여 iText ElementList으로 HTML을 구문 분석합니다. 이 방법은 두 개의 String이 필요합니다. 하나는 HTML 코드를 포함하고, 다른 하나는 CSS 값을 포함합니다.

    우리는 유틸리티 메소드를 사용하여 HTML 파일을 String으로 읽습니다. CSS 값은 nullparseToElementList()으로 전달할 수 있지만이 경우 기본 스타일은 무시됩니다. XML 작업자와 함께 제공되는 default.css을 전달하지 않으면 우리가 HTML에 도입 한 <h1> 태그가 완전히 다르게 보일 것입니다.

    public void createPdf(String file) throws IOException, DocumentException { 
        Document document = new Document(); 
        PdfWriter.getInstance(document, new FileOutputStream(file)); 
        document.open(); 
        String css = readCSS(); 
        for (String htmlfile : HTML) { 
         String html = Utilities.readFileToString(htmlfile); 
         ElementList list = XMLWorkerHelper.parseToElementList(html, css); 
         for (Element e : list) { 
          document.add(e); 
         } 
         document.newPage(); 
        } 
        document.close(); 
    } 
    

    우리는 하나의 Document 단일 PdfWriter 인스턴스를 생성 :

    길고도 짧은 이야기,이 코드입니다. 서로 다른 HTML 파일을 하나씩 ElementList으로 파싱하고 모든 요소를 ​​Document에 추가합니다.

    새 페이지를 원할 때마다 새 HTML 파일을 구문 분석 할 때마다 document.newPage()이 도입되었습니다. 이 줄을 제거하면 단일 페이지에 3 개의 HTML 페이지를 추가 할 수 있습니다 (# 1을 선택하면 가능하지 않습니다).

    +0

    나는 위의 두 답변을 사용하여 변환하지만 CSS는 손실됩니다. 이것은 내 HTML입니다. [link] (http://prototype.ui.sh.ctriptravel.com/gerrit/gbk/master/UED/Flight/UED .Flight.online, _prototype_/print/fltInt_multi_itinerary.html) – kyzh101

    +0

    안녕하세요, Mr Bruno Lowagie, iTextSharp가 특별한 CSS 스타일을 발견 할 수없는 것 같습니다. – kyzh101

    +0

    링크는 "이 도메인을 판매하고 있습니다."라는 페이지를 보여줍니다. 자세한 내용을 보려면 여기를 클릭하십시오. . " XML Worker는 XHTML2PDF, ** NOT ** URL2PDF 만 수행 할 수 있습니다. iTextSharp는 페이지가 끝나자 마자'OutputStream'으로 보냅니다. HTML 파일의 끝에 추가되지만 첫 페이지에 내용을 추가해야하는 CSS 구조는 제외됩니다. HTML은 PDF와 매우 다릅니다. 브라우저에서 HTML 페이지를 인쇄 해보십시오. 이미 HTML을 고정 크기의 페이지로 변환하는 한계가 있습니다. –

    관련 문제