第7章:关于pdfHTML的常见问题

pdfHTML常见问题解答:HTML转PDF、Base64图像与交互式表单
本文详细解答了关于pdfHTML的常见问题,包括能否将HTML表单转换为PDF、直接从URL生成PDF、处理Base64图像,以及HTML是否必须是有效XML等。同时,讨论了在将HTML转换为PDF时,如何处理交互式表单、页面尺寸、内联图像以及不完整的HTML等问题。

多年来,我们收到了许多关于将PDF转换为HTML的问题。

在本章中,我们将回答那些被问得最多的问题。

  • 我可以将HTML表单转换为PDF吗?

  • 我可以从URL而不是从磁盘上的文件生成PDF吗?

  • pdfHTML可以将Base64图像渲染为PDF吗?

  • 我的HTML必须是有效的XML吗?

  • 我们需要一个浏览器引擎来将HTML+CSS呈现为PDF吗?

  • HTML中的测量系统与PDF中的测量系统有何关系?

  • 如何将ASP或JSP页面转换为PDF?

  • 如何将包含阿拉伯语/希伯来语字符的HTML转换为PDF?

  • 在将HTML转换为PDF时,如何将特定的子字符串加粗?

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

  • 如何将某些HTML实体(如箭头)呈现为PDF?

  • 由于许可限制,为什么我不能嵌入字体?

  • 为什么我的PDF缺少几个字符?

我可以将HTML表单转换为PDF吗?

将 HTML 表单转换为 PDF 文档的支持有限。如果您有一个HTML文件,其中包含要转换为PDF的文本字段,您还必须指出是否希望生成的PDF为交互式表单。

让我们看看form.html文件:

一个简单的HTML表单

如果我们想将此HTML表单转换为PDF表单(基于AcroForm技术),我们需要在ConverterProperty(Java/.NET)中明确提及这一点。请参阅 C07E10_HelloAcroForm.Java 示例:

public void createPdf(String src, String dest) throws IOException {
    ConverterProperties properties = new ConverterProperties();
    properties.setCreateAcroForm(true);
    HtmlConverter.convertToPdf(new File(src), new File(dest), properties);
}

由于行 properties.setCreateAcroForm(true)/properties.setCreateAcroForm(true),创建了一个交互式PDF表单。我们可以手动更改蓝色背景字段中的文本:

一个简单的PDF表单

如果我们不更改 ConverterProperty(Java/.NET),例如 C07E11_HelloformFlatted 示例,我们将得到一个“扁平”PDF:

一个扁平的表单

字段的内容在那里,但文件中没有交互。在PDF查看器中无法更改曾经是 HTML 字段的内容。

使用交互式 PDF 表单进行手动数据输入有些过时。当需要手动填写表单时,通常首选 HTML 5。

我可以从URL而不是从磁盘上的文件生成PDF吗?

您可以从任何HTML输入流生成PDF。在大多数示例中,我们使用了 FileOutputStream,但在第4章中,我们创建了仅以 byte[] 形式存在于内存中的报告。在这种情况下,我们使用了 ByteArrayInputStream。我们还可以使用从URL对象创建的InputStream。

假设我们使用这个URL:

 

public static final String ADDRESS = "https://stackoverflow.com/help/on-topic";

如果在浏览器中打开此URL,我们会看到以下页面:

浏览器中的IMDB页面

在C07E04CreateFromURL示例中,我们使用ADDRESS创建Java URL对象:

new C07E04_CreateFromURL().createPdf(new URL(ADDRESS), DEST);

我们使用下面的 createPdf() 方法:


public void createPdf(URL url, String dest) throws IOException {HtmlConverter.convertToPdf(url.openStream(), new FileOutputStream(dest));}

openStream() 方法为我们提供了一个 InputStream,iText将使用它来获取HTML——显然,这只适用于可以访问 Internet 的机器。

对于包含大量图片的页面,iText可能需要一段时间才能下载所有资源,但此 Stack Overflow 页面中的常见FAQ  页面应该加载的比较快,结果如下所示:

 

IMDB页面以PDF格式呈现为A4页面

可能A4页面不是网页的理想页面大小,因为缺少完整的边栏。让我们修改下这个例子,并介绍一个媒体查询。

C07E05_CreateFromURL2.java 示例中的 createPdf() 方法如下所示:

