PDFMiner 版本差异?获取 AttributeError:“PDFDocument”对象没有属性“seek”

Big*_*_Tx 3 python pdfminer

我从之前的 SO 问题中提取了一些 Python 代码,但这些代码是为 PDFMiner 的先前版本编写的(并且从那时起 PDFMiner 似乎发生了一些重大更改)。我已经做了一些更改来解决这些错误,但现在我收到以下错误:

C:\Users\xxxx\Documents\Programming\Python>pdfextractor.py
Traceback (most recent call last):
  File "C:\Users\xxxx\Documents\Programming\Python\pdfextractor.py", line 71, in <module>
    pdf_to_csv(sourcefile)
  File "C:\Users\xxxx\Documents\Programming\Python\pdfextractor.py", line 55, in pdf_to_csv
    for i, page in PDFPage.get_pages(doc):
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\pdfpage.py", line 119, in get_pages
    parser = PDFParser(fp)
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\pdfparser.py", line 43, in __init__
    PSStackParser.__init__(self, fp)
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\psparser.py", line 495, in __init__
    PSBaseParser.__init__(self, fp)
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\psparser.py", line 166, in __init__
    self.seek(0)
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\psparser.py", line 507, in seek
    PSBaseParser.seek(self, pos)
  File "C:\Program Files\Python27\lib\site-packages\pdfminer\psparser.py", line 196, in seek
    self.fp.seek(pos)
AttributeError: 'PDFDocument' object has no attribute 'seek'
Run Code Online (Sandbox Code Playgroud)

这是我正在运行的代码:

# ORIGINAL CODE DOES NOT SEEM COMPATIBLE WITH THE CURRENT VERSION OF PDFMINER!

# Code taken from:
#    /sf/ask/1796581/

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter
    from pdfminer.layout import LAParams
    # from pdfminer.pdfparser import PDFDocument, PDFParser      # Not compatible with current version of PDFMiner
    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdfpage import PDFPage
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item._objs:                   #<-- changed
                if isinstance(child, LTChar):
                    (_,_,x,y) = child.bbox
                    line = lines[int(-y)]
                    line[x] = child._text.encode(self.codec)    #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())
    # because my test documents are utf-8 (note: utf-8 is the default codec)

    # doc = PDFDocument()                               # Raises error with current version of PDFMiner
                                                        # --> TypeError: __init__() takes at least 2 arguments (1 given)
    fp = open(filename, 'rb')
    parser = PDFParser(fp)
    doc = PDFDocument(parser,'')                        # Inserted ahead of 'parser.set_document(doc)' to avoid error
                                                        # --> UnboundLocalError: local variable 'doc' referenced before assignment
    parser.set_document(doc)
    # doc.set_parser(parser)                            # Not compatible with current version of PDFMiner
    # doc.initialize('')                                # Not compatible with current version of PDFMiner

    interpreter = PDFPageInterpreter(rsrc, device)

    # for i, page in enumerate(doc.get_pages()):        # Not compatible with current version of PDFMiner
    for i, page in PDFPage.get_pages(doc):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)
        # data = retstr.getvalue()

    device.close()
    fp.close()

    return outfp.getvalue()

sourcefile = 'testfile1.pdf'
# sourcefile = 'testfile2.pdf'
# sourcefile = 'testfile3.pdf'

pdf_to_csv(sourcefile)
print 'Done.'
Run Code Online (Sandbox Code Playgroud)

谁能看到发生了什么事吗?我是否需要更改调用解析器的方式(参数、序列等)?

我在 Windows 10 上运行 Python 2.7.12 和 PDFMiner '20140328'。

Luk*_*ard 5

尝试更换线路

    for i, page in PDFPage.get_pages(doc):
Run Code Online (Sandbox Code Playgroud)

    for i, page in enumerate(PDFPage.create_pages(doc)):
Run Code Online (Sandbox Code Playgroud)

PDFMiner 文档本页“基本用法”部分中的代码示例建议用于create_pages迭代文档中的页面。当您跟踪变量中页面的索引时i,我已经将其包装起来调用create_pagesin enumerate