PDFのメタデータ編集の備忘録
日頃仕事が少し落ち着いているときにしかコードがかけない、永遠の初心者プログラマーのため、ちょっと学んだ知識を忘れないように記録していきます。
あくまでも「初心者」の覚え書きです。
と言うことで、最近書いたPDFのメタデータを編集する時の備忘録。
やりたかったこと
自炊したPDFファイルにタイトルと作者の情報を付加しもページレイアウトも表紙付き見開きにすること。
まずやってみたこと
PDFのメタデータの編集くらいrubyでちゃちゃっと出来るんだろう、と探してみましたが、案外「簡単」には出来ない様子。origamiやmini_exiftool、pdf-readerを使ってみましたが、どうも自分の実力では上手く行かず。
で、rubyは諦めてpythonで何か無いかと探すことに。
次にやってみたこと
pythonで何が良いもの有るかなぁと探してみるとPyPDF2が良いとのこと。
下記のサイトにたどり着きなんとか目的を果たせました。
詳しくは上記のサイトを参照…だけではメモにならないのでwもう少し詳しく流れを書いておきます。
まずはPdfFileReaderオブジェクトにPDFの読み込み。
このPdfFileReaderオブジェクトはメタデータを変更しても保存は出来ないので、保存用にPyPDF2.PdfFileWriterオブジェクトを用意しcloneReaderDocumentRootメソッドでPdfFileReaderオブジェクトの中身をコピーする。
メタデータはそのままではコピーされないので、getDocumentInfoメソッドで元のメタデータを取得して変更・追加、PyPDF2.PdfFileWriterオブジェクトのaddMetadataメソッドでメタデータを設定する。
そして私的には重要だったページの表示形式をsetPageLayoutメソッドで'/TwoPageRight'に設定。
これでページ表示が「見開きページ表示で表紙を表示」に設定されます。
import PyPDF
pdf = PyPDF2.PdfFileReader('foge.pdf') # pdfの読み込み
mod_pdf = PyPDF2.PdfFileWriter() # 保存用 pdf
info = pdf.getDocumentInfo() # メタデータの読み込み
d = {key: info[key] for key in info.keys()} # 辞書形式に変換?
d['/Title'] = 'title' # タイトル
d['/Author'] = 'author' # 作者
d['/Subject'] = 'subject' # サブタイトル
mod_pdf.cloneReaderDocumentRoot(pdf) # 読み込んだPDFの内容を保存用にコピー
mod_pdf.setPageLayout('/TwoPageRight') # 表示形式の設定
mod_pdf.addMetadata(d) # メタデータの設定
with open('mod_foge.pdf','wb') as f: # 変更した内容で保存
mod_pdf.write(f)
保存する時はファイルストリーム?を渡さないといけないらしいので最後の行のように書くみたい(コピペ)。
大体こんな感じです。
python初心者でもこれくらいの行数で最低限の目的は達成しました。
ちょっとした問題点
さて、上記のコードでほぼ問題なく出来た…はずなんですが、元PDFによっては作者の項目がプロパティに反映されません…
PyPDF2のバージョンは1.26.0です。
また、全く反映されないか…と言うと、反映されるファイルもありました。
それは昔BOOKSCANでスキャンしてもらったデータでした。
これは憶測ですが
メタデータはMetadata StreamsかDocument Information Dictionaryに格納される。
のですが、XMPデータにメタデータを記録するようです。が、addMetadataメソッドはあくまでもDocument Information Dictionaryを書き換えているだけでXMPデータまでは書き換えてくれない模様。
で、ここで謎なのはXMPデータをそもそも持っていないPDFはaddMetadataメソッドするだけで「作者」データを反映してくれるのですが、XMPデータがあると「作者」データは反映してくれないっぽいところ。でもタイトルとサブタイトルはちゃんと反映してくれるというややこしい状態…。
現状PyPDF2ではxmpMetadataを変更する術が内容ですので、中途半端ですがもうしょうが無いw。
それでもとりあえず大量に溜まった自炊データの整理には役に立ちましたのでよしとしています。