
PDFフォーマットのお勉強
国会図書館デジタルコレクションから印刷したpdfは、プロテクトがかかっていて、Macだとプレビューで簡単に開けるのに、他のソフトでごにょろうと思うと動かなかったりするの何故だろう。
と思って、PDFのフォーマットに、どんな仕掛けをしているのか調べてみた。
結果
一応、jpgを連番でそのままのデータで抜き出すところまでは理解できた。
どんな仕掛けだったか
pdfには、所有者パスワードと使用者パスワードの2つがつけられるようになっている。
このうち、所有者パスワードを秘匿しておいて、編集の権限はこちらに持たせる。使用者パスワードはデフォルトのものにしておいて、閲覧などはこちらにも権限があるようにする。
ファイルのビュアーは、正しく実装されていれば、暗号化されたpdfを開くときに、デフォルトのパスワードで試しに開いてみて開けたら、内容が表示できるという仕組みだった。
開けないソフトは何してるの
どうやら、最新のフォーマットで暗号化されているらしく、一番新しい仕様書を見ないと暗号化のフォーマットが分からなかった。
特にはまったのは、AESの暗号化を、CBCとECBモード、128bitと256bitが入り乱れてるので、人のソースを見て実装しようとした時に、ここを間違えてなかなか進まなかった。
暗号化を解けば後は普通のPDF
印刷したPDFは、画像が単に1ページにそれぞれ貼り付けてあるだけの構造なので、指定されている画像(jpeg)を順番にファイルに書き出すだけ。
(追記)実行ファイル(Mac用)
GitHubのファイル見てもコンパイルわからないぜ、って場合は、コンパイル済みのファイルを用意したので
ターミナルを開いて、以下のようにtarコマンドでファイルを展開し、展開して出てきたpdfextractを実行します。同じフォルダに、page0001.jpgのように展開されます。
tar xvf pdfextract-v1.0-arm64.tar.gz
./pdfextract digidepo_12584908_0001.pdf
ここで、digidepo_12584908_0001.pdfはダウンロードしてきたpdfファイルを指定します。同じフォルダに置いておくとやりやすいでしょう。
複数に100ページ以上は、分割するしかないので
./pdfextract digidepo_12584908_0001.pdf
./pdfextract digidepo_12584908_0002.pdf 100
./pdfextract digidepo_12584908_0003.pdf 200
という風に、ファイル名の後ろに、いっこ前のページ番号の最後を入れると連番が続きから生成されます。