2017-07-28 10 views
0

以前のSOの質問からPythonコードを削除しましたが、PDFMinerの以前のバージョン用にコードが書き込まれました。 。私はすでに、エラーに対処するためにカップルの変更を行ったが、今、私は次のエラーを取得しています:PDFMinerのバージョンは違いますか? AttributeErrorの取得: 'PDFDocument'オブジェクトに属性 'seek'がありません

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' 

そして、ここでは、私が実行しているコードです:

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

# Code taken from: 
# https://stackoverflow.com/questions/25665/python-module-for-converting-pdf-to-text 

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.' 

誰もが起こっているのかを見ることができます?パーサー(パラメータ、シーケンスなど)の呼び出し方法を変更する必要がありますか?

私が実行しているPythonの2.7.12 & PDFMiner '20140328' のWindows 10上

答えて

1

がで

for i, page in enumerate(PDFPage.create_pages(doc)): 

でコードサンプルをライン

for i, page in PDFPage.get_pages(doc): 

を交換してみてください " this page of the PDFMiner documentationの「Basic Usage」セクションでは、create_pagesを使用してドキュメント内のページを繰り返し処理することを提案しています。ページのインデックスeを変数iに入れて、create_pagesへの呼び出しをenumerateにラップしました。

+0

これは、私が修正しなければならなかったエラーの1つでした - enumerate()ステートメントはエラーを発生させます: "AttributeError: 'PDFDocument'オブジェクトに 'get_pages'属性がありません。 –

+0

@Big_Al_Tx:私はあなたのコメントを理解していません。あなたが自分で作った訂正の一つを繰り返すと思うということは私にはわかります(そして私が誤解した場合は残念です)。これはそうではありません。私が置き換えたものは 'get_pages'ではなく' create_pages'メソッドを使用しているので、あなたが言及したエラーは私が推奨する置換には関係ありません。また、私はこの変更であなたのコードを実行し、あなたの質問でエラーなしで完了しました。 –

+0

申し訳ありませんが、あなたが推奨する変更を誤解しました。そしてはい、間違いなく完了します。ありがとう。 –