public void createPdf(URL url, String dest) throws IOException {
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdf = new PdfDocument(writer);
    PageSize pageSize = new PageSize(850, 1700);
    pdf.setDefaultPageSize(pageSize);
    ConverterProperties properties = new ConverterProperties();
    MediaDeviceDescription mediaDeviceDescription =
        new MediaDeviceDescription(MediaType.SCREEN);
    mediaDeviceDescription.setWidth(pageSize.getWidth());
    properties.setMediaDeviceDescription(mediaDeviceDescription);
    HtmlConverter.convertToPdf(url.openStream(), pdf, properties);
}

我们使用 850×1700 个用户单元的自定义页面大小,并使用第2章中所述的屏幕媒体类型。现在,内容适合页面,我们得到了更好的结果:

当然,还有一些不完善之处。例如:标题栏中的项目显示为列表,而不是菜单栏中的项目,但我们计划在pdfHTML的未来版本中解决这些问题。

我们也可以使用 PRINT  代替 SCREEN 媒体类型。见 C07E06_CreateFromURL3 示例:

public void createPdf(URL url, String dest) throws IOException {ConverterProperties properties = new ConverterProperties();MediaDeviceDescription mediaDeviceDescription =new MediaDeviceDescription(MediaType.PRINT);properties.setMediaDeviceDescription(mediaDeviceDescription);HtmlConverter.convertToPdf(url.openStream(), new FileOutputStream(dest), properties);}

 由于 Stack Overflow 使用的 print.css ,我们现在有两个基本页面,其中故意省略了侧边栏。也许这正是我们想要的:

IMDB页面以PDF格式呈现为A4页面

重要提示:pdfHTML 是一项正在进行的工作。如果您尝试从浏览器将网页打印到纸页,您会注意到结果并不总是像您希望的那样好。当使用 pdfHTML 作为URL2PDF 工具时,情况也是如此。大多数HTML页面都不打算打印,但有了 pdfHTML,我们正在不断努力改进转换过程。

pdfHTML 可以将 Base64 图像渲染为 PDF 吗?

是的,iText 支持外部图像,如前几章中的不同示例所示,但它也支持作为Base64字符串存储的内联图像。

例如,请参见 C07E03_Base64Image.java 示例。createPdf()/createPdf() 方法中没有任何特殊之处。

public void createPdf(String html, String dest) throws IOException {HtmlConverter.convertToPdf(html, new FileOutputStream(dest));}

这个示例唯一特别的地方是 base64.html HTML文件(请注意,base64编码的图像被截断以适合此页面):

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>Test</h1>
        <p>Hello World</p>
        <img alt="Embedded Image" src="data:image/png;base64,iVBORw0...ErkJggg==" />
    </body>
</html>

结果与我们在第一章中使用外部图像时得到的结果相同。

 带有base64编码图像的文件的源代码、浏览器视图和生成的PDF

我的HTML必须是有效的XML吗?

如果您仍在使用 iText 5 和 XML Worker,则必须提供 XHTML。例如:HTML 中不允许有一个<br>;您需要有一个<br/>。所有标记都需要关闭。标记的嵌套需要正确完成。为了解决HTML语法不完整的问题,我们建议在使用XML Worker将HTML转换为PDF之前使用jsoup整理HTML。

这对于pdfHTML不再是必要的。我们已经将jsoup集成到pdfHTML插件中,因此您不需要单独调用它。所有html在转换为PDF之前都会被清除。 例如 incomplete.html HTML文件

<html>
<head><title>Test incomplete HTML</title></head>
<h1>Test
<p>Hello World
<p>Hello Universe
<br>
<img src="img/logo.png" alt="iText logo">

它没有任何<body>标记,<h1>、<p>、<br>和<img>标记从不闭合。这是一个非常不完整的HTML文件,但浏览器无论如何都会呈现它,pdfHTML也是如此。

在浏览器中呈现为PDF的不完整HTML

您可以通过运行 C07E07_UncompleteHTML 示例来尝试这一点。

我们需要一个浏览器引擎来将HTML+CSS呈现为PDF吗?

不,pdfHTML负责解析HTML和CSS,并将它们映射到iText对象和样式。然后,iText引擎根据这些对象和样式渲染PDF。

然而,pdfHTML目前不支持SVG,也不评估JavaScript。对SVG的支持已在开发路线图上,您可以通过使用浏览器引擎预处理HTML+CSS+JS来解决JavaScript问题。这种浏览器引擎的例子有WebKit(Chrome、Safari)和Gecko(Firefox)。这些可以解释JavaScript,并提供可以由pdfHTML呈现的HTML。

注:SVG支持于2018年9月添加到 pdfHTML 2.1.0 中,并在后续版本中进行了更新和改进。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶格点阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值