Pdfminer Python 3.5

21

我已经学习了几个教程,但是我无法使这段代码运行起来,我已经从StringIO更改为BytesIO(我认为是这样的)

我不确定为什么'banana'没有输出任何内容,我认为错误可能是误导性的,这是否与我追随Python2.7教程并尝试将其翻译成Python3有关?

errors: File "/Users/foo/PycharmProjects/Try/Pdfminer.py", line 28, in <module>
    banana = convert("A1.pdf")
  File "/Users/foo/PycharmProjects/Try/Pdfminer.py", line 19, in convert
    infile = file(fname, 'rb')
NameError: name 'file' is not defined

脚本

from io import BytesIO

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

def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = BytesIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

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

banana = convert("A1.pdf")
print(banana)

这个变种也会发生同样的事情:

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

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = BytesIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(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

Banana = convert_pdf_to_txt("A1.pdf")
print(Banana)
我已经尝试搜索此内容(pdfminer的大部分代码源自此处此处),但没有成功。
欢迎提供任何见解。
谢谢。

请仅返回翻译后的文本内容:请通过点赞或接受来确认我的回答。 - animal
请查看下面的答案,它适用于2020年5月,并且非常简单:from pdfminer.high_level import extract_text 然后 text = extract_text('report.pdf') stackoverflow.com/a/61857301/7483211 - Cornelius Roemer
在Python 3中,file()open()替换。请参见下面的答案:https://dev59.com/BVkS5IYBdhLWcg3wcGaW#69962200 - Pieter
5个回答

36

对于Python 3.5,有一种解决方案:你需要pdfminer.six。在win10下,我可以轻松安装它:

pip install pdfminer.six

您可以使用以下命令检查已安装的版本:

pdfminer.__version__

我还没有进行过深入的测试。但是我可以运行以下代码将pdf→文本pdf→html进行转换。


另外,pdfminer.six似乎一直维护到11月18日!太好了。 - benzkji
@pyano您提到“可以运行以下代码进行pdf→text和pdf→html转换”,但是后面没有任何代码。2020年5月的可工作代码示例在这里:https://dev59.com/UF8d5IYBdhLWcg3wvkSN#61857301 - Cornelius Roemer
@Cornelius Roemer,代码就在下一个回答中: 改进的解决方案(2016年12月) - pyano

13

改进方案(2016年12月)

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

def convert(case,fname, pages=None):
    if not pages: pagenums = set();
    else:         pagenums = set(pages);      
    manager = PDFResourceManager() 
    codec = 'utf-8'
    caching = True

    if case == 'text' :
        output = io.StringIO()
        converter = TextConverter(manager, output, codec=codec, laparams=LAParams())     
    if case == 'HTML' :
        output = io.BytesIO()
        converter = HTMLConverter(manager, output, codec=codec, laparams=LAParams())

    interpreter = PDFPageInterpreter(manager, converter)   
    infile = open(fname, 'rb')

    for page in PDFPage.get_pages(infile, pagenums,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    convertedPDF = output.getvalue()  

    infile.close(); converter.close(); output.close()
    return convertedPDF

#//////////// main ///////////////////////
filePDF  = 'myDir//myPDF.pdf'     # input
fileHTML = 'myDir//myHTML.html'   # output
fileTXT  = 'myDir//myTXT.txt'     # output

case = "HTML"

if case == 'HTML' :
    convertedPDF = convert('HTML', filePDF, pages=[0,1])
    fileConverted = open(fileHTML, "wb", encoding="utf-8")
if case == 'text' :
    convertedPDF = convert('text', filePDF, pages=[0,1])
    fileConverted = open(fileTXT, "w", encoding="utf-8")

fileConverted.write(convertedPDF)
fileConverted.close()
#print(convertedPDF) 

2

在我的情况下,我尝试了在Python 3.7上使用它,并且它对我非常有效!

这是我使用的代码:

def convert_pdf_to_txt(path_to_file):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path_to_file, '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

你安装了哪个包?经典的pdfminer说它不支持Python3?https://euske.github.io/pdfminer/index.html - benzkji
1
@benzkji 你是对的,你需要为Python3安装pdfminer.six。更多细节请参见此处 https://github.com/pdfminer/pdfminer.six - Muhammad Haseeb

0

-2

pdfminer不支持Python版本3.5,它仅在Python 2.6或更新版本中运行。我曾遇到过同样的问题,尝试使用Python版本2.6即可解决。


我强烈建议在2023年使用Python 3.8+。这个答案是在2016年写的,已经过时了。 - Martin Thoma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接