Extrahieren von Text Mit PdfMiner und PyPDF2 Verschmilzt Spalten
Ich versuche zu analysieren, die pdf-Datei, text mit pdfMiner, aber der extrahierte text wird zusammengeführt. Ich bin mit der pdf-Datei aus dem folgenden link.
Ich bin gut mit jeder Art der Ausgabe (Datei/string). Hier ist der code, der gibt den extrahierten text als string für mich, aber für einige Grund, Spalten zusammengeführt werden.
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
import StringIO
def convert_pdf(filename):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec)
fp = file(filename, 'rb')
process_pdf(rsrcmgr, device, fp)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
return str
Habe ich auch schon versucht PyPdf2, aber vor dem gleichen Problem. Hier ist der Beispielcode für PyPDF2
from PyPDF2.pdf import PdfFileReader
import StringIO
import time
def getDataUsingPyPdf2(filename):
pdf = PdfFileReader(open(filename, "rb"))
content = ""
for i in range(0, pdf.getNumPages()):
print str(i)
extractedText = pdf.getPage(i).extractText()
content += extractedText + "\n"
content = " ".join(content.replace("\xa0", " ").strip().split())
return content.encode("ascii", "ignore")
Habe ich auch schon versucht pdf2txt.py aber nicht in der Lage, um die formatierte Ausgabe.
Sollte das erste code-block Lesen
Mehrere Spalten sind wirklich eine Qual zum Lesen von pdf-Dokumenten. Je nachdem, was Sie wollen, k2pdfopt, macht ein Bild von jeder Seite.
retstr = StringIO.StringIO()
?Mehrere Spalten sind wirklich eine Qual zum Lesen von pdf-Dokumenten. Je nachdem, was Sie wollen, k2pdfopt, macht ein Bild von jeder Seite.
InformationsquelleAutor user2151334 | 2013-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vor kurzem kämpfte mit einem ähnlichen problem, obwohl mein pdf hatte etwas einfachere Struktur.
PDFMiner verwendet Klassen als "Geräte" zu analysieren, die Seiten in eine pdf-fil. Die basic-Geräte-Klasse ist das PDFPageAggregator Klasse, die einfach analysiert werden die Textfelder in der Datei. Der Konverter-Klassen , z.B. TextConverter, XMLConverter, und HTMLConverter auch die Ausgabe in eine Datei (oder einen string-stream, wie in Ihrem Beispiel) und noch einige weitere aufwändige Analyse für den Inhalt.
Das problem mit TextConverter (und PDFPageAggregator) ist, dass Sie nicht recurse tief genug, um die Struktur des Dokuments, um richtig zu extrahieren, die den verschiedenen Spalten. Die beiden anderen Konverter benötigen einige Informationen über die Struktur des Dokuments für die Anzeige, so dass Sie sammeln detaillierte Daten. In deinem Beispiel-pdf sowohl von der simplen Geräte erst analysieren (grob) das gesamte Textfeld enthält die Spalten, die macht es unmöglich (oder zumindest sehr schwierig), um richtig trennen Sie die verschiedenen Zeilen. Die Lösung fand ich ziemlich gut funktioniert, ist entweder
In beiden Fällen müssten Sie kombinieren die verschiedenen text-Segmenten, Zeilen, die mit Ihrer bounding-box y-Koordinaten.
In dem Fall ein neues Gerät, Klasse ('tis beredter, glaube ich), Sie hätte das überschreiben der Methode
receive_layout
bekommen, dass heißt für jede Seite, die während des rendering-Prozesses. Diese Methode dann rekursiv analysiert die Elemente jeder Seite. Zum Beispiel, so etwas könnte den Einstieg:Im code oben zu sehen, fand LTTextLine element gespeichert ist, in eine geordnete Liste von Tupeln mit der page-Nummer, die Koordinaten der bounding-box und den enthaltenen text in einem bestimmten element. Würden Sie dann etwas tun, ähnlich wie diese:
Die variable "device".Zeilen enthält die sortierte Liste mit allen Zeilen angeordnet, die mit Ihrer Seitenzahl und y-Koordinaten. Sie können Schleife über die Zeilen-und Gruppen-Linien mit der gleichen y-Koordinaten bilden die Zeilen, speichern Sie die Spalte, Daten, etc.
Habe ich versucht zu analysieren, Ihre pdf-Datei mit dem obigen code und die Spalten sind meist korrekt analysiert. Jedoch, einige der Spalten sind so eng zusammen, dass die Standard-PDFMiner Heuristiken fehlschlagen, trennen Sie Sie in Ihre eigenen Elemente. Sie können wahrscheinlich erhalten, um diese durch anpassen der word-margin-parameter (- W-flag im command line tool pdf2text.py). In jedem Fall, möchten Sie vielleicht zu Lesen durch die (schlecht dokumentierte) PDFMiner API sowie durchsuchen den Quellcode von PDFMiner, die Sie erhalten können, von github. (Ach, ich kann nicht den link einfügen weil ich nicht genügend rep-points :'<, aber man kann hoffentlich google die richtige repo)
InformationsquelleAutor hlindblo
Ich habe versucht, Ihre ersten code-block und bekam ein paar Ergebnisse, die wie folgt Aussehen:
MEHRFAMILIENHAUS AGARDEN KOMPLEXE 14945010314370 ZU 372WILLOWRD W MEHRFAMILIENHAUS AGARDEN KOMPLEXE 14945010314380 ZU 384WILLOWRD W MEHRFAMILIENHAUS AGARDEN KOMPLEXE 149450103141000 ZU 1020WILLOWBROOKRD MEHRFAMILIENHAUS AROOMING HAUS 198787
Ich nehme an, Sie sind in einer ähnlichen position wie dieser Antwort und dass alle whitespace-Zeichen wird verwendet, um die position der Wörter in der richtige Ort, nicht als eigentliche druckbare Zeichen. Die Tatsache, dass Sie versucht haben, mit mit anderen pdf-Bibliotheken, lässt mich denken, dass dies möglicherweise ein Problem, das ist schwierig für eine pdf-Bibliothek zu analysieren.
InformationsquelleAutor Stedy