【问题标题】:Merge Two Half-Page PDF Documents with PHP用 PHP 合并两个半页 PDF 文档
【发布时间】:2011-08-11 15:20:56
【问题描述】:

我的一个朋友在一家报纸上工作,并在周一问我这个问题,我无法确认这是否可能。

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

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

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

【问题讨论】:

    标签: php pdf merge


    【解决方案1】:

    我不能给你具体的源代码,但我可以在非常低的层次上解释如何做到这一点。此外,您要查找的内容类似于出版业中所谓的强制执行。

    您开始的方式与合并相同,这意味着从另一个文档中拉入页面。您必须递归地引入页面的所有依赖项。但要注意避免无限循环,这确实存在于 PDF 中,因此您必须跟踪访问过的对象。不要使用递归函数,因为你的堆栈很容易溢出,PDF 引用可能很深。您应该在堆上实现遍历递归(深度优先搜索很好)。

    在 PDF 上标记 PDF 的关键是将源 Page 对象转换为 XObject 表单(不要与 AcroForms 或可填写的表单字段混合)。 XObject 表单与 Page 对象非常相似,但有以下例外:

    • /Type /Page 变为 /Type /XObject /Subtype /Form
    • 页面MediaBoxCropBox 在表单中一起变成/BBox。但要注意,两者都可以通过页树继承,所以一定要寻找继承的属性。
    • 页面Rotate(也可继承)变为Matrix,这是一个变换(旋转)矩阵,而不是一个角度。
    • 页面的ResourcesGroupMetadata 可以原样引入并添加到表单对象中。
    • 页面Contents 流必须传输到表单。但是,页面Contents 是一个外部对象,可能是一个数组,这意味着您需要合并这些片段。 XObject 形式是一个流对象。
    • 所有其他属性都很棘手,如果不确定,可以忽略它们。

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

    不用说,这绝非易事,而且有很多陷阱。我已经实现了这个,我可以告诉你它确实有效,但它比看起来更难。您必须有一个非常好的低级 PDF 库,并且对 PDF 规范有非常透彻的了解。

    我还没有讨论其他一些细节,例如颜色管理(如果在托管 CMYK 上绘制 DeviceRGB 会怎样)、PDF/A、PDF/X、转移注释和表单域等。

    如果这超出了您的能力范围,您应该寻找一个开源的拼版库,因为它的功能几乎相同。拼版是指在一张空白纸上放置两页或多页,以印刷书籍或传单。我也有商业解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多