ImageMagick で PDF 作成時に日本語タイトルをつけるシェルスクリプト

この記事を読むのに必要な時間は約 7 分です。


当記事は、FreeBSD で ImageMagick を用いて PDF を作成する際に、文書のタイトルに日本語を設定されるようにするためのスクリプトを作成した際のメモです。

前回記事にて、無事 ImageMagick の convert コマンドを利用できるようになりました。
ImageMagick で 複数 PNG → PDF 変換時エラーに対処した時のメモ

スポンサーリンク
スポンサーリンク

当記事を 3行でまとめると…

  1. ImageMagick では、PDF ファイル作成時に、ファイル名から、文書のタイトルが自動セットされます。
  2. ImageMagick では、日本語ファイル名を指定して、タイトルに日本語をセットしようとすると、文字化けしてしまいます。
  3. pdftk を利用して、タイトルを後から再更新することで、日本語タイトルがセットされるように、スクリプトを作成しました。

出来上がったシェルスクリプト

フォルダ内にある PNG ファイルをまとめて PDF に変換するスクリプトになっています。エラー対処など行っておらず、動けば OK レベルのスクリプトです…。

使い方

この内容を適当なファイルに張り付けて、実行権限を与えましょう。例えば convert.sh だとします。

変換したい png ファイルが含まれているディレクトリに移動し、 convert.sh 日本語ファイル名 という形で実行します。

第一引数に、作成したいファイル名 (.pdf 拡張子は含めない) を指定すれば、「日本語ファイル名.pdf」 で、タイトルが「日本語ファイル名」と設定された PDF ファイルが出来上がります。

png 以外のファイルを対象とする場合は、スクリプト 5行目の TARGET 変数の辺りをちょちょいといじれば可能だと思います。お好みでカスタマイズしてお使い下さい。

ImageMagick のPDF タイトル文字化け

ImageMagick は、PDF 作成時に、PDF ファイル名を、文書のタイトルに設定します。以下の例の場合、タイトルは「1」が設定されます。

当初は、適当に 1.pdf で作成してファイル名を後から変更していました。

しかし、一部の PDF リーダー では、PDF ファイルのタイトルプロパティを読み取って一覧に表示します。そのため、PDF リーダー上は、全てのファイルがタイトル「1」で並んでしまいました…orz

それならば、と convert コマンドに日本語ファイル名を与えてみましたが、そうすると ImageMagck が対応していないようで、文字化けしてしまいます…。文字コード認識・変換違いではなく、ASCII 以外対応していないようです。

pdftk を用いれば、PDF のプロパティを編集できる

pdftk というコマンドがあり、こちらを用いると、PDF のプロパティのみの編集を行うことができます。

pdftk では、プロパティの更新の他に、プロパティの出力も可能です。

今回はタイトルのみを編集したいため、テキストファイルに出力し、テキストファイルを sed で編集し、それを読み込んで更新する流れにしています。

pdftk は、FreeBSD の場合、pkg からバイナリインストールが可能です。

簡単な pdftk の使い方

プロパティをテキストファイルに出力する

pdftk で PDF ファイルのプロパティを出力するには、 dump_data_utf8 というサブコマンドを指定します。

出力されるテキストファイルは、例えば以下のようになっています。

InfoKey と InfoValue が対になっています。

InfoKey: Title に対する InfoValue が文字化けしているのが分かります。

テキストファイルを読み込み PDF ファイルのプロパティを更新する

前項の反対に、PDF ファイルのプロパティを更新するには、”update_info_utf8″ というサブコマンドを指定します。また、更新された PDF ファイルの出力先を output で指定します。

sed で プロパティファイルを編集

InfoKey: Title に対する InfoValue の編集には、以下のように sed を利用しています。

編集内容は、”/Title/{N;s/InfoValue.*$/InfoValue: $TITLE/;}” の部分です。

  • /Title/{} → Title が含まれる行に対して、{} 内の処理を行う
  • N; → 次の行を読み込む
  • s/InfoValue.*$/InfoValue: $TITLE/; → 正規表現で InfoValue から 行末($) までを「InfoValue: $TITLE」で置換。$TITLE はシェルにて展開され、シェルの第一引数に置き換わる。
    → そのため、sed -e を シングルクォート ” ではなく、ダブルクォート “” で囲む

ひとこと

ImageMagick のプロパティ設定は、オプション回避なども難しそうですし、ブランクにしようにも、ファイル名ブランクにするわけにもいかないので、別プログラムで更新することにしました。

いまどき、多言語対応はできて欲しいところですが、回避できなくもないので、あまり需要が高くないのでしょうか…。

早く日本語でも扱えるようになると良いなぁ、と祈っておきます。


今回は以上です。


スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です