高森太郎のノート

このページについて

このページは、高森太郎がノート的に何でも書くページです。
主に勉強したこと、自分が知った知識や方法などを中心に、適当に、メモ的に、書き留めてます。

 | 

2016年06月10日 (金曜日)

[]PDFの中身(コンテンツやJavascript)を手動で修正しやすくする「qdf」を作るには PDFの中身(コンテンツやJavascript)を手動で修正しやすくする「qdf」を作るには - 高森太郎のノート を含むブックマーク はてなブックマーク - PDFの中身(コンテンツやJavascript)を手動で修正しやすくする「qdf」を作るには - 高森太郎のノート

背景

PDFはきちっとテキストエディタで書けば、実は手書きも可能な優秀なフォーマットなのだが、実際にはプログラムから出力されることが圧倒的に多い。

ただ、中身を確認したり、テキストエディタで修正をかけたりしたい場合がある。特に特殊なPDFを扱うライブラリやソフトなどを使うほどではない簡単な修正などはこちらの方が早い事もある。

さらに、PDFにはJavascriptを内蔵できるのだが、このJavascript、実はバージョンごとに結構な仕様の差があり*1、動かない事がしばしばある。昔作ったものの、中身を確認して修正をかけなければいけない事がある。*2

この場合、単純にPDFをテキストエディタで開くだけだと、通常はコンテンツの圧縮や、ストリーム化*3がされているとそのままでは読めない。

そこで、エディタで修正しやすく分解する。

手法

qpdfを使わせて頂く。(Artistic License 2.0のオープンソースソフトウエアである)

http://qpdf.sourceforge.net/

このようなライブラリを作り、公開してくださる作者の方に感謝しながら、利用させて頂く。

単純には

qpdf --qdf <元のPDFファイル> <出力するファイル名>

とするだけでよい。そうするとテキストエディタで読み込むことができる。

このとき、日本語などの多バイト文字が設定されている場合には、文字コードを適切に(UTF-8など)にする必要がある。

このqdfモードに変換されたデータは、全てPDFの仕様に従っているわけではないものの、そのままPDFとして観覧が可能である。

元に戻すには、

qpdf --object-streams=generate <qdfモードにしたPDFファイル> <出力するファイル名>

とするなど、もう一度qpdfを通すと元に戻る他、同梱されているParlのスクリプト「fix-qdf」でも戻せるようだ。

そのほか

qpdfには他にもいろいろな機能があり、無償ライブラリながら暗号化をかけることができる。他の暗号化できるライブラリだと可能でも最新の規格に合っていなかったりすることがあるが、鍵長が256bitと言う強力な暗号化も利用でき、ありがたい。

qpdf --encrypt <ユーザーパスワード> <オーナーパスワード> <鍵長( 40, 128, or 256) <暗号化オプション> <元のPDFファイル> <出力するファイル名>

オプションはたくさんあるので、--help などしてヘルプの参照をしてほしい。

解除するときは

qpdf --password=<パスワード> --decrypt <元のPDFファイル> <出力するファイル名>

で可能だが、当然ながらユーザーパスワードとオーナーパスワード、両方のパスワードを忘れると原則的には逆立ちしても開けなくなるので、パスワードをつけるときはもとのパスワードをつけていないデータは残しておくこと。*4

*1:主にセキュリティの強化のためだと思われる。以前だと外部と無秩序に通信するコード、他のファイルを操作するコードとやりたい放題だったが、だんだんと仕様が集約されてセキュリティ的にやばげな機能は使えなくされている様だ。その結果、以前はデフォでjavascriptが無効化されていた時代もあったが、今は復帰した模様

*2:そもそもそんなクソコード書いてんじゃねえよ、と言う突っ込みは間に合っておりますのでご遠慮申し上げます

*3:Webで読み込むときにより早く読めるようにする処理。PDFの中には全部読み込んでからではないと表示できない奴と、最初のページから読み込み順に順番に表示できるものがあるが、順番に表示できるものがストリーム化が施されている。Adobe純正のAcrobatで作るとデフォルトではストリーム化がされるが、他の作成ソフトではこれができないことがあって結構な差だったりする

*4:オーナーパスワードを忘れただけならば、上のコマンドのパスワードにユーザーパスワードを入れるとリカバリが可能ではある。ユーザーパスワードは設定なし、オーナーパスワードだけを忘れたケースならば、--password=は省略してもリカバリが可能。両方忘れるともうqpdfではリカバリ不能

 | 
ページの一番上へ