使用 PDF 作为编辑格式通常是一个糟糕的选择。如果您有一个带有固定字段的表单,那么这很容易。使用交互式表单创建 PDF 模板。在此表单中,基于 AcroForm 技术,您将定义具有固定坐标和固定大小的字段。然后,您可以向这些字段添加内容。
这种方法的一个主要缺点是缺乏灵活性。您是否注意到我在上一段中使用了三遍“固定”一词?如果文本不适合预定义的字段,那么您就不走运了。如果该字段尺寸过大,您最终会得到大量空白。如果您可以预测数据会是什么样子,那么这种方法非常棒。一个典型的用例是一张票或一张代金券。例如:空表单是一个非常好的页面,只有几个字段,自动化系统可以在其中输入姓名、日期、时间和座位号。
这不是您在屏幕截图中显示的示例的最佳方法。每一行文本、每个单词、每个字符的位置都是预先知道的。如果您想用一个长词替换一个短词(反之亦然),则需要重新计算所有这些位置(每一行的、整个页面的、可能是整个文档的)。那是疯狂。只有设计能力很差的人才会想出这样的想法。
更好的办法是将模板存储为 HTML。例如,请参阅 iText 的 pdfHTML 教程的 chapter 5,其中我们有 HTML 的 sn-p:
<html>
<head>
<title>Invitation to SXSW 2018</title>
</head>
<body>
<u><b>Re: Invitation</b></u>
<br>
<p>Dear <name>SXSW visitor</name>,
we hope you had a great SXSW film festival experience last year.
And we would like to invite you to the next edition of SXSW Film
that takes place from March 9 until March 17, 2018.</p>
<p>Sincerely,<br>
The SXSW crew<br>
<date>August 4, 2017</date></p>
</body>
</html>
实际上,它并不是真正的 HTML,因为 HTML 中不存在 <name> 标签和 <date> 标签。所有 HTML 处理器(浏览器以及 pdfHTML)都会忽略这些标签并将其内容视为标签是 <span>:
在纯 HTML 的上下文中使用这样的标签并没有多大意义,但在 pdfHTML 的情况下却很有意义。使用 pdfHTMLL,您可以配置自定义标签,并获得如下所示的 PDF:
查看“John Doe”的文档并将其与“Bruno Lowagie”的文档进行比较。 “John Doe”这个名字比我的名字短得多,因此第一行有更多的词。文本很好地流动(我们也可以选择在两边证明文本的合理性)。这种“流程”是不可能用您的方法实现的,因为您永远无法让 PDF 模板很好地重排。
好的,我明白了,你可能会说,但是实际方面呢?您谈论的是 Java / .Net 库,但我正在使用 Laravel 和 Angular.js。 首先,让我告诉您,我认为您不会为 Laravel 或 Angular 找到任何好的 PDF 工具。 js,因为 PDF 的性质和那些开发环境(在我看来,这些技术不能很好地结合在一起)。不管我怎么看,这对你来说应该不是什么大问题,因为你在亚马逊环境中工作。 AWS 支持 Java,使 pdfHTML 工作所需的 Java 代码非常少。我为 pdfHTML 教程编写的大多数代码示例都少于 15 行。那么为什么不试试 Java 和 pdfHTML?