Ich suche nach Dokumentationen oder Beispielen zum Extrahieren von Text aus einer PDF-Datei mit PDFMiner mit Python.
Es sieht so aus, als hätte PDFMiner seine API aktualisiert und alle relevanten Beispiele, die ich gefunden habe, enthalten veralteten Code (Klassen und Methoden haben sich geändert). Die Bibliotheken, die ich gefunden habe, um das Extrahieren von Text aus einer PDF-Datei zu vereinfachen, verwenden die alte PDFMiner-Syntax, daher bin ich mir nicht sicher, wie ich das tun soll.
So wie es ist, schaue ich nur auf den Quellcode, um zu sehen, ob ich es herausfinden kann.
python
python-3.x
python-2.7
text-extraction
pdfminer
DuckPuncher
quelle
quelle
PDFminer
angibt, dass dies mit Python 3.xx nicht funktioniert. Dies könnte der Grund sein, warum Sieimport
Fehler erhalten. Sie sollten dies verwendenpdfminer3k
, da dies der ständige Python 3-Import dieser Bibliothek ist.PDFminer
von GitHub installiert und es importiert gut. Können Sie bitte Ihren Code und auch Ihren vollständigen Fehler-Traceback veröffentlichen?Antworten:
Hier ist ein Arbeitsbeispiel zum Extrahieren von Text aus einer PDF-Datei mit der aktuellen Version von PDFMiner (September 2016).
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from io import StringIO def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): interpreter.process_page(page) text = retstr.getvalue() fp.close() device.close() retstr.close() return text
Die Struktur von PDFMiner wurde kürzlich geändert, daher sollte dies zum Extrahieren von Text aus den PDF-Dateien funktionieren.
Bearbeiten : Funktioniert noch ab dem 7. Juni 2018. Verifiziert in Python Version 3.x.
Bearbeiten: Die Lösung funktioniert mit Python 3.7 am 3. Oktober 2019. Ich habe die Python-Bibliothek verwendet
pdfminer.six
, die im November 2018 veröffentlicht wurde.quelle
import sys reload(sys) sys.setdefaultencoding('utf-8')
file(path, 'rb')
um `open (Pfad,‚rb‘) mine zur Arbeit zu kommen.tolle Antwort von DuckPuncher, für Python3 stellen Sie sicher, dass Sie pdfminer2 installieren und tun:
import io from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = io.StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos = set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): interpreter.process_page(page) fp.close() device.close() text = retstr.getvalue() retstr.close() return text
quelle
ImportError:
Dies funktioniert im Mai 2020 mit PDFminer 6 in Python3.
Paket installieren
Paket importieren
from pdfminer.high_level import extract_text
Verwenden einer auf der Festplatte gespeicherten PDF-Datei
text = extract_text('report.pdf')
Oder alternativ:
with open('report.pdf','rb') as f: text = extract_text(open('report.pdf','rb'))
Verwenden von PDF bereits im Speicher
Befindet sich die PDF-Datei bereits im Speicher, z. B. wenn sie mit der Anforderungsbibliothek aus dem Web abgerufen wurde, kann sie mithilfe der
io
Bibliothek in einen Stream konvertiert werden :import io response = requests.get(url) text = extract_text(io.BytesIO(response.content))
Leistung und Zuverlässigkeit im Vergleich zu PyPDF2
PDFminer.six funktioniert zuverlässiger als PyPDF2 (was bei bestimmten PDF-Typen fehlschlägt), insbesondere PDF-Version 1.7
Die Textextraktion mit PDFminer.six ist jedoch um den Faktor 6 erheblich langsamer als PyPDF2.
Ich habe die Textextraktion mit
timeit
einem 15 "MBP (2018) zeitlich festgelegt, nur die Extraktionsfunktion (kein Öffnen von Dateien usw.) mit einem 10-seitigen PDF zeitlich festgelegt und die folgenden Ergebnisse erhalten:PDFminer.six: 2.88 sec PyPDF2: 0.45 sec
pdfminer.six hat auch eine enorme Stellfläche und erfordert pycryptodome, für das GCC und andere Dinge installiert werden müssen, um ein minimales Docker-Image für die Installation unter Alpine Linux von 80 MB auf 350 MB zu verschieben. PyPDF2 hat keine merklichen Auswirkungen auf die Speicherung.
quelle
Vollständige Offenlegung, ich bin einer der Betreuer von pdfminer.six.
Heutzutage gibt es mehrere APIs, mit denen Sie je nach Bedarf Text aus einem PDF extrahieren können. Hinter den Kulissen verwenden alle diese APIs dieselbe Logik zum Parsen und Analysieren des Layouts.
Befehlszeile
Wenn Sie nur einmal Text extrahieren möchten, können Sie das Befehlszeilentool pdf2txt.py verwenden:
High-Level-API
Wenn Sie Text mit Python extrahieren möchten, können Sie die übergeordnete API verwenden. Dieser Ansatz ist die ideale Lösung, wenn Sie Text programmgesteuert aus vielen PDF-Dateien extrahieren möchten.
from pdfminer.high_level import extract_text text = extract_text('samples/simple1.pdf')
Composable api
Es gibt auch eine zusammensetzbare API, die viel Flexibilität beim Umgang mit den resultierenden Objekten bietet. Damit können Sie beispielsweise Ihren eigenen Layout-Algorithmus implementieren. Diese Methode wird in den anderen Antworten vorgeschlagen, aber ich würde dies nur empfehlen, wenn Sie das Verhalten von pdfminer.six anpassen müssen.
from io import StringIO from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser output_string = StringIO() with open('samples/simple1.pdf', 'rb') as in_file: parser = PDFParser(in_file) doc = PDFDocument(parser) rsrcmgr = PDFResourceManager() device = TextConverter(rsrcmgr, output_string, laparams=LAParams()) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.create_pages(doc): interpreter.process_page(page) print(output_string.getvalue())
quelle
Dieser Code wird mit pdfminer für Python 3 getestet (pdfminer-20191125)
from pdfminer.layout import LAParams from pdfminer.converter import PDFPageAggregator from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.layout import LTTextBoxHorizontal def parsedocument(document): # convert all horizontal text into a lines list (one entry per line) # document is a file stream lines = [] rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(document): interpreter.process_page(page) layout = device.get_result() for element in layout: if isinstance(element, LTTextBoxHorizontal): lines.extend(element.get_text().splitlines()) return lines
quelle