職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

パイプを通るPDF(実験中) 〜 #シェル芸 の新たなる境地へ


先日開催された「第25回 #シェル芸 勉強会」のLT(大阪編)でしゃべった内容を、ここで紹介します。

#大げさなタイトルですが、世の中は広いものです。先駆者はどこかにきっと居られることでしょう。

目標

標準入力や標準出力を受け渡しするための仕組み パイプ はテキストデータだけでなく、バイナリデータも流すことができます。
一般的なシェル芸においては当然ながら大半の用例が、テキストをパイプで流すというものですが、バイナリデータを流すときのノウハウも蓄えていきたいと思います。

空っぽのPDFを作る

これはImageMagickconvert コマンドで実現可能です。

$ convert xc:none -page A4 a.pdf

ImageMagickconvert は、画像ファイルを変換するコマンドです。基本的には、入力画像を与えて、変換処理の内容を与えて、出力先を指定して実行します。上記の例で言えば xc:none が入力で、-page A4 が変換処理の内容(出力形態)、a.pdf が出力先に相当します。
この xc:none は、空っぽの画像を表すようです。テキストデータに例えると /dev/null とも言えるかもしれません。

xc:none については、ここで知りました。
unix.stackexchange.com

空っぽのPDFを標準出力に吐く

convertの結果を標準出力に吐く方法を調べようとしましたが、ImageMagickは通常、出力先のファイル名の拡張子を見て出力フォーマットを決定しています。標準出力にそのまま吐こうとしてもPDFであることを強制できないのではないか?という疑問が湧きます。
この点についてググると、次のようなものがヒットしました。
forcing output file format on stdout - ImageMagick
出力先に jpeg:- と指定するとJPEGで標準出力に出すことができるそうです。ならば pdf:- によってPDFが標準出力に吐かれるはずだ!と推測して試したところ、無事に吐くことができました。

$ convert xc:none -page A4 pdf:- > a.pdf

ここではリダイレクトを使ってファイルを出力していますが、これでファイルが吐かれていれば標準出力からデータが出ていることの確認になります。PDFのファイルフォーマットに慣れ親しんだ方であれば、次のような検証も有効でしょう。

$ convert xc:none -page A4 pdf:- | head

標準入力から受け取ったPDFでゴニョゴニョ

次は、標準入力から受け取ったPDFの加工です。
よく使われるのは gsコマンドこと GhostScript ツールです。

入力元のオプションとして -_ を与えると標準入力から受け取ってくれるという情報がありますが、まだ検証中です。
ここから先は実験中なので、また成果がまとまり次第報告したいと思います。正直なところ、現時点では上手く行ってません。
お楽しみに!

感想(追記@2016/10/30 15:53頃 JST

実験に使った環境

書籍紹介コーナー

この本を読めば、$ cat hoge.pdf とかしちゃっても戸惑うことは減るはずです。

PDF構造解説

PDF構造解説

こちらの記事でも紹介してます => さぁ、PDF手書きの世界へ。 - 職業プログラマの休日出勤