gpt4 book ai didi

itextsharp - 如何将多个 HTML 文件解析为单个 PDF?

转载 作者:行者123 更新时间:2023-12-04 23:48:47 25 4
gpt4 key购买 nike

我想使用 iText 将一系列 html 文件转换为 PDF。

例如:如果有这些文件:

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

  • 现在我想创建一个 PDF 文件,其中 page1.html 是第一页,page2.html 是第二页,依此类推...

    我知道如何将单个 HTML 文件转换为 PDF,但我不知道如何将由此操作产生的这些不同的 PDF 合并为一个 PDF。

    最佳答案

    开始之前:我不是 C# 开发人员,所以我不能给你一个 C# 的例子。我写的所有 iText 示例都是用 Java 编写的。幸运的是,iText 和 iTextSharp 始终保持同步。在这个问题的上下文中,您可以放心,任何适用于 iText 的东西也适用于 iTextSharp,但您必须进行特定于 C# 的小调整。从我从 C# 开发人员那里听到的,这通常不难实现。

    关于答案:有两个答案,答案#2 通常比答案#1 好,但我给出了两个选项,因为可能存在答案#1 更好的特定情况。

    测试数据:我创建了 3 个简单的 HTML 文件,每个文件都包含有关美国某个州的一些信息:

  • page1.html :加利福尼亚
  • page2.html : 纽约
  • page3.html : 马萨诸塞州

  • 我们将使用 XML Worker 解析这三个文件,结果我们想要一个 PDF 文件。

    答案 #1:ParseMultipleHtmlFiles1获取完整代码示例和 multiple_html_pages1.pdf对于生成的 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 文件并以 byte[] 的形式返回该 PDF 文件。 .由于我们想要创建单个 PDF,我们可以将此字节数组提供给 PdfCopy实例,以便我们可以连接多个文档。

    假设我们有三个文件:
    public static final String[] HTML = {
    "resources/xml/page1.html",
    "resources/xml/page2.html",
    "resources/xml/page3.html"
    };

    我们可以遍历这三个文档,将它们一一解析为 byte[] , 创建 PdfReader实例与 PDF 字节,并将文档添加到 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对于生成的 PDF。您已经看到文件大小的差异:4.61 KB 与 5.05 KB(我们甚至没有引入嵌入字体)。

    在这种情况下,我们不会像在 parseHtml() 中那样将 HTML 解析为 PDF 文件。答案#1中的方法。相反,我们将 HTML 解析为 iText ElementList使用 parseToElementList()方法。这个方法需要两个 String s。一个包含 HTML 代码,另一个包含 CSS 值。

    我们使用实用方法将 HTML 文件读入 String .至于CSS值,我们可以通过 nullparseToElementList() ,但在这种情况下,默认样式将被忽略。您会注意到 <h1>如果您不通过 default.css,我们在 HTML 中引入的标签将看起来完全不同。随 XML Worker 一起提供。

    长话短说,这是代码:
    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 s 一一,我们将所有元素添加到 Document .

    当你想要一个新页面时,每次解析一个新的 HTML 文件时,我都会引入一个 document.newPage() .如果删除此行,则可以在单个页面上添加三个 HTML 页面(如果您选择答案 #1,这是不可能的)。

    关于itextsharp - 如何将多个 HTML 文件解析为单个 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27814701/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com