【问题标题】:Pdfminer python 3.5pdfminer python 3.5
【发布时间】:2017-02-12 18:28:17
【问题描述】:

我已经学习了一些教程,但我无法让这个代码块运行,我做了从 StringIO 到 BytesIO 的必要切换(我相信?)

我不确定为什么“香蕉”什么也没打印,我认为错误可能是红鲱鱼?是不是跟我学了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 代码来自 thisthis)但没有运气。

感谢任何见解。

干杯

【问题讨论】:

  • 请通过投票或接受来确认我的回答
  • 查看以下答案,该答案于 2020 年 5 月有效,非常简单:from pdfminer.high_level import extract_text then text = extract_text('report.pdf') stackoverflow.com/a/61857301/7483211跨度>
  • file() 在 Python 3 中被 open() 替换。请参阅下面的答案:stackoverflow.com/a/69962200/4054971

标签: python-3.x pdf text extract pdfminer


【解决方案1】:

pdfminer 不支持 python 3.5 版。它仅适用于 Python 2.6 或更高版本。我遇到了同样的问题,尝试使用 python 2.6 版它会解决你的问题。

【讨论】:

    【解决方案2】:

    一种适用于 Python 3.5 的解决方案:您需要 pdfminer.six。在 win10 下我可以轻松安装它

    pip install pdfminer.six
    

    您可以检查安装的版本

    pdfminer.__version__
    

    我还没有对它进行深入测试。但我可以运行以下代码进行转换 pdf→textpdf→html

    【讨论】:

    • 另外,pdfminer.six 似乎一直维持到 11 月 18 日!万岁。
    • @pyano 您提到“可以为转换 pdf→text 和 pdf→html 运行以下代码”但没有以下代码。 2020 年 5 月的工作代码示例在这里:stackoverflow.com/a/61857301/7483211
    • @Cornelius Roemer 代码就在下一个答案的下方:改进的解决方案(Dez 2016)
    【解决方案3】:

    改进的解决方案(Dez 2016)

    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) 
    

    【讨论】:

      【解决方案4】:

      在我使用 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
      

      【讨论】:

      【解决方案5】:

      函数 file() 在 Python 2.7 中是 built-in function。但它不再是 Python 3.5 中的 built-in function

      您应该将file() 更改为open()

      【讨论】:

        猜你喜欢
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 2018-01-10
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多