2013/08/31

PythonのPDFライブラリPyPDF2で、PDFのページを抽出して保存する方法

PyPDF2というPythonのPDFライブラリがあります。Pythonを使って、PDFファイルを操作することの出来るライブラリです。PDF内のページを抽出したり、ページをマージしたりすることが出来ます。

PyPDF2
http://www.blog.pythonlibrary.org/2012/07/11/pypdf2-the-new-fork-of-pypdf/


下記のスクリプトで、PDFの抽出、保存が出来ます。

someone.pdfというPDFを読み込み、読み込んだPDFの5ページ目を取り出します。取り出したPDFをdocument-output.pdfというPDFで別途保存します。
from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input1 = PdfFileReader(open("someone.pdf", "rb"))

page5 = input1.getPage(4)
output.addPage(page5)

outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
今回、やりたい事は、PDFを抽出したあと、PDF内のテキストを抽出して、その中にある特定の数字情報を使って、そのPDFの保存名に使いたい というものです。その操作をしたい該当のPDFを使って、上記のスクリプトを実行させると、下記のエラーが発生します。
Traceback (most recent call last):
  File "", line 1, in 
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 274, in write
    self._sweepIndirectReferences(externalReferenceMap, self._root)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 351, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 327, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 351, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 327, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 336, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, data[i])
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 351, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 327, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 366, in _sweepIndirectReferences
    newobj = self._sweepIndirectReferences(externMap, newobj)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 327, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 327, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 357, in _sweepIndirectReferences
    newobj = data.pdf.getObject(data)
  File "/Library/Python/2.7/site-packages/PyPDF2/pdf.py", line 900, in getObject
    retval = readObject(self.stream, self)
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 847, in readObject
    return DictionaryObject.readFromStream(stream, pdf)
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 1348, in readFromStream
    value = readObject(stream, pdf)
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 838, in readObject
    return ArrayObject.readFromStream(stream, pdf)
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 933, in readFromStream
    arr.append(readObject(stream, pdf))
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 867, in readObject
    return NumberObject.readFromStream(stream)
  File "/Library/Python/2.7/site-packages/PyPDF2/generic.py", line 1032, in readFromStream
    return NumberObject(name)
ValueError: invalid literal for int() with base 10: ''
他のPDFでは、問題なく処理できるのに、処理をしたい該当のPDFでエラーが発生します。PDFの内容自体に問題がありそうな感じです。



その後の検証にて、問題のPDFを保存し直してみました。保存中に「重複するバックグラウンドを統合中」というメッセージが表示されました。そのPDFを使うと、エラーは出なくなりました。

その後の実装で、PDF内のテキストを取得して処理をしたかったのですが、日本語の取得が上手くできませんでした。英語のテキストでは問題なく取得できます。

PDF内テキストを取得するスクリプト
temp = input1.getPage(0).extractText()
日本語を含むPDFをいくつか検証したのですが、全く取得できないものから、部分的に取得できるもの、取得できるけど出現位置がバラバラなものとかがありました。日本語エンコードの問題は根が深そうなので、PyPDF2を使った処理は、あきらめて、別の実装で処理をしました。

0 件のコメント:

人気の投稿 (過去 30 日間)