Ich habe über 50.000 PDF-Dokumente, die Kundenkonten zugeordnet werden müssen. Allerdings enthält jedes PDF Seiten, die der Kunde nicht sehen soll (interne Firmenunterlagen), und deshalb möchte ich bestimmte Seiten anhand ihres Inhalts löschen können („Nur für Bürogebrauch“ erscheint auf der Seite) und das PDF als neue Datei speichern.
Ich kenne mich mit Skripting gut aus, ich muss nur wissen, welche Software für eine solche Aufgabe geeignet ist.
Antwort1
Es gibt eine Reihe von Bibliotheken zur Bearbeitung von PDF-Dateien, darunter die nicht gepflegtepyPDFund seine GabelPyPDF2. Sie können eine Datei seitenweise verarbeiten, den Text extrahieren und die Seiten kopieren, deren Text geeignet ist.
Ich habe Folgendes mit Python3.6 und PyPDF2==1.26.0 ausgeführt:
#!/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)
Beachten Sie, dass der Text im Dokument möglicherweise nicht genau so angezeigt wird, wie Sie es möchten. In einem PDF-Dokument können Zeilen, Wörter oder sogar Zeichen in der falschen Reihenfolge erscheinen. Statt eines Textflusses kann das Dokument aus Teilen bestehen, die an bestimmten Koordinaten erscheinen.
Selbst wenn der Text in der richtigen Reihenfolge ist, was normalerweise der Fall ist, hat Text, der sich über mehrere Seiten erstreckt, eine Fußzeile und eine Kopfzeile in der Mitte. Text, der sich über mehrere Zeilen erstreckt, kann zusätzliche Leerzeichen um die Zeilenumbrüche haben. Sogar Text in denselben Zeilen kann aufgrund der Textausrichtung mehrere Leerzeichen zwischen Wörtern haben (deshalb habe ich \s+
im regulären Ausdruck oben anstelle eines einfachen Leerzeichens verwendet).
Tools, die Text aus PDF extrahieren, versuchen, die Seite als Text zu rekonstruieren, aber das gelingt ihnen nicht immer perfekt. Wenn pyPdf mit Ihren Dokumenten nicht gut funktioniert, können Sie andere Bibliotheken zur Textextraktion ausprobieren; sieheDasUndDasThread für einige Beispiele.
Antwort2
Eine Möglichkeit wäre, sich Befehlszeilen-PDF-Editoren wie PDFEdit, Pdftk oder PDFSaM anzusehen. pdftotext kann hilfreich sein, um auf einfache Weise die zu entfernenden Seitenzahlen zu ermitteln.