7

pyPdf を使用して、複数の PDF ファイルを 1 つにマージしています。これはうまく機能しますが、生成される PDF ファイルに目次/アウトライン/ブックマークを追加する必要もあります。

pyPdf は、アウトラインの読み取りのみをサポートしているようです。Reportlab ではそれらを作成できますが、オープンソース バージョンでは PDF ファイルの読み込みがサポートされていないため、既存のファイルにアウトラインを追加することはできません。

Python、またはそれを可能にするライブラリを使用して、既存の PDF にアウトラインを追加する方法はありますか?

4

3 に答える 3

2

WeasyPrint でも同様の問題がありました。cairoは PDF ファイルを生成しますが、ブックマーク/アウトラインまたはハイパーリンクをサポートしていません。最後に、私たちは弾丸をかみ、PDF 仕様を読み、自分たちでそれを行いました。

WeasyPrint のpdf.pyには、PDF の「オブジェクト」を既存のドキュメントに追加/上書きできるシンプルな PDF パーサーとライターがあります。PDF の「更新」メカニズムを使用し、ファイルの末尾にのみ追加します。

このモジュールは内部使用のみを目的として作成されましたが、他のプロジェクトで簡単に使用できるようにリファクタリングすることにオープンです。

ただし、パーサーはいくつかのショートカットを使用するため、すべての有効な PDF ファイルを解析することはできません。PyPDF の出力が cairo ほど良くない場合は、調整する必要があるかもしれません。モジュールのドキュメント文字列から:

有効な PDF を解析しようとするのではなく、コードを単純化するために cairo に当てはまるいくつかの仮定を行います。

  • すべての改行は '\r' や '\r\n' ではなく '\n' です
  • 番号 0 (常にフリー) を除いて、「フリー」オブジェクトはありません。
  • ほとんどの空白区切りは、単一の 0x20 スペースで構成されています。
  • 間接ディクショナリ オブジェクトでは、オブジェクトの終わりを示す場合を除いて、行頭に「>>」が含まれず、その後に「endobj」が続きます。(つまり、サブ辞書の「>>」マーカーはインデントされます。)
  • ページ ツリーはフラットです。ルート ページ ノードの子はすべてページ オブジェクトであり、ページ ツリー ノードではありません。
于 2012-07-27T10:05:17.463 に答える