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

2024-02-29

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

例如:如果有这些文件:

  • 第1页.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 文件,每个文件都包含有关美国某个州的一些信息:

  • 第1页.html http://itextpdf.com/sites/default/files/page1.html: 加利福尼亚州
  • page2.html http://itextpdf.com/sites/default/files/page2.html: 纽约
  • page3.html http://itextpdf.com/sites/default/files/page3.html:马萨诸塞州

我们将使用 XML Worker 来解析这三个文件,并希望得到一个 PDF 文件。

答案#1: see 解析多个Html文件1 http://itextpdf.com/sandbox/xmlworker/ParseMultipleHtmlFiles1完整的代码示例和multiple_html_pages1.pdf http://itextpdf.com/sites/default/files/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 文件,并以以下形式返回该 PDF 文件:byte[]。由于我们想要创建一个 PDF,我们可以将此字节数组提供给PdfCopy实例,以便我们可以连接多个文档。

假设我们有三个文档:

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

我们可以循环这三个文档,将它们一一解析为byte[], 创建一个PdfReader实例与 PDF 字节,并将文档添加到PdfCopy实例使用addDocument() method:

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 (nor PdfSmartCopy就此而言)可以合并字体子集。这可能会导致 PDF 文件臃肿,其中包含太多相同字体的字体子集。

我们如何解决这个问题?答案#2 对此进行了解释。

答案#2: See 解析多个Html文件2 http://itextpdf.com/sandbox/xmlworker/ParseMultipleHtmlFiles2完整的代码示例和multiple_html_pages2.pdf http://itextpdf.com/sites/default/files/multiple_html_pages2.pdf对于生成的 PDF。您已经看到文件大小的差异:4.61 KB 与 5.05 KB(我们甚至没有引入嵌入字体)。

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

