PHP 中的多页发票/文档


Multipage invoice/document in PHP

TL;DR:我在PHP生成PDF时遇到问题,PDF的总长度超过1页。


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

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

  • 发票有效所需的内容
  • 计费产品/其他信息
  • 供应商/客户签名和印章或其他数据的地方

所有页面都必须包含页眉和页脚(公司徽标)和页脚(页 # 的 # - 发票/文档 ID - 日期和时间 - 办公室 ID - 打印机 ID、分配的人员,以及文档正文周围的边框(在页眉下,页脚上方)。

只要文档大小不大于,一切都很好

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

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

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

提前谢谢你!

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

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

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

域名注册(2年)
example.com

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

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

使用 TCPDF。它具有非常方便的SetY() / GetY()对功能,可让您知道自己在页面上的位置。您可以使用它来了解何时执行分页符。

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

编辑

从下面的讨论中,这里有一些细节: 为避免叠加,您有 2 种可能性

  1. 使用getStringHeight()并计算
  2. 使用事务

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

第二个版本更简单:在TCPDF中,您可以使用事务模拟到数据库:启动事务,绘制,如果结果不符合您的喜好,则回滚,否则提交。我们发现这是一个相当大的性能问题,最终决定反对长文本报告,但 2 页的发票是一个非常不同的野兽。