macOSのPDFサポートに満足している?

PDF(Portable Document Format)はAdobe Systemsが開発した文書フォーマットであり、登場以来無償配布されていたものの、当初はプロプライエタリな規格だった。しかし2008年にはISO 32000-1として標準化、自由な実装が可能になると状況は大きく変わる。PDFがさまざまな国・地域の公認フォーマットに採用されている背景には、PDFのオープン化があるというわけだ。

PDFの普及にあわせ、さまざまなPDFビューアや編集ツールが登場するなかで、我らがmacOSはシステム標準の機能としてPDFをサポートし続けている。しかし、Preview.appのPDF編集機能で満足できているかといえば……あともう一息、と感じてしまう場面もあるはずだ。

そこで今回紹介するのが「PDFtk」。PDFの編集機能を持つクライアント/サーバ型の実装系で、PDFの結合や分割、並べ替え、回転といった処理を行うことができる。いくつかの機能はPreview.appと重複するが、ありそうでなかったものが少なくない。それをフリーウェアとして提供するのだから、活用しない手はない。

まずは、以下のURLから「PDFtk Server」をダウンロードしてみよう。名称にサーバとあるが、処理には同梱のクライアント(pdftkコマンド)を利用するので問題はない。ただし、PDFtk Serverのページにある「Mac OS X Download」のバナーからではなく、ここからダウンロードすること。バナーにリンクされているパッケージはOS X 10.8(Mountain Lion)までのもので、現行のmacOS Sierra(v10.12.4、SIP有効)では動作しないはずだ。

「PDFtk Server」のインストーラ。Sierra向けパッケージを利用すること

PDFtkはこう使う

PDFtk Serverをインストールすると、Terminalで「pdftk」コマンドを利用できるようになる。基本的な書式は以下のとおり、最初の引数に与えたPDFに対しさまざまな内部コマンドで加工を行い、最終段で「output XXX.pdf」のように記述し別のPDFとして書き出す、という流れだ。

$ pdftk TaegetPDF <内部コマンド1> <argument1> output OutputPDF

このpdftkコマンド、基本的なパターンをいくつか覚えてしまえば、Preview.appが対応していない処理や有償PDF編集ソフトでなければ難しかった処理が可能になる。論より証拠、いくつかの実例で使いかたを解説してみよう。

ファイルを添付する/取り出す

Preview.appは対応していないが、Adobe Readerなど一部のPDFビューアは「ファイルの添付」に対応している。PDFを開くことはできるが、添付ファイルの存在は無視されてしまうのだ。しかし、TeXからPDFを生成したときや、文書で使用した写真の別バージョンがあるときなど、PDFと一体で配布できるほうがありがたい。

このPDFにおけるファイル添付/取り出しは、pdftkコマンドを使えばかんたんに処理できる。使用する内部コマンドは添付するときが「attach_files」、取り出すときが「unpack_files」だ。以下のコマンド実行例では、MYNAVI.pdfにJPEG(DSCF3551.jpg)を添付してadd.pdfとして書き出す処理、PDF(add.pdf)から添付ファイルをtempフォルダに書き出す処理をそれぞれ実行している。

$ pdftk MYNAVI.pdf attach_files DSCF3551.jpg output add.pdf


$ pdftk add.pdf unpack_files output temp

Adobe ReaderでJPEGファイルが添付されたファイルを閲覧したところ。Preview.appは非対応だが、あると便利な機能だ

PDFをページ分割する

ページが複数あるPDFの各ページを分離したいとき、Preview.appでもサムネイル欄からデスクトップへドラッグ&ドロップすることで対応できるが、ファイル名が「○○○(ドラッグされました).pdf」となってしまいリネーム作業に手間がかかる。ページの数だけドラッグ&ドロップしなければならないのも面倒だ。

これを一括処理するには、以下のとおりpdftkコマンドを実行する。使用する内部コマンド「burst」に引数は不要だが、出力するページのナンバリングには工夫が必要。ここでは、tempディレクトリ以下に2桁の連番が付くよう設定しているが(page_01.pdf、page_02.pdf...)、3桁にしたければ「%03」、1桁で足りるのならば「%01」に変更してほしい。

$ pdftk MYNAVI.pdf burst output temp/page_%02d.pdf

PDFの各ページを分割してフォルダに出力してみた