13

PDFファイルから白い余白を削除する方法を知りたいのですが。Adobe AcrobatXProと同じように。すべてのPDFファイルで機能するとは限らないことを理解しています。

それを行う方法は、テキストの余白を取得し、その余白からトリミングすることだと思います。

PyPdfが推奨されます。

iTextは、次のコードに基づいてテキストマージンを検索します。

public void addMarginRectangle(String src, String dest)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
    TextMarginFinder finder;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        finder = parser.processContent(i, new TextMarginFinder());
        PdfContentByte cb = stamper.getOverContent(i);
        cb.rectangle(finder.getLlx(), finder.getLly(),
            finder.getWidth(), finder.getHeight());
        cb.stroke();
    }
    stamper.close();
}
4

2 に答える 2

20

私はPyPDFにあまり精通していませんが、Ghostscriptがこれを実行できることは知っています。同様の質問に対する他の回答へのリンクは次のとおりです。

  1. PDFを1ページあたり2面から1ページあたり1面に変換(SuperUser.com)
  2. PDFのページを途中で分割するフリーウェア?(SuperUser.com)
  3. 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ページのドキュメントである場合は、すべてを実行する方がはるかに簡単です...

于 2012-05-02T17:25:54.210 に答える
9

pdfcropを試してください。ghostscriptが必要です。

于 2012-05-04T15:36:58.763 に答える