私はPyPDFにあまり精通していませんが、Ghostscriptがこれを実行できることは知っています。同様の質問に対する他の回答へのリンクは次のとおりです。
- PDFを1ページあたり2面から1ページあたり1面に変換(SuperUser.com)
- PDFのページを途中で分割するフリーウェア?(SuperUser.com)
- Ghostscript 9.01(StackOverflow.com)
3番目の答えは、おそらく「すべてのPDFファイルで機能するとは限らないことを理解しています」と言わせた理由です。pdfmarkコマンドを使用し /CropBox
て、をPDFページオブジェクトに設定しようとします。
最初の2つの答えの方法は、3番目の答えが失敗した場合に成功する可能性が最も高くなります。このメソッドは、のPostScriptコマンドスニペットを使用して<</PageOffset [NNN MMM]>> setpagedevice
、PDFページをシフトし、-gNNNNxMMMM
パラメーター(ピクセル単位でデバイスの幅と高さを定義する)で定義された(小さい)メディアサイズに配置します。
最初の2つの回答の背後にある概念を理解していれば、そこで使用されている方法を簡単に適応させて、PDFページの4つの端すべての余白を切り抜くことができます。
文字サイズのPDF(8.5x11in == 612x792pt)を4つのエッジのそれぞれで0.5インチ(== 36pt)トリミングするコマンドの例(コマンドはWindows用):
gswin32c.exe ^
-o cropped.pdf ^
-sDEVICE=pdfwrite ^
-g5400x7200 ^
-c "<</PageOffset [-36 -36]>> setpagedevice" ^
-f input.pdf
結果のページサイズは7.5x10in(== 540x720pt)になります。LinuxまたはMacで同じことを行うには、次を使用します。
gs \
-o cropped.pdf \
-sDEVICE=pdfwrite \
-g5400x7200 \
-c "<</PageOffset [-36 -36]>> setpagedevice" \
-f input.pdf
更新:Ghostscriptで「マージン」を決定する方法
ホワイトマージンの「自動」決定を求めるコメントがありました。これにはGhostscriptも使用できます。そのbbox
デバイスは、各ページの(仮想)インクで覆われている領域を判別できます(したがって、キャンバスの各エッジの空白を間接的に判別できます)。
コマンドは次のとおりです。
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf
出力(例):
%%BoundingBox: 57 29 562 764
%%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977
%%BoundingBox: 57 28 562 667
%%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011
デバイスは、メモリ内のbbox
各PDFページを(ディスクに出力を書き込まずに)レンダリングしてから、BoundingBoxおよびHiResBoundingBox情報をに出力しstderr
ます。このコマンドをこのように変更して、結果をより簡単に解析できるようにすることができます。
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf \
2>&1 \
| grep -v HiResBoundingBox
出力(例):
%%BoundingBox: 57 29 562 764
%%BoundingBox: 57 28 561 667
これはあなたに言うでしょう...
- ...ページ1のコンテンツ長方形の左下隅が
[57 29]
右上隅との座標にあること[562 741]
- ...ページ2のコンテンツ長方形の左下隅が
[57 28]
右上隅との座標にあること[561 667]
これの意味は:
- ページ1は、左端に57ptの空白を使用しています(
72pt == 1in == 25,4mm
)。
- ページ1は、下端に29ptの空白を使用しています。
- ページ2は、左端に57ptの空白を使用しています。
- ページ2は、下端に28ptの空白を使用しています。
この簡単な例からすでにわかるように、空白は各ページで完全に同じではありません。ニーズに応じて(複数ページのPDFの各ページに同じサイズが必要になる可能性がありますか?)、ドキュメントのすべてのページの各エッジの最小マージンを計算する必要があります。
では、右端と上端の空白についてはどうでしょうか。これを計算するには、各ページの元のページサイズを知る必要があります。これを決定する最も簡単な方法:pdfinfo
ユーティリティ。5ページのPDFのコマンド例:
pdfinfo \
-f 1 \
-l 5 \
input.pdf \
| grep "Page "
出力(例):
Page 1 size: 612 x 792 pts (letter)
Page 2 size: 612 x 792 pts (letter)
Page 3 size: 595 x 842 pts (A4)
Page 4 size: 842 x 1191 pts (A3)
Page 5 size: 612 x 792 pts (letter)
これは、新しいPDFページのそれぞれの上端と右端に必要なキャンバスサイズと必要な(最大)白い余白を決定するのに役立ちます。
もちろん、これらの計算はすべてスクリプト化することもできます。
ただし、PDFがすべて一意のページサイズである場合、または1ページのドキュメントである場合は、すべてを実行する方がはるかに簡単です...