PHP中的多页发票/文档

时间:2012-06-02 23:18:22

标签: php pdf invoice

TL; DR:我在PHP生成PDF的时间超过1页时出现问题。


再次问好。我的目标是创建一个脚本,基本上可以获取所有重要数据,并创建A4格式的PDF发票/文档,用于打印/邮寄/存档。只要文档没有溢出,生成PDF文档就可以了。

我希望发票页面用边框标出,它应该包含:

  • 发票有效所需的所需资料
  • 结算产品/其他信息
  • 供应商/客户签名和印章或其他数据的地方

所有页面都必须包含页眉和页脚(公司徽标)和页脚(#页面# - 发票/文档ID - 日期和时间 - 办公室ID - 打印机ID,指定人员,无论有人可以询问),以及作为文档正文周围的边框(在页眉下方,页脚下方)。

只要文档大小不大于

一切都很好

$pageSize-$pageMargins-$header-$footer-$invoiceDataBlock-$signaturesBlock

基本上就像实际发票项目的10厘米一样。如果文档较大,我实际上是使用电子表格编辑器手动为发票创建附件。

问题是:我该怎么做才能创建一个多页PDF文档,没有问题,比如覆盖页眉/页脚的发票项目?我需要知道何时继续下一页。我怎么知道这个?完成此任务的最佳方法是什么?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

我已经使用FPDF和TCPDF生成多页发票文件。它们的工作方式大致相同。 (我从FPDF开始,然后在需要包含Unicode字符时切换到TCPDF,FPDF当时不支持。)

正如Eugen建议的那样,与使用FPDF或TCPDF中内置的函数相比,您可以更轻松地手动滚动页眉和页脚。

我确保不覆盖页脚的策略只是要小心发票上的数据。添加新SKU时,我会测试长名称以确保它们适合发票PDF中的字段。对于必须可变长度的项目,我将未知内容放在自己的行中以减少可能的影响:

  

域名注册(2年)
  ↳ example.com

当我生成发票的每一页时,我会跟踪我使用了多少行。我知道我可以安全地放20行物品,我知道我的最大单项是2行,然后当我到20行时,我开始新的页面。 15项意味着1页。 25项意味着两页。项目计数器上升,每次我达到20行限制时,它会生成下一页并重置页面项目计数器。

请注意,我在此答案中不包含任何代码,因为您的问题中未包含任何代码。如果你想帮助实施,我怀疑这将是另一个问题的理由。 : - )

答案 1 :(得分:1)

使用TCPDF。它有一对非常方便的SetY() / GetY()函数,可以让你知道你在页面的哪个位置。您可以使用它来了解何时进行分页。

提示:不要使用页眉/页脚功能 - 它们很笨重。绘制自己的页眉/页脚。

修改

如下面的讨论,这里有一些细节:为避免重叠,你有两种可能性

  1. 使用getStringHeight()并计算
  2. 使用交易
  3. 第一个版本从事实中得出的理由是,在生成PDF时通常使用的所有对象中,文本流是唯一的,您无法事先告诉它将使用的高度。 getStringHeight()为您提供了足够好的估算值,因此您在添加元素之前就知道它是否适合页面(在页脚的底部留下足够的空间)。所以基本上你扩展你的绘图循环来计算每个元素的高度并测试,如果你需要先开始一个新的页面。这也允许某种类型的保持,例如,如果节标题之后的剩余空格太低,则在开始新页面之前,将节标题和节主体保持在一起。

    第二个版本更简单:在TCPDF中,您可以使用事务同步到数据库:启动事务,绘制,如果结果不是您喜欢的回滚,则提交。我们发现这是一个非常糟糕的表现,最终决定反对它的长文本报告,但2页的发票是一个非常不同的野兽。