私はあなたに特定のソースコードを与えることはできませんが、私は非常に低いレベルでそれを行う方法を説明することができます。また、あなたが探しているものは、出版業界でのインポジショニングと呼ばれるものに似ています。
マージと同じ方法から始めます。これは、別のドキュメントからページを引き出すことを意味します。ページのすべての依存関係を再帰的に持ち込む必要があります。しかし、PDFに存在する無限ループを避けるために注意してください。したがって、訪問したオブジェクトを追跡する必要があります。あなたのスタックは簡単にオーバーフローするので、再帰関数を使用しないでください、PDF参照は非常に深いことができます。ヒープ上でトラバーサル再帰を実装する必要があります(Depth First Searchは問題ありません)。
PDF上のPDFをスタンピングするためのキーは、ソースページオブジェクトをXObjectフォームに変換することです(AcroFormsまたは入力可能なフォームフィールドと混在しないようにする)。 XObjectフォームは、次の例外を除いて、Pageオブジェクトに非常によく似ています
/Type /Page
は/Type /XObject /Subtype /Form
になります。
- ページ
MediaBox
とCropBox
が合わせて/BBox
となります。しかし、両方ともページツリーを介して継承できるので、継承された属性を探す必要があります。
- ページ
Rotate
(継承も可能)は、角度ではなく、変換(回転)マトリックスのMatrix
になります。
- ページの
Resources
,およびMetadata
は変更されずにフォームオブジェクトに追加できます。
- ページ
Contents
のストリームをフォームに転送する必要があります。ただし、ページContents
は外部オブジェクトであり、配列の場合もあります。つまり、それらを結合する必要があります。 XObjectフォームはストリームオブジェクトです。
- 他のすべての属性は扱いにくいので、わからない場合は無視してください。
これが完了したら、新しいページにXObjectフォームをペイントするだけで済みます。 XObjectの一意の名前を生成し、ページのResources
に追加する必要があります。ペイント自体は、画像をペイントするのと同じように、cm
とDo
の一連の演算子です。元のコンテンツをトリミングする必要がある場合は、クリッピングパスをDo
より前に設定する必要があります。
言うまでもなく、これは些細なものではなく、落とし穴がたくさんあります。私はこれを実装して、それが本当にうまくいくと言うことができますが、見た目よりも難しいです。あなたは非常に良い低レベルのPDFライブラリと、PDF仕様の非常に徹底的な理解が必要です。
私は、このような色管理などその他の詳細のいくつかを説明していない(何が管理CMYKにDeviceRGBでペイント場合)など、PDF/A、PDF/X、転送、注釈とフォームフィールドを、
これがあなたを超えているなら、あなたはオープンソースのインポジショニングライブラリを探しているはずです。インポジショニングとは、本やフライヤーを印刷する目的で、2枚以上のページを空白の用紙に置くことを意味します。私は商業的な解決策も持っています。