インターネットからこすり落とした PDF からテキストを抽出しようとしていますが、それらをダウンロードしようとするとエラーが発生します。
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py", line 124, in get_pages
raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)
PDFTextExtractionNotAllowed: Text extraction is not allowed <cStringIO.StringO object at 0x7f79137a1ab0>
私はstackoverflowをチェックしましたが、このエラーが発生した他の誰かが、PDFがパスワードで保護されていることを発見しました。ただし、Mac のプレビューから PDF にアクセスできます。
いずれにせよ、プレビューは保護された pdf を表示する可能性があると誰かが言ったので、Adobe Acrobat Reader でファイルを開いても、pdf にアクセスできました。
以下は、私が PDF をダウンロードしているサイトの例です: http://www.sophia-project.org/uploads/1/3/9/5/13955288/aristotle_firstprinciples.pdf
PDFを手動で開き、PDFとして同じファイルパスに再エクスポートすると(基本的に元のファイルを「新しい」ファイルに置き換える)、そこからテキストを抽出できることがわかりました。サイトからダウンロードすることと関係があると思います。次のように、単に urllib を使用して pdf をダウンロードしています。
if not os.path.isfile(filepath):
print '\nDownloading pdf'
urllib.urlretrieve(link, filepath)
else:
print '\nFile {} already exists!'.format(title)
また、ファイルを新しいファイルパスに書き直そうとしましたが、それでも同じエラーが発生しました。
if not os.path.isfile(filepath):
print '\nDownloading pdf'
urllib.urlretrieve(link, filepath)
with open(filepath) as f:
new_filepath = re.split(r'\.', filepath)[0] + '_.pdf'
new_f = file(new_filepath, 'w')
new_f.write(f.read())
new_f.close()
os.remove(filepath)
filepath = new_filepath
else:
print '\nFile {} already exists!'.format(title)
最後に、テキストを抽出するために使用している関数を次に示します。
def convert(fname, pages=None):
'''
Get text from pdf
'''
if not pages:
pagenums = set()
else:
pagenums = set(pages)
output = StringIO()
manager = PDFResourceManager()
converter = TextConverter(manager, output, laparams=LAParams())
interpreter = PDFPageInterpreter(manager, converter)
infile = file(fname, 'rb')
try:
for page in PDFPage.get_pages(infile, pagenums):
interpreter.process_page(page)
except PDFTextExtractionNotAllowed:
print 'This pdf won\'t allow text extraction!'
infile.close()
converter.close()
text = output.getvalue()
output.close
return text
プレビューでファイルを手動で再エクスポートするのではなく、プログラムでこれを解決する方法はありますか?