PDFドキュメントをフラット化する方法 - Ghostscriptで情報を完全消去するチュートリアル
先日、Plasmaデスクトップの標準PDFビューアであるOkularを使って情報を黒塗り(リダクション)する方法をご紹介しました。操作自体は比較的簡単ですが、実はこの方法では黒塗りした情報が完全に破棄されるわけではなく、単に表示上見えなくなるだけなのです。
今回ご紹介するのは、その続きにあたる「PDFのフラット化」です。複数レイヤーを持つ画像を、レイヤー情報のない形式で保存することをイメージしてみてください。縦に重なったすべてのピクセル値が計算・合成され、ひとつの確定した結果として単一レイヤーに統合されます。PDFも同様の仕組みですが、その構造上、より複雑になっています。それでは始めましょう。
必須ツール - Ghostscript
Ghostscript(gs)という名前を聞いたことがあるかもしれません。これまでLaTeXやLyX関連の記事でも何度か取り上げてきました。今回はgsエンジンを使って、既存の「多層構造」のPDFをフラット化し、黒塗りした情報を適切に消去します。作業はLinuxで行います。Linuxは他のOSと比べて、ファイル形式の処理といった特定の集中的なタスクが非常に得意だからです。Ghostscriptは多くのディストリビューションで利用可能であり、インストールされていない場合はリポジトリから入手できます。
gs -sDEVICE=pdfwrite -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -sOutputFile=flattened.pdf input.pdf
このコマンドこそが魔法の正体です。PDF内の画像に対しては追加の処理を行わないため、ファイルサイズが大幅に減ることは期待しないでください。そもそもそれが目的ではありません。しかし実質的には、これだけで作業は完了です。
代替手段 - ImageMagickとpdf2ps
何らかの理由で上記の方法に満足できない場合は、別のアプローチを2つ試すことができます。ただし、筆者が試した限り、これらはgsを使うよりも効果が低かった点にご留意ください。
ImageMagickのconvertコマンドを使う
まず、ImageMagickのconvertユーティリティを試す方法です。ただし、その前に注意点があります。
convert -density 300 original.pdf flattened.pdf
デフォルトでは、Ghostscriptエンジンのセキュリティ脆弱性への対策として、ImageMagickはPS、PDF、EPS、XPSなどの各種ファイルを処理しないよう設定されています。ポリシーを編集せずに実行すると、次のようなエラーが表示されます。
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert-im6.q16: no images defined `flattened.pdf' @ error/convert.c/ConvertImageCommand/3258.
これを解決するには、次のファイルを編集します。[NUMBER]の部分は、使用中のバージョンに応じて6または7に置き換えてください。
/etc/ImageMagick-[NUMBER]/policy.xml
このファイルには、セキュリティポリシーのリストが含まれています。
...
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
</policymap>
PDFに関する行を変更し、rights="none" を rights="read|write" に書き換えます。セキュリティが気になる場合は、対象ファイルをフラット化している間だけ一時的に変更し、作業後により厳格な設定へ戻すことも可能です。
...
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="read|write" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
</policymap>
これでファイルを処理できるようになります。ただし、通常はgsを直接使う場合よりも時間がかかります。さらに、非常に大きなファイルを扱う場合はメモリ不足に陥り、変換に失敗することがあります。たとえば次のようなエラーです。
convert-im6.q16: cache resources exhausted `flattened.pdf' @ error/cache.c/OpenPixelCache/4083 `flattened.pdf' @ error/pdf.c/WritePDFImage/2341.
この場合も、XML設定ファイルを編集し、各ポリシーのメモリ制限を引き上げる必要があります。しかし、システムの利用可能なメモリに対してドキュメントが大きすぎるケースもあり得ます。残念ながら、万能の「魔法の設定値」は存在しません。
...
<policy domain="resource" name="memory" value="2048MiB"/>
<policy domain="resource" name="map" value="4096MiB"/>
<policy domain="resource" name="width" value="256KP"/>
<policy domain="resource" name="height" value="256KP"/>
<policy domain="resource" name="area" value="1024MB"/>
<policy domain="resource" name="disk" value="4GiB"/>
...
pdf2psとps2pdfの組み合わせを使う
2つ目のツールは、pdf2psとps2pdfのペアです。基本的には、PDFを一度PSファイルに変換してから再びPDFへ戻すことで、実質的にドキュメントをフラット化します。その魔法のコマンドがこちらです。
pdf2ps original.pdf - | ps2pdf - flattened.pdf
この方法は正常に動作し、処理も高速です。ただし、デフォルト設定では積極的な圧縮が行われるため、画像が低解像度になる点に注意が必要です。この点を踏まえ、各ツールのさまざまなオプションを試しながら、必要な文書品質を維持できるように調整しましょう。
まとめ
以上で完了です。これでPDFファイルをフラット化する方法を習得できました。背後にある技術的な仕組みの詳細は本記事の範囲を超えますが、少なくとも作業を完了させるための道具は揃いました。筆者の経験では、Ghostscriptが最速かつ最も効果的で、最高の結果をもたらしてくれます。
もちろん、紹介したもう2つのユーティリティ、ImageMagickやpdf2ps/ps2pdfの組み合わせも試す価値はあります。ただし、筆者自身はその結果にあまり満足できませんでした。いずれにせよ、PDFファイルを第三者と共有する必要があり、そこに含まれる機密情報の一部を確実に黒塗りしたい場合、今回の2部構成チュートリアルでその課題を解決できます。この第2弾のガイドで全体像が完成しました。それではまたお会いしましょう。
それでは、良いLinuxライフを。
-
KVMのストレージ管理を徹底解説!ストレージプールとボリュームの作成チュートリアル
さて、先日、Kernel-based Virtual Machine(KVM)という技術をご紹介しました。KVMは無料かつオープンソースの仮想化ソリューションで、VirtualBoxやVMware製品の代わりとして、あるいはそれらと併用して使うこともできます。前回は基本的な管理操作を扱いましたが、ストレージとネットワークについては別のチュートリアルに回すことにしました。 今回は、KVMにおけるストレージ管理について、より踏み込んだガイドをお届けします。内容はVirtualBoxで行ったものと似ており、仮想ディスクの追加・縮小・拡張などが含まれます。さらに、NFSストレージやNTFSフォーマット
-
VirtualBoxでディスクをクローンする方法【VBoxManage活用チュートリアル】
仮想化を業務でも趣味でも利用している方なら、VirtualBoxという強力かつ多用途な無料ソリューションを目にしたことがあるかもしれません。VirtualBoxは、デスクトップユーザーに対して、あらゆる形でOSを展開できる大きな柔軟性を提供してくれます。さらに、単なる趣味として仮想化を楽しんでいるだけでなく、仮想化を通じて新しいOSを学ぼうとする熱心なソフトウェア愛好家の方であれば、次のような場面に必ず直面することでしょう。それは「大量の仮想マシンを展開する必要がある」というシナリオです。一台ずつインストール作業を行う時間的な余裕はないはずです。実際、大規模に環境を展開する際に手動で一つずつマ