我们使用实用方法将 HTML 文件读入String。至于CSS值,我们可以通过null to parseToElementList(),但在这种情况下,默认样式将被忽略。你会注意到<h1>如果你不通过,我们在 HTML 中引入的标签看起来会完全不同default.css随 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 文件解析为ElementLists 一个接着一个,然后我们将所有元素添加到Document.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将多个 HTML 文件解析为单个 PDF? 的相关文章

  • iTextSharp 许可 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们想在我们的一个项目中使用 iTextSharp DLL 来提取 PDF 文本 但我第二次考虑将其发布
  • 如何在itextsharp文档中并行设置两个表?

    How can I set two tables parallelly in a document 我的生成 pdf 的示例代码是 Document doc new Document new Rectangle 288f 144f 10 1
  • 在 TextField IText 中调整文本

    抱歉 如果存在像我这样的类似帖子 但我是这个论坛的新手 我还没有找到它 我在动态调整 TextField 大小取决于文本大小时遇到 问题 我填写现有的 PDF 填写 AcroForm 中的字段 form setField 字段 值 等 一切
  • 将 iTextSharp.text.Image 转换回 System.Drawing.Image

    我正在尝试将 iTextSharp text Image 类型的对象转换回 System Drawing Image 这是一段不起作用的代码 System Drawing Image img System Drawing Image Fro
  • 如何使用 ITextSharp 将图像添加到 PDF?

    我想使用 iTextSharp 5 0 5 但没找到这个版本的教程 我下载了一些以前版本的教程 但出现错误 我只想通过 iTextSharp 将一些图像拼接成 pdf 文件 谁能给我代码吗 编辑 经过一段时间的研究 我终于弄清楚如何添加图像
  • 使用 itextsharp 将 Pdf 文件页面转换为图像

    我想使用 ItextSharp 库转换图像中的 Pdf 页面 知道如何转换图像文件中的每个页面 iText iTextSharp 可以生成和 或修改现有的 PDF 但它们不执行您正在寻找的任何渲染 我建议检查一下鬼脚本 https stac
  • 使用 iTextSharp 提取路径和形状

    iTextSharp 支持创建形状和路径PdfContentByte类 您可以在那里设置颜色并绘制曲线和基本元素 是否有一种机制可以以其他方式执行 我可以通过致电获取内容PdfReader GetPageContent 但我没有找到一个 解
  • 使用 iTextSharp 实现 PDF 中的图像透明度

    我有一个传入的 jpg 文件 我可以将其颜色设置为透明 当我将图像添加到另一个图像时 效果非常好 我正在尝试使用 iTextSharp 将相同的图像添加到 PDF 但我无法使透明度发挥作用 我尝试了两种方法 但都不起作用 第一种方法是在位图
  • 从 URL 添加图像到 PDF?

    我正在尝试将 URL 地址中的图像添加到我的 pdf 中 代码是 Image image Image getInstance http www google com intl en ALL images logos images logo
  • 通过复制另一个 pdf 中的数据来创建新 pdf

    我有一个 pdf 文件 其中包含一些内容 它实际上是一个模板 我已设法从 pdf 中读取内容并根据要求进行更改并将其保存在字符串变量中 现在我必须创建一个新的 pdf 文件 该文件将进行更改 并且初始模板文件不会更改 为了提高透明度 我附上
  • 如何用 Java 从 XML 创建 PDF?

    目前 我正在 Java 中创建一个 XML 文件 并通过使用 XSL XSLT 对其进行转换来将其显示在 JSP 页面中 现在我需要获取该 XML 文件并在 PDF 中显示相同的信息 有没有办法通过使用某种 XSL 文件来做到这一点 我见过
  • iText 将组件摆动到多个页面

    我有一个 jpanel 它有一个相当大的高度 我想将其绘制成 pdf 大约 2 3 页 有时甚至更多 我的问题是 它不会传递到下一页 它只会尝试将所有内容插入第一页 当页面结束时 它不会传递到下一页 我搜索了一下 尝试了我能想到的一切 但一
  • 图像未按顺序添加到 pdf 文档 itextsharp 中(元素顺序错误)

    我现在正在使用 iTextSharp 5 4 5 几个星期 本周 我在文档中的元素顺序方面遇到了一些奇怪的事情 我正在制作一份包含主题和图像 图表 的 pdf 报告 该文档的格式如下 NR 主题 1 的主题标题 主题 1 的图表图像 来自
  • iTextSharp 居中对齐文档对象内的对象

    是否有一种快速而简单的方法可以将文档对象中的对象居中对齐 Without执行任何计算逻辑 即 获取页面宽度 获取内容宽度 除以二等 我在 Document 对象内的 Paragraph 对象中有一个 PdfPTable 对象 我想将段落对象
  • 如何使用 iText 对 pdf 进行数字签名?

    如何使用 iText 签署 pdf 我正在经历这个LINK http itextpdf sourceforge net howtosign html但不了解 my private key pfx 我真的需要数字签名证书吗 请澄清我 提前致谢
  • 如何使用 iText 将 HTML 转换为 PDF [重复]

    这个问题在这里已经有答案了 import java io File import java io FileOutputStream import java io OutputStream import com itextpdf text D
  • itext更改所有超链接的缩放级别以继承现有pdf中的缩放

    我正在使用以下代码将所有超链接的缩放级别更改为继承缩放 但无法改变 可能我在 PdfName DEST 和条件中犯了一些错误 因为第一页的 pdf 中没有 DEST 数组 查看屏幕截图 for int count 0 count lt re
  • 如何使用 iTextSharp 设置 PDF 段落或字体行高?

    如何使用 iTextSharp 更改 PDF 字体或段落的行高 排版中的行距称为行距 如果可以使用行间距 则可以使用 Paragraph Leading 或 Paragraph LeadingMultiplier 看http itextsh
  • 如何使用 iTextSharp 插入 HTML 标记以使用 C# 创建 PDF?

    I am new to iTextSharp API to create PDF I want to Create the a PDF similar shown in following image I have added Table
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over

随机推荐