PDFMiner を使用してディレクトリ内の PDF ファイルを解析しようとしています。ここに含まれるドキュメントから最初のスクリプトを複製することから始めています。コード (以下で繰り返されます) はファイルを開き、パーサー オブジェクトを作成しますが、ドキュメント オブジェクトを作成しようとすると「予期しない EOF」エラーが発生します。これが事実である理由を理解するための助けをいただければ幸いです。具体的には、この方法で解析できない PDF の種類はありますか?
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
import os
import re
fp = open(os.getcwd() + '\\' + os.listdir(os.getcwd())[0])
parser = PDFParser(fp)
doc = PDFDocument(parser) #This is the problem, getting an "unexpected EOF" error
if not doc.is_extractable:
raise PDFTextExtractionNotAllowed
rsrcmgr = PDFResourceManager()
device = PDFDevice(rsrcmgr)
interpreter = PDFPageInterpreter(rsrcmgr, device)
for page in PDFPage.create_pages(doc):
interpreter.process_page(page)
これにより、次のエラーが発生します。
%run scrape_psr.py
---------------------------------------------------------------------------
PSEOF Traceback (most recent call last)
C:\Users\Rob Lantz\Anaconda\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc)
195 else:
196 filename = fname
--> 197 exec compile(scripttext, filename, 'exec') in glob, loc
198 else:
199 def execfile(fname, *where):
22
23 parser = PDFParser(fp)
---> 24 doc = PDFDocument(parser) #This is the problem, getting an "unexpected EOF" error
25
26 if not doc.is_extractable:
C:\Users\Rob Lantz\Anaconda\lib\site-packages\pdfminer-20140328-py2.7.egg\pdfminer\pdfdocument.pyc in __init__(self, parser, password, caching, fallback)
313 parser.fallback = True
314 xref = PDFXRefFallback()
--> 315 xref.load(parser)
316 self.xrefs.append(xref)
317 for xref in self.xrefs:
C:\Users\Rob Lantz\Anaconda\lib\site-packages\pdfminer-20140328-py2.7.egg\pdfminer\pdfdocument.pyc in load(self, parser, debug)
173 # expand ObjStm.
174 parser.seek(pos)
--> 175 (_, obj) = parser.nextobject()
176 if isinstance(obj, PDFStream) and obj.get('Type') is LITERAL_OBJSTM:
177 stream = stream_value(obj)
C:\Users\Rob Lantz\Anaconda\lib\site-packages\pdfminer-20140328-py2.7.egg\pdfminer\psparser.pyc in nextobject(self)
555 """
556 while not self.results:
--> 557 (pos, token) = self.nexttoken()
558 #print (pos,token), (self.curtype, self.curstack)
559 if isinstance(token, (int, long, float, bool, str, PSLiteral)):
C:\Users\Rob Lantz\Anaconda\lib\site-packages\pdfminer-20140328-py2.7.egg\pdfminer\psparser.pyc in nexttoken(self)
480 def nexttoken(self):
481 while not self._tokens:
--> 482 self.fillbuf()
483 self.charpos = self._parse1(self.buf, self.charpos)
484 token = self._tokens.pop(0)
C:\Users\Rob Lantz\Anaconda\lib\site-packages\pdfminer-20140328-py2.7.egg\pdfminer\psparser.pyc in fillbuf(self)
213 self.buf = self.fp.read(self.BUFSIZ)
214 if not self.buf:
--> 215 raise PSEOF('Unexpected EOF')
216 self.charpos = 0
217 return
PSEOF: Unexpected EOF
編集:ここでの質問に関連して、問題は xref テーブルにあると示唆する人もいます。そのエラー トレースには「予期しない EOF」とは記載されておらず、「EOF マーカーが見つかりません」と記載されているため、納得できません。このような解決策は、基本的に、現在存在する Python パッケージは PDF ファイル標準である混乱を解析するのには適していないという点で有効である可能性があります。