用PHP合并两个半页PDF文档
我的一个朋友在一家报纸工作,他在周一问我这个问题,我无法确认这是否可行 我知道可以使用PHP合并2个PDF(正如我看到许多其他问题已经回答的那样),但我不确定的是,我是否可以合并半页PDF以填充另一个PDF中的空间 想象一下: 我有一个PDF1:半页的PDF,然后我有一个3页的PDF:Pdf2。 在PDF2的第一页,我有一个空的空间来容纳PDF1用PHP合并两个半页PDF文档,php,pdf,merge,Php,Pdf,Merge,我的一个朋友在一家报纸工作,他在周一问我这个问题,我无法确认这是否可行 我知道可以使用PHP合并2个PDF(正如我看到许多其他问题已经回答的那样),但我不确定的是,我是否可以合并半页PDF以填充另一个PDF中的空间 想象一下: 我有一个PDF1:半页的PDF,然后我有一个3页的PDF:Pdf2。 在PDF2的第一页,我有一个空的空间来容纳PDF1 我能做这个吗?如何做?我不能给出具体的源代码,但我可以在非常低的级别上解释如何做。此外,你所寻找的与出版业中所谓的强加类似 开始时的方式与合并相同,这
我能做这个吗?如何做?我不能给出具体的源代码,但我可以在非常低的级别上解释如何做。此外,你所寻找的与出版业中所谓的强加类似 开始时的方式与合并相同,这意味着从另一个文档中提取页面。必须递归地引入页面的所有依赖项。但要注意避免无限循环,因为PDF中确实存在无限循环,所以必须跟踪访问的对象。不要使用递归函数,因为堆栈很容易溢出,PDF引用可能很深。您应该在堆上实现遍历递归(深度优先搜索很好) 在PDF上标记PDF的关键是将源页面对象转换为XObject表单(不要与AcroForms或可填充表单字段混合)。XObject表单与页面对象非常相似,但有以下例外:
变为/Type/Page
/Type/XObject/Subtype/Form
- 页面
和MediaBox
一起成为表单中的CropBox
。但是要小心,它们都可以通过页面树继承,因此必须查找继承的属性/BBox
- 页面
(也可继承)变为Rotate
,它是一个变换(旋转)矩阵,而不是一个角度Matrix
- 页面的
、资源
和组
可以原封不动地引入并添加到表单对象中元数据
- 页面
流必须传输到表单。但是,页面内容
是一个外部对象,可能是一个数组,这意味着您需要合并这些片段。XObject表单是一个流对象内容
- 所有其他属性都很棘手,如果不确定,您可能希望忽略它们
资源中。绘制本身是一系列的cm
和Do
操作符,就像绘制图像一样。如果需要裁剪原始内容,则还需要在Do
之前设置剪辑路径
不用说,这绝非小事,而且还有很多陷阱。我已经实现了这一点,我可以告诉你它确实有效,但它比看起来更难。你必须有一个非常好的低级PDF库,并且对PDF规范有非常透彻的理解
我没有讨论其他一些细节,例如颜色管理(如果在托管CMYK上绘制DeviceRGB会怎么样)、PDF/A、PDF/X、传输注释和表单字段等
如果这超出了您的能力范围,那么您应该寻找一个开源的强制执行库,因为它的功能基本相同。强加是指在一张空白纸上放置两页或两页以上的内容,目的是印刷一本书或一份传单。我也有一个商业解决方案