2017-08-27 19 views
0

我正在构建一个Angular测试准备应用程序(使用Laravel 5.1 API)。其中一项要求是允许用户打印成绩证书。将自定义数据内插到PDF上

客户希望将该人的姓名和凭证插入到文档中(例如,在下面突出显示)。这里是他们发来的PDF模板的快照:

enter image description here

我处理PDF查看的方法就是通过存储在S3上的文件,并给他们一个链接到该文件。

将信息内插到PDF文档中似乎并不重要,我还没有找到许多关于以编程方式允许的信息,但有些工具可用于查看PDF时进行编辑,例如DocHub。

我感兴趣的学习:

  • 是这样做的编程小事?
  • 有没有我不知道的第三方工具?
  • 我甚至可以将这些信息一起发送到S3链接插入到第一位?
+0

看看这里的一些答案开始:https://stackoverflow.com/questions/34049956/generate-pdf-from-html-using-pdfmake-in-angularjs –

+0

PDF是处理链中的最终格式。它特别不是为了容易改变内容而设计的,这可能要求现有的内容被重新流转。您可能会考虑更改模板以包含AcroForm表单字段并填充它们,但这会根据插入的名称留下更多或更少的较大间隔。或者,您可以考虑将模板重新编码为其他一些非最终格式,例如html,以该格式插入值,然后转换为pdf。 – mkl

回答

1

使用PDF作为编辑格式通常是一个不错的选择。如果你有一个固定字段的表单,那么很容易。使用交互式表单创建PDF模板。在这种形式中,基于AcroForm技术,您将定义具有固定坐标和固定大小的字段。然后,您可以将内容添加到这些字段。

这种方法的一个主要缺点是缺乏灵活性。你有没有注意到我在前一段中使用过三次“固定”这个词?如果文字不符合预定义的字段,那么您运气不好。如果该字段超尺寸,则会以大量空白结束。如果您可以预测数据会是什么样,这种方法非常棒。典型的用例是票证或优惠券。例如:空白表格是一个非常好的页面,只有几个字段,自动化系统可以输入名称,日期,时间和座位号。

这不是您在屏幕截图中显示的示例的最佳方法。预先知道每一行文本,每一个字,每个字符的位置。如果您想用一个长词替换一个短词(反之亦然),那么需要重新计算所有这些(每行,整个页面,可能是整个文档)的位置。这是疯狂。只有设计能力很差的人才会提出这样的想法。

一个比较好的主意是将模板存储为HTML。见iText的的pdfHTML教程,在那里我们有这段HT​​ML代码的实例chapter 5

<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,因为<name>标签和标签<date>中不存在的HTML。所有HTML处理器(浏览器以及pdfHTML)忽略这些标签和对待自己的内容,如同标签是<span>

enter image description here

它没有多大意义,这样的标签的纯背景HTML,但在pdfHTML的情况下它确实很有意义。随着pdfHTMLL,您可以配置自定义标签,并有一个结果,看起来像下面显示的PDF文件:

enter image description here

看看在“李四”的文档,并将其与“布鲁诺Lowagie”的文件比较。名字“John Doe”比我的名字短得多,因此在第一行中有更多的词汇。文本流动得很好(我们也可以选择证明双方的文字是合理的)。这种“流动”是无法用你的方法实现的,因为你永远不会得到一个PDF模板来很好地回流。

好的,我明白了,你可能会说,10但是实际方面呢?你谈论Java/.Net库,但我正在使用Laravel和Angular.js。首先,让我告诉你,我认为你不会为Laravel或Angular.js找到任何好的PDF工具,因为PDF的性质和那些开发环境(在我看来,这些技术并不能很好地发挥作用一起)。不管我的意见如何,这不应该成为你的问题,因为你在亚马逊环境中工作。 AWS支持Java,并且获得pdfHTML所需的Java代码很少。我为pdfHTML教程编写的大部分代码示例都少于15行。那么为什么不尝试Java和PDFHTML?

1

如果您已经在使用Amazon服务,那么为什么不使用amazon lambda函数与iText7(java)结合使用来生成PDF需求?

这样,你保证pdf是正确的,并且每次都有很好的布局。

生成的PDF可以这样做:

  • 转换HTML,
  • 编程方式创建整个文档,
  • 充填和压扁的XFA表单。

我认为对于您的用例,选项1或2是最可持续的。