![コンテンツに応じて特定のPDFページを削除する](https://rvso.com/image/97238/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E7%89%B9%E5%AE%9A%E3%81%AEPDF%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B.png)
顧客アカウントに割り当てる必要がある PDF ドキュメントが 50,000 件以上あります。ただし、各 PDF には顧客に見せたくないページ (社内用) が含まれているため、コンテンツに基づいて特定のページを削除し (ページに「オフィス使用のみ」と表示される)、PDF を新しいファイルとして保存できるようにしたいと考えています。
スクリプト作成に関しては問題ありませんが、どのようなソフトウェアがそのようなタスクを実行できるかを知る必要があります。
答え1
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 は、削除するページ番号を識別する簡単な方法として役立つ場合があります。