13

インターネットからこすり落とした 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

プレビューでファイルを手動で再エクスポートするのではなく、プログラムでこれを解決する方法はありますか?

4

5 に答える 5