2011-08-11 7 views
1

私の友人は新聞に掲載しており、月曜日にこれを頼んで、可能かどうかを確認できませんでした。PHPで2つの半ページPDF文書を結合する

PHPを使用して2つのPDFをマージすることは可能ですが(他にも多くの質問がありましたが)、わかりませんが、半ページのPDFをマージして別のPDF

は、次のことを想像してみて: 私はPDF1を持っている:半ページのPDFを、そして私は、3ページのPDFを持っている:PDF2を。 PDF2の最初のページには、PDF1に収まる空きスペースがあります。

これはできますか?どうやって?

答えて

0

私はあなたに特定のソースコードを与えることはできませんが、私は非常に低いレベルでそれを行う方法を説明することができます。また、あなたが探しているものは、出版業界でのインポジショニングと呼ばれるものに似ています。

マージと同じ方法から始めます。これは、別のドキュメントからページを引き出すことを意味します。ページのすべての依存関係を再帰的に持ち込む必要があります。しかし、PDFに存在する無限ループを避けるために注意してください。したがって、訪問したオブジェクトを追跡する必要があります。あなたのスタックは簡単にオーバーフローするので、再帰関数を使用しないでください、PDF参照は非常に深いことができます。ヒープ上でトラバーサル再帰を実装する必要があります(Depth First Searchは問題ありません)。

PDF上のPDFをスタンピングするためのキーは、ソースページオブジェクトをXObjectフォームに変換することです(AcroFormsまたは入力可能なフォームフィールドと混在しないようにする)。 XObjectフォームは、次の例外を除いて、Pageオブジェクトに非常によく似ています

  • /Type /Page/Type /XObject /Subtype /Formになります。
  • ページMediaBoxCropBoxが合わせて/BBoxとなります。しかし、両方ともページツリーを介して継承できるので、継承された属性を探す必要があります。
  • ページRotate(継承も可能)は、角度ではなく、変換(回転)マトリックスのMatrixになります。
  • ページのResources,およびMetadataは変更されずにフォームオブジェクトに追加できます。
  • ページContentsのストリームをフォームに転送する必要があります。ただし、ページContentsは外部オブジェクトであり、配列の場合もあります。つまり、それらを結合する必要があります。 XObjectフォームはストリームオブジェクトです。
  • 他のすべての属性は扱いにくいので、わからない場合は無視してください。

これが完了したら、新しいページにXObjectフォームをペイントするだけで済みます。 XObjectの一意の名前を生成し、ページのResourcesに追加する必要があります。ペイント自体は、画像をペイントするのと同じように、cmDoの一連の演算子です。元のコンテンツをトリミングする必要がある場合は、クリッピングパスをDoより前に設定する必要があります。

言うまでもなく、これは些細なものではなく、落とし穴がたくさんあります。私はこれを実装して、それが本当にうまくいくと言うことができますが、見た目よりも難しいです。あなたは非常に良い低レベルのPDFライブラリと、PDF仕様の非常に徹底的な理解が必要です。

私は、このような色管理などその他の詳細のいくつかを説明していない(何が管理CMYKにDeviceRGBでペイント場合)など、PDF/A、PDF/X、転送、注釈とフォームフィールドを、

これがあなたを超えているなら、あなたはオープンソースのインポジショニングライブラリを探しているはずです。インポジショニングとは、本やフライヤーを印刷する目的で、2枚以上のページを空白の用紙に置くことを意味します。私は商業的な解決策も持っています。

関連する問題