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を使った処理は、あきらめて、別の実装で処理をしました。

2013/08/29

モンスターズユニバーシティを観に行って(ネタバレ注意)

イオンモール倉敷のMOVIXにモンスターズユニバーシティを
観に行きました。


ストーリーを簡単に言うと、おなじみマイクとサリーが大学で出会い
友情を深めていくというストーリーです。

感想は、学長が、すごい変わっていた。
毎回だけど、マイクが写真にちゃんとうつっていない。(笑)

息子が私のブログに記事を書き出した3つの理由

2013/08/27 から、このブログに、息子(上の子)が、一緒に記事を書き始めました。


息子に、このブログのアフィリエイトの話をしたのが事の始まりです。アフィリエイトの仕組みを説明して、このブログのアフィリエイトの成果が、Amazonのギフト券として、いくらか貯まっていることを説明しました。その話を聞くと、「いいなー、お父さんだけ…」という話になり、「じゃあ、ブログに記事を書いて、記事へのアクセス数が100になったら、Amazonのギフト券をいくらか使わせてやる」ということになりました。

1つ目の理由
息子が、Amazonのギフト券を使いたいから


そうなると、上の子は目の色を変えて、ブログの記事を事を考え始めました。どんな記事なら、みんなが読んでくれるか。そういった事を真剣に考えだしました。まずは、自分の好きな事を書く事から始めたら、と助言しました。そうして書いた記事が「伊達政宗の秘密」です。戦国時代がとても好きなので、戦国ネタを沢山、書いていくと思います。

そもそも、キーボードもローマ字表を見ながらでないと、打てない感じだったのですが、一生懸命、文字入力をしています。キーボードで自由に入力できることは、今後、社会を生きていく上で、必須のスキルだと思うので、早く本気で覚える気になったのは、いいことだと思います。

2つ目の理由
息子にキーボートの操作に早く慣れてもらいたいから


学校の授業でも、ブログについての授業があります。先日の授業参観が、その内容でした。その授業では、次のような説明がされていました。「ブログに自分や、知り合いの個人情報を書き込まないこと」「ブログは全世界に繋がっていて、自分は身内だけへの情報発信のつもりでも、みんなに見られていることを意識すること」「インターネット上には悪意を持った人がいるので、発言には注意をすること」など、です。

そういった内容を、言葉では分かっても、実践してみないと分からないこともあると思います。自分でブログを書いてみて、書いて良い事、悪い事を教える場があれば、良いと思っていました。

そういう思いもあったので、息子にブログを書かせて、ブログ上のモラル、常識みたいなものを説明していきたいと思います。

3つ目の理由
息子にネット上で書いても良い事、悪い事を実践で教えたいから


2日目には、「うちで飼っている金魚ネタ」を書きました。写真も自分で撮影をして、ブログへのアップロードも自分でしました。画像の加工は、まだ難しいので、私が手伝いました。

息子は、今、自分の記事へのアクセス数に、一喜一憂しています。

2013/08/28

おかやま木堂ふるさとまつりで買った金魚のその後

おかやま木堂ふるさとまつりで手に入れた金魚は、
5匹今も元気に泳いでいます。

あれからレイアウトをいじって、砂利や草をいれてみました。


数が増えるにつれて、ふんや水槽の汚れが増えて
そうじが大変になりましたが、


けれども、楽しみも増えたので、楽しいです。


このあいだ、九州旅行のとき、4日間いなかったので
自動エサやり機を買ってみました。


2013/08/27

伊達政宗の秘密

独眼竜で知られる伊達政宗は幼少のころ
天然痘という病気になった。
命だけはたすかったが、右目の視力を失ってしまう。
これがきっかけで、じつの母にきらわれてしまった。


僕は、母にきらわれていないので、
しあわせだなーと思いました。

伊達政宗に限らず、いろいろかきこんでいくので
よろしくおねがいします。

2013/08/25

関門橋、関門海峡を望む「めかりパーキングエリア」「みもすそ川公園」に行ってきました。

2013/08/11 ヤフオクドームを後にして、高速道路を通って、1時間半ほどで、関門橋に着きました。

めかりパーキングエリアからの眺め





関門橋を渡り、高速道路を降りて、「みもすそ川公園」に行きました。




公園内には源義経・平知盛の像があります。





源義経・平知盛の像の足元には、NHKの大河ドラマ「義経」のキャストの手形がありました。滝沢秀明(源義経役)、中越典子(建礼門院徳子役)、小泉孝太郎(平資盛役)。




この辺りは、幕末の攘夷戦で、外国船に砲撃した砲台跡でもあったため、長州砲のレプリカ5門などがあります。




途中、コンテナをたくさん積んだタンカーが、関門橋の下を通って行きました。でかくて速かったです。



「みもすそ川公園」を最後に、観光を終えて、家路につきました。

ヤフオクドームの王貞治ベースボールミュージアムを観に来ました。

2013/08/11 旅行の4日目、ヤフオクドームの王貞治ベースボールミュージアムを観に来ました。


9:00過ぎには、 ヤフオクドームに着きました。




王貞治ベースボールミュージアムは、10:00からだったので、ヤフオクドームの周りをしばらく散策しました。



ヤフオクドームの周りには、有名人の手の彫刻のコーナーがあり、有名人と握手をすることができます。アントニオ猪木と握手。



王さんと握手



マイケル ジャクソンと握手


王貞治ベースボールミュージアムに入ると、球場で、中学生の大会をやっている様子を見ることが出来ました。





展示内容の説明をしてくれる「王貞治ベースボールミュージアムのiPhoneアプリ」の入ったiPhoneを無料で貸し出していたので、上の子が借りました。そのアプリには、展示内容の説明の「音声ガイド」だけでなく、「館内マップ」、野球に関するゲームも入っていました。


王貞治歴史館から観ました。王さんの少年時代から、甲子園、プロ野球での活躍、そしてホームラン王へ成長していった歴史を、昭和の雰囲気のなかで再現しています。










王貞治記録館では、現役生活22年間で築き上げた記録のトロフィーや表彰盾など、すべて実物が展示されていました。


子どもたちが盛り上がったのは、「89スタジオ」のコーナーでした。

体験ステージ(動体視力測定)


握力測定



リードチャレンジ プロの選手の牽制球に挑戦できます。



ピッチングチャレンジ 投げたボールのスピードが表示されます。


バッティングチャレンジ バッティングスピードが表示されます。


選手の使用グローブ


時間を忘れて、子どもたちは、アトラクションをやっていました。上の子は、動体視力測定で、良い結果が出ないことをすごく悔しがっていました。またやりたいというので、岡山でも、動体視力測定のできるアトラクションがあるかどうかを調べてみます。

昼前に、ヤフオクドームを後にしました。

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