我收到了一个 HTML 文件,并希望将其转换为内存中 PDF 文件。在转换过程中,我不想为此使用任何外部位置。我想要的只是将其保留在内存中。
到目前为止,我已经尝试了一些Java库进行转换,但它们总是在某个位置创建一个临时文件,然后从中读取/写入。我不想在转换期间进行任何 I/O 操作。
P粉3087835852024-02-27 10:09:20
HTMLWorker 类多年前已被弃用。 HTMLWorker 的目标是将小而简单的 HTML 片段转换为 iText 对象。它从来没有打算将完整的 HTML 页面转换为 PDF,但这就是许多开发人员尝试使用它的方式。这导致了很多挫败感,因为 HTMLWorker 不支持所有 HTML 标签,不解析 CSS 文件等等。为了避免这种挫败感,HTMLWorker 已从最新版本的 iText 中删除。
2011 年,iText Group 发布了 XML Worker 作为通用 XML 到 PDF 工具,构建于 iText 5 之上。默认实现将 XHTML(数据)和 CSS(样式)转换为 PDF,映射 HTML 标签,例如
,
, 和
to iText 5 objects such as Paragraph, Image, 和 ListItem. We don't know of any implementations that used XML Worker for any other XML formats, but many developers used XML Worker in combination with jsoup as an HTML2PDF converter.
XML Worker wasn't a URL2PDF tool though. XML Worker expected predictable HTML created for the sole purpose of converting that HTML to PDF. A common use case was the creation of invoices. Rather than programming the design of an invoice in Java or C#, developers chose to create a simple HTML template defining the structure of the document, 和 some CSS defining the styles. They then populated the HTML with data, 和 used XML Worker to create the invoices as PDF documents, throwing away the original HTML. We'll take a closer look at this use case in chapter 4, converting XML to HTML in memory using XSLT, then converting that HTML to PDF using the pdfHTML add-on.
iText 5 最初创建时,它被设计为一种尽可能快地生成 PDF 的工具,一旦页面完成就将其刷新到 OutputStream。 2000 年 iText 首次发布时,一些非常有意义的设计选择在 16 年后仍然出现在 iText 5 中。不幸的是,其中一些选择使得将 XML Worker 的功能扩展至许多开发人员期望的质量水平变得非常困难(如果不是不可能的话)。如果我们真的想创建一个出色的 HTML 到 PDF 转换器,我们就必须从头开始重写 iText。我们做到了。
2016 年,我们发布了 iText 7,这是 iText 的全新版本,不再与以前的版本兼容,但在创建时考虑了 pdfHTML。新的渲染器框架花费了大量的工作。当使用 iText 7 创建文档时,会构建渲染器及其子渲染器树。布局是通过遍历该树创建的,这种方法更适合处理 HTML 到 PDF 的转换。 iText 对象经过完全重新设计,以更好地匹配 HTML 标签并允许“CSS 方式”设置样式。
例如:在 iText 5 中,您有一个 PdfPTable 和一个 PdfPCell 对象来创建表格及其单元格。如果您希望每个单元格包含与默认字体不同的文本,则需要为每个单独单元格的内容设置该字体。在 iText 7 中,您有一个 Table 和 Cell 对象,并且当您为整个表格设置不同的字体时,该字体将继承为每个单元格的默认字体。这是架构设计方面的重大进步,特别是如果目标是将 HTML 转换为 PDF。
但是我们不要沉迷于过去,让我们看看 pdfHTML 能为我们做什么。在第一章中,我们将了解convertToPdf()/ConvertToPdf()方法的不同变体,并且我们将发现转换器是如何配置的。