Seite 1 von 1

Pdf in eine Txt-Datei konfertieren

Verfasst: Mittwoch 17. Oktober 2018, 20:50
von Mady
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 :)

Re: Pdf in eine Txt-Datei konfertieren

Verfasst: Mittwoch 17. Oktober 2018, 22:36
von sls
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.

Re: Pdf in eine Txt-Datei konfertieren

Verfasst: Donnerstag 18. Oktober 2018, 05:33
von Mady
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

Re: Pdf in eine Txt-Datei konfertieren

Verfasst: Donnerstag 18. Oktober 2018, 08:40
von sls
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')

Re: Pdf in eine Txt-Datei konfertieren

Verfasst: Donnerstag 18. Oktober 2018, 13:41
von narpfel
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.

Re: Pdf in eine Txt-Datei konfertieren

Verfasst: Donnerstag 18. Oktober 2018, 16:05
von Sirius3
@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.