我正在构建一个Angular测试准备应用程序(使用Laravel 5.1 API)。其中一个要求是允许用户打印成就证书。
客户希望将此人的姓名和凭证插入到文档中(例如,下面突出显示)。以下是他们发送的PDF模板的快照:
我处理PDF查看的方式只是将文件存储在S3上并为其提供指向该文件的链接。
将信息插入到PDF文档中似乎并不重要,而且我还没有找到关于以编程方式允许此操作的大量信息,但是有一些像DocHub这样的工具允许您在查看PDF时进行编辑。
我对学习感兴趣:
答案 0 :(得分:1)
如果您已经在使用亚马逊服务,为什么不使用亚马逊lambda函数与iText7(java)结合使用来生成pdf点播服务呢?
这样,你可以保证pdf是正确的,并且每次都有很好的布局。
生成pdf可以通过以下方式完成:
我认为对于您的用例,选项1或2是最可持续的。
答案 1 :(得分:1)
使用PDF作为编辑格式通常是一个糟糕的选择。如果您有一个包含固定字段的表单,那么很容易。使用交互式表单创建PDF模板。在这种形式中,基于AcroForm技术,您将定义具有固定坐标和固定大小的字段。然后,您可以向这些字段添加内容。
这种方法的一个主要缺点是缺乏灵活性。您是否注意到我在前一段中使用了“固定”一词三次?如果文本不符合预定义字段,那你就不走运了。如果该字段尺寸过大,您将获得足够的空白区域。如果您可以预测数据的样子,那么这种方法很有用。典型的用例是票证或凭证。例如:空表单是一个非常好的页面,只有几个字段,自动化系统可以放置名称,日期,时间和座位号。
这不是您在屏幕截图中显示的示例的最佳方法。每行文本,每个单词,每个字符的位置都是事先知道的。如果要用长字替换短字(反之亦然),则需要重新计算所有这些位置(每行,整个页面,可能是整个文档)。那是疯了。只有设计技能很差的人才会想出这样的想法。
更好的想法是将模板存储为HTML。请参阅iText的pdfHTML教程的chapter 5,其中我们有这个HTML片段:
<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?