2011-08-11 21 views
1

我的一位朋友在一家报社工作,周一问我这个问题,我无法确认是否有可能。用PHP合并两个半页PDF文档

我知道可以使用PHP合并2个PDF(因为我已经看到很多其他问题已经回答),但是我不确定的是,如果我可以合并一个半页PDF以填充一个空间另一个PDF。

想象一下: 我有PDF1:半页PDF,然后我有一个3页PDF:Pdf2。 在PDF2的第一页中,我有一个空白空间以适合PDF1。

我可以这样做吗?怎么样?

回答

0

我不能给你具体的源代码,但我可以解释如何在非常低的水平上做到这一点。此外,您要找的内容与出版行业中所谓的拼版相似。

您从合并的方式开始,这意味着从另一个文档拉入页面。您必须递归地引入页面的所有依赖关系。但要小心避免PDF中存在的无限循环,因此您必须跟踪访问的对象。不要使用递归函数,因为你的堆栈很容易溢出,PDF引用可能非常深。你应该在堆上实现遍历递归(Depth First Search很好)。

在PDF上打印PDF的关键是将源页面对象转换为XObject表单(不要与AcroForms或可填写的表单域混合)。一个x对象形式非常类似于Page对象,但有以下例外:

  • /Type /Page变得/Type /XObject /Subtype /Form
  • 页面MediaBoxCropBox一起成为/BBox的形式。但要小心,它们都可以通过页面树继承,因此您必须查找继承的属性。
  • 页面Rotate(也可继承)变成Matrix,它是一个转换(旋转)矩阵,而不是一个角度。
  • 页面的Resources,GroupMetadata可以保持不变并添加到表单对象。
  • 页面Contents流必须转移到窗体。但是,页面Contents是一个外部对象,可能是一个数组,这意味着您需要合并这些部分。 XObject表单是一个流对象。
  • 所有其他属性都很棘手,如果您不确定,您可能会忽略它们。

完成此操作后,您所要做的就是在新页面上绘制XObject表单。您必须为XObject生成一个唯一的名称,并将其添加到页面的Resources。绘画本身是一系列cmDo操作员,就像绘制图像一样。如果您需要剪裁原始内容,则还需要在Do之前设置剪切路径。

不用说,这远非微不足道,而且还有很多缺陷。我已经实现了这一点,我可以告诉你它确实有效,但它似乎比看起来更难。您必须拥有一个非常好的低级PDF库,并且对PDF规范有非常透彻的理解。

我还没有讨论其他一些细节,如色彩管理(如果你画DeviceRGB上管理CMYK),PDF/A,PDF/X,转移注释和表单域等

如果这超出了你,你应该寻找一个开源的拼版库,因为它几乎是一样的。拼版意味着在一张白纸上放置两页或更多页,以打印书或传单。我也有一个商业解决方案。