Pdf in eine Txt-Datei konfertieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mady
User
Beiträge: 3
Registriert: Mittwoch 17. Oktober 2018, 20:38

Mittwoch 17. Oktober 2018, 20:50

Hallo,

ich bin noch recht neu in der Welt des Programmierens und versteh leider komplett und gar nicht wo mein Fehler ist.

Ich möchte eine pdf-Datei einlesen und in eine txt-Datei schreiben, um später damit weiterarbeiten zu können.

Online habe auf der Seite: https://github.com/shakkaist/Python/blo ... nverter.py einen Code gefunden, um besagte Funktion für mehrer Dateien anzuwenden.

Leider erhalte ich immer nachfolgende Fehlermeldung:

C:\ProgramData\Anaconda3\python.exe C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py
Traceback (most recent call last):
File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 50, in <module>
convertMultiple(pdfDir, txtDir)
File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 41, in convertMultiple
text = convert(pdfFilename) # get string of text content of pdf
File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 23, in convert
infile = file(fname, 'rb')
NameError: name 'file' is not defined
Process finished with exit code 1

Da ich Python 3.6.6 benutze, musst ich den Code etwas anpassen, wie unten aufgeführt. Kann mir jemand von euch weiterhelfen wo genau mein Fehler liegt ?

import os
import io

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage


# converts pdf, returns its text content as a string
def convert(fname, pages=None):
if not pages:
pagenums = set()
else:
pagenums = set(pages)

output = io.StringIO()
manager = PDFResourceManager()
codec = 'utf-8'
converter = TextConverter(manager, output, codec=codec, laparams=LAParams())
interpreter = PDFPageInterpreter(manager, converter)

infile = file(fname, 'rb')
#for page in PDFPage.get_pages(infile, pagenums):
#infile = open(fname, 'rb')
for page in PDFPage.get_pages(infile, pagenums, caching=caching, check_extractable=True):
interpreter.process_page(page)
infile.close()
converter.close()
text = output.getvalue()
output.close
return text


def convertMultiple(pdfDir, txtDir):
if pdfDir == "": pdfDir = os.getcwd() + "\\" # if no pdfDir passed in
for pdf in os.listdir(pdfDir): # iterate through pdfs in pdf directory
fileExtension = pdf.split(".")[-1]
if fileExtension == "pdf":
pdfFilename = pdfDir + pdf
text = convert(pdfFilename) # get string of text content of pdf
textFilename = txtDir + pdf + ".txt"
textFile = open(textFilename, "w") # make text file
textFile.write(text) # write text to text file
# textFile.close


pdfDir = r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei"
txtDir = r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei"
convertMultiple(pdfDir, txtDir)

Vielen Dank für eure Hilfe!
Viele Grüße :)
Benutzeravatar
sls
User
Beiträge: 248
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Tannhauser Gate

Mittwoch 17. Oktober 2018, 22:36

file() wird in Python3 nicht unterstützt. Nutze stattdessen open(). Damit der filedescriptor nicht händisch geschlossen werden muss, nutzt man das in Kombination mit dem with-Statement. Nächstes mal den Source-Code hier in <code>-Tags pasten, sonst ist der Code unbrauchbar, da u.a. Einrückungen verloren gehen.
With great processing power comes great responsibility.
Mady
User
Beiträge: 3
Registriert: Mittwoch 17. Oktober 2018, 20:38

Donnerstag 18. Oktober 2018, 05:33

Guten morgen,

leider bekomme ich dann eine ähnliche Fehlermeldung (hoffe der Code wird jetzt richtig angezeigt):

Code: Alles auswählen

C:\ProgramData\Anaconda3\python.exe C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py
Traceback (most recent call last):
  File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 50, in <module>
    convertMultiple(pdfDir, txtDir)
  File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 41, in convertMultiple
    text = convert(pdfFilename)  # get string of text content of pdf
  File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 25, in convert
    infile = open(fname, 'rb')
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Amy_6\\Desktop\\Uni\\Python\\Probeprojekt\\Dateifw9.pdf'

