iText를 사용하여 일련의 HTML 파일을 PDF로 변환하려고합니다. 예를 들어여러 HTML 파일을 단일 PDF로 구문 분석하는 방법은 무엇입니까?
:이 파일이있는 경우 :
- page1.html을
- page2.html
- page3.html
가 지금 만들려는
하나의 HTML 파일을 PDF로 변환하는 방법을 알고 있지만이 작업으로 인해 생성 된 여러 PDF를 하나의 PDF로 결합하는 방법을 모르겠습니다.
iText를 사용하여 일련의 HTML 파일을 PDF로 변환하려고합니다. 예를 들어여러 HTML 파일을 단일 PDF로 구문 분석하는 방법은 무엇입니까?
:이 파일이있는 경우 :
가 지금 만들려는
하나의 HTML 파일을 PDF로 변환하는 방법을 알고 있지만이 작업으로 인해 생성 된 여러 PDF를 하나의 PDF로 결합하는 방법을 모르겠습니다.
시작하기 전에 : 저는 C# 개발자가 아니므로 C#으로 예제를 제공 할 수는 없습니다. 필자가 작성한 모든 iText 예제는 Java로 작성되었습니다. 다행히 iText와 iTextSharp는 항상 동기화 상태를 유지합니다. 이 질문의 맥락에서, 당신은 iText의 모든 작업이 iTextSharp에서도 작동한다는 것을 확신 할 수 있지만, C#과 관련된 작은 적응을해야 할 것입니다. C# 개발자의 의견에 따르면 일반적으로 달성하기가 어렵지 않습니다.
답변 : 두 가지 답변이 있는데 답변 # 2는 일반적으로 답변 # 1보다 낫지 만 답변 # 1이 더 좋은 특정 사례가있을 수 있으므로 두 가지 옵션을 모두 제공합니다.
데이터 테스트 :
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 값은 null
을 parseToElementList()
으로 전달할 수 있지만이 경우 기본 스타일은 무시됩니다. 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을 선택하면 가능하지 않습니다).
나는 위의 두 답변을 사용하여 변환하지만 CSS는 손실됩니다. 이것은 내 HTML입니다. [link] (http://prototype.ui.sh.ctriptravel.com/gerrit/gbk/master/UED/Flight/UED .Flight.online, _prototype_/print/fltInt_multi_itinerary.html) – kyzh101
안녕하세요, Mr Bruno Lowagie, iTextSharp가 특별한 CSS 스타일을 발견 할 수없는 것 같습니다. – kyzh101
링크는 "이 도메인을 판매하고 있습니다."라는 페이지를 보여줍니다. 자세한 내용을 보려면 여기를 클릭하십시오. . " XML Worker는 XHTML2PDF, ** NOT ** URL2PDF 만 수행 할 수 있습니다. iTextSharp는 페이지가 끝나자 마자'OutputStream'으로 보냅니다. HTML 파일의 끝에 추가되지만 첫 페이지에 내용을 추가해야하는 CSS 구조는 제외됩니다. HTML은 PDF와 매우 다릅니다. 브라우저에서 HTML 페이지를 인쇄 해보십시오. 이미 HTML을 고정 크기의 페이지로 변환하는 한계가 있습니다. –
이 질문에 이미 두 개의 downvotes가 표시되어 있지만 명확한 설명이 추가되면 질문을 저장할 수 있다고 생각합니다. (1.)'HtmlWorker'를 XML Worker로 대체하십시오 (왜냐하면'HtmlWorker'는 더 이상 지원되지 않으며 여러분의 필요를 충족시키지 않기 때문입니다). (2) 우리가 당신의 질문을 정확하게 해석하도록하는 의사 코드를 작성하십시오. 일련의 HTML 파일에서 가져온 내용으로 채워지는 1 개의 PDF를 만들고 싶지만 "페이지 매김"은 무엇입니까? 모든 새 HTML 파일에 대해 새 페이지를 시작 하시겠습니까? 명확히하십시오. –
예를 들어, HTML1이 첫 번째 페이지이고, html2가 두 번째 페이지이고, 모든 htmls가 동일한 pdf 인 PDF 시리즈를 만들려는 것입니다. – kyzh101
위대한 분들은 희망에 대한 질문을 업데이트 할 것입니다. 귀하의 질문을 재검토하기 위해 투표했습니다 ;-) –