コンテンツに基づいて特定のPDFページを削除する

コンテンツに基づいて特定のPDFページを削除する

顧客アカウントに割り当てる必要があるPDF文書は50,000以上あります。ただし、各PDFにはクライアントに表示したくないページ(会社の内部コンテンツ)が含まれているため、そのコンテンツ(ページに「Office Use Only」と表示されます)に基づいて特定のページを削除し、PDFを次のように保存できます。欲しいです。新しいファイル。

スクリプトの側面に満足しています。どのソフトウェアがこのようなタスクを実行できるかを知りたいです。

答え1

Python!

管理されていないライブラリを含むPDFファイルを操作するための多くのライブラリがあります。pypdfそしてそのフォークpyPDF2。ファイルをページごとに処理し、テキストを抽出し、そのページにテキストをコピーできます。

Python3.6 と PyPDF2==1.26.0 を使用して、次のコマンドを実行しました。

#!/usr/bin/env python3
import re
import sys

from PyPDF2 import PdfFileWriter, PdfFileReader

pdf_in = PdfFileReader(sys.stdin.buffer)
pdf_out = PdfFileWriter()
for p in [pdf_in.getPage(i) for i in range(0, pdf_in.getNumPages())]:
    text = p.extractText()
    if not re.search(r'for\s+office\s+use\s+only', text, re.I):
        pdf_out.addPage(p)
pdf_out.write(sys.stdout.buffer)

文書のテキストが必要に応じて正しく表示されない場合があります。 PDF文書では、行、単語、さらには文字までの順序が反転して表示されることがあります。テキストストリームの代わりに特定の座標に表示されるフラグメントで文書を整理できます。

テキストが順番になっていても(しばしばはい)、複数ページにまたがるテキストにはその間にフッターとヘッダーがあります。複数行にまたがるテキストの改行の周りに余分なスペースがある場合があります。同じ行にあるテキストでも、テキストの並べ替えにより、単語間に複数のスペースがある可能性があります。これがまさに\s+上記の正規表現で純粋な空白の代わりに使用された理由です。

PDFからテキストを抽出するツールは、ページをテキストに再構築しようとしますが、必ずしもタスクを完全に実行するわけではありません。 pyPdfがドキュメントを正しく処理できない場合は、テキスト抽出のために別のライブラリを試してみてください。これそしてこれいくつかの例を見てください。

答え2

1つのオプションは、PDFEdit、Pdftk、またはPDFSaMなどのコマンドラインPDFエディタを調べることです。 pdftotextは、削除するページ番号を識別する簡単な方法で役立ちます。

関連情報