Process finished with exit code 1

Wenn ich hier mit einem "\" dem versuche entgegen zu wirken mit folgenden Code, bekomme ich wieder eine Fehlermeldung (s.o.):

Code: Alles auswählen

import os
import io

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage


# converts pdf, returns its text content as a string
def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = io.StringIO()
    manager = PDFResourceManager()
    codec = 'utf-8'
    converter = TextConverter(manager, output, codec=codec, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    #infile = file(fname, 'rb')
    #for page in PDFPage.get_pages(infile, pagenums):
    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums, caching=caching, check_extractable=True):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close
    return text


def convertMultiple(pdfDir, txtDir):
    if pdfDir == "": pdfDir = os.getcwd() + "\\"  # if no pdfDir passed in
    for pdf in os.listdir(pdfDir):  # iterate through pdfs in pdf directory
        fileExtension = pdf.split(".")[-1]
        if fileExtension == "pdf":
            pdfFilename = pdfDir + pdf
            text = convert(pdfFilename)  # get string of text content of pdf
            textFilename = txtDir + pdf + ".txt"
            textFile = open(textFilename, "w")  # make text file
            textFile.write(text)  # write text to text file
        # textFile.close


pdfDir = r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei\"
txtDir = r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei\"
convertMultiple(pdfDir, txtDir)
Fehlermeldung:

Code: Alles auswählen

C:\ProgramData\Anaconda3\python.exe C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py
  File "C:/Users/Amy_6/Desktop/Uni/Python/Probeprojekt/Datei/Pdftotxt.py", line 48
    pdfDir = r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei\"
                                                                    ^
SyntaxError: EOL while scanning string literal

Process finished with exit code 1
Benutzeravatar
sls
User
Beiträge: 248
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Tannhauser Gate

Donnerstag 18. Oktober 2018, 08:40

Versuch's mal mit dem Pathlib-Modul, das ist genau für sowas gemacht.

pathlib.Path(r"C:\Users\Amy_6\Desktop\Uni\Python\Probeprojekt\Datei\")

Mit den suffix und iterdir() kannst du dann problemlos alle PDF-Dateien herausfiltern, öffnen, und manipulieren. Ich sehe dass das python-Script im selben Verzeichnis liegt. Man sollte generell immer mit relativen Pfaden arbeiten, nicht Absoluten. if pdfDir == "" ist auch nicht notwendig, da if path: bei einem leeren String immer False zurückgibt.

Das Öffnen von Dateien in Python macht man z.B. so:

Code: Alles auswählen

with open(file, 'w') as pdf_file:
    pdf_file.write('Bla')
With great processing power comes great responsibility.
narpfel
User
Beiträge: 239
Registriert: Freitag 20. Oktober 2017, 16:10

Donnerstag 18. Oktober 2018, 13:41

Auch ein Raw-String-Literal darf nicht in einem Backslash enden, weil `\"` ein escapetes Anführungszeichen ist. Die einfache Lösung wäre es, auch unter Windows Slashes anstatt von Backslashen zu benutzen.
Sirius3
User
Beiträge: 8608
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 18. Oktober 2018, 16:05

@Mady: Pfade sind eben keine einfachen Strings und man sollte daher auch nicht mit Stringoperationen arbeiten. Das pathlib-Modul ist genau dafür gemacht.

Code: Alles auswählen

from pathlib import Path
def convert_multiple(input_path, output_path):
    for pdf_filename in Path(input_path).glob("*.pdf"):
        text = convert(pdf_filename)  # get string of text content of pdf
        text_filename = (Path(output_path) / pdf_filename.name).with_suffix(".txt")
        with text_filename.open("w") as output:
            output.write(text)  # write text to text file
Übrigens, Variablennamen und Funktionen werden klein_mit_unterstrich geschrieben.
Antworten