本講座では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明朝'