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で別途保存します。
その後の検証にて、問題のPDFを保存し直してみました。保存中に「重複するバックグラウンドを統合中」というメッセージが表示されました。そのPDFを使うと、エラーは出なくなりました。
その後の実装で、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 "他のPDFでは、問題なく処理できるのに、処理をしたい該当のPDFでエラーが発生します。PDFの内容自体に問題がありそうな感じです。", 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内テキストを取得するスクリプト
temp = input1.getPage(0).extractText()日本語を含むPDFをいくつか検証したのですが、全く取得できないものから、部分的に取得できるもの、取得できるけど出現位置がバラバラなものとかがありました。日本語エンコードの問題は根が深そうなので、PyPDF2を使った処理は、あきらめて、別の実装で処理をしました。
0 件のコメント:
コメントを投稿