大阪サテライトのLT、次は @t_motooka さん!! #シェル芸 pic.twitter.com/Jm41XwhLOQ
— くんすと (@kunst1080) 2016年10月29日
先日開催された「第25回 #シェル芸 勉強会」のLT(大阪編)でしゃべった内容を、ここで紹介します。
#大げさなタイトルですが、世の中は広いものです。先駆者はどこかにきっと居られることでしょう。
目標
標準入力や標準出力を受け渡しするための仕組み パイプ はテキストデータだけでなく、バイナリデータも流すことができます。
一般的なシェル芸においては当然ながら大半の用例が、テキストをパイプで流すというものですが、バイナリデータを流すときのノウハウも蓄えていきたいと思います。
空っぽのPDFを作る
これはImageMagickの convert
コマンドで実現可能です。
$ convert xc:none -page A4 a.pdf
ImageMagickの convert
は、画像ファイルを変換するコマンドです。基本的には、入力画像を与えて、変換処理の内容を与えて、出力先を指定して実行します。上記の例で言えば 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を詠む会と化してきた大阪サテライト #シェル芸
— nmrmsys (@nmrmsys) 2016年10月29日
標準入力から受け取ったPDFでゴニョゴニョ
次は、標準入力から受け取ったPDFの加工です。
よく使われるのは gs
コマンドこと GhostScript ツールです。
入力元のオプションとして -_
を与えると標準入力から受け取ってくれるという情報がありますが、まだ検証中です。
ここから先は実験中なので、また成果がまとまり次第報告したいと思います。正直なところ、現時点では上手く行ってません。
お楽しみに!
感想(追記@2016/10/30 15:53頃 JST)
パイプを流れるPDF、gsコマンド(GhostScript)に流したり、convert(ImageMagick)に流したり、sedでスクレイピング的なことをやったり、色々と応用が見えてきて、考えるだけで相当楽しい。 #シェル芸
— T.Motooka (@t_motooka) 2016年10月30日
実験に使った環境
- MacBook Air 11" (2014年モデル)
- VirtualBox
- Ubuntu 16.04
- 標準の apt-get でインストールできる ImageMagick, GhostScript
書籍紹介コーナー
この本を読めば、$ cat hoge.pdf
とかしちゃっても戸惑うことは減るはずです。
- 作者: John Whitington,村上雅章
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/05/25
- メディア: 単行本(ソフトカバー)
- クリック: 166回
- この商品を含むブログ (9件) を見る
こちらの記事でも紹介してます => さぁ、PDF手書きの世界へ。 - 職業プログラマの休日出勤