本講座ではPyPDF2モジュールを利用してPDFファイルの読み込みと保存を行っています。この時に読み込むPDFの原稿によっては警告(Waring)エラー(Error)が生じる場合があります。

ここではPDFの原稿が原因で生じる「警告(PdfReadWarning)」と「エラー(PdfReadError)」の対処方法について説明します。

PdfReadWarning
警告例
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected.

PDF原稿の厳密には構文の仕様を満たしていない場合に警告されます。この例では、PDF内部の「Xref table(クロスリファレンス・テーブル)」に仕様に反する部分があることを指摘しています。

エラーではなく警告なので、通常は正常に処理されます。そのままにしても、普通は問題ありませんが、以下のようにPDF読み込み時にstrict=Falseを指定すると表示されなくなります。

pdf_reader = PyPDF2.PdfFileReader("sample.pdf", strict=False)
PdfReadError
エラー例
PyPDF2.utils.PdfReadError: Illegal character in Name Object

これはWordで作成したPDFを読み込むとよく生じるエラーです。原因は、PDF内部に入力された「フォント名の日本語」のエンコードの不一致です。

WordでPDFを保存すると、フォント名はShift_JISでエンコードされてしまいます(Word2010で確認)。PyPDF2はUTF-8でデコードするためエラーが生じます。

対策として手っ取り早いのはWordのフォントを「Yu Gothic UI」のように日本語を含まない名前のフォントに変更してからPDFに保存することです。つまり「MS 明朝」などを使用しないことです。

参考

参考までにエラーで捕獲した部分のエンコードを確認したコードは以下のようになります。このように「MS 明朝」のような日本語名のフォントがあるとShift_JISでエンコードされているためにエラーになります。

>>> name_obj = b'/ABCDEE+\x82l\x82r#20\x96\xbe\x92\xa9'
>>> name_obj.decode("utf-8")Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 8: invalid start byte>>> name_obj.decode("cp932")
'/ABCDEE+MS#20明朝'