この記事を読むのに必要な時間は約 10 分です。
当記事は、FreeBSD で ImageMagick を用いて PDF を作成する際に、文書のタイトルに日本語を設定されるようにするためのスクリプトを作成した際のメモです。
前回記事にて、無事 ImageMagick の convert コマンドを利用できるようになりました。
ImageMagick で 複数 PNG → PDF 変換時エラーに対処した時のメモ
当記事を 3行でまとめると…
- ImageMagick では、PDF ファイル作成時に、ファイル名から、文書のタイトルが自動セットされます。
- ImageMagick では、日本語ファイル名を指定して、タイトルに日本語をセットしようとすると、文字化けしてしまいます。
- pdftk を利用して、タイトルを後から再更新することで、日本語タイトルがセットされるように、スクリプトを作成しました。
出来上がったシェルスクリプト
フォルダ内にある PNG ファイルをまとめて PDF に変換するスクリプトになっています。エラー対処など行っておらず、動けば OK レベルのスクリプトです…。
#!/bin/sh TITLE="$1" OUT="${TITLE}.pdf" TARGET='*.png' TEMP="temp.pdf" META_TEMP="meta.txt" META_NEW="new.txt" /usr/local/bin/convert ${TARGET} ${TEMP} /usr/local/bin/pdftk ${TEMP} dump_data_utf8 > ${META_TEMP} /usr/bin/sed -e "/Title/{N;s/InfoValue.*$/InfoValue: $TITLE/;}" ${META_TEMP} > ${META_NEW} /usr/local/bin/pdftk ${TEMP} update_info_utf8 ${META_NEW} output "${OUT}" /bin/rm -f ${TEMP} ${META_TEMP} ${META_NEW}
使い方
この内容を適当なファイルに張り付けて、実行権限を与えましょう。例えば convert.sh だとします。
変換したい png ファイルが含まれているディレクトリに移動し、convert.sh 日本語ファイル名 という形で実行します。
第一引数に、作成したいファイル名 (.pdf 拡張子は含めない) を指定すれば、「日本語ファイル名.pdf」 で、タイトルが「日本語ファイル名」と設定された PDF ファイルが出来上がります。
png 以外のファイルを対象とする場合は、スクリプト 5行目の TARGET 変数の辺りをちょちょいといじれば可能だと思います。お好みでカスタマイズしてお使い下さい。
ImageMagick のPDF タイトル文字化け
ImageMagick は、PDF 作成時に、PDF ファイル名を、文書のタイトルに設定します。以下の例の場合、タイトルは「1」が設定されます。
convert "*.png" 1.pdf
当初は、適当に 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 というサブコマンドを指定します。
/usr/local/bin/pdftk 対象PDFファイル dump_data_utf8 > 出力テキスト
出力されるテキストファイルは、例えば以下のようになっています。
InfoKey と InfoValue が対になっています。
InfoKey: Title に対する InfoValue が文字化けしているのが分かります。
InfoBegin InfoKey: ModDate InfoValue: D:20150815193649 InfoBegin InfoKey: CreationDate InfoValue: D:20150815193649 InfoBegin InfoKey: Title InfoValue: [e‘-a±?a´?] a…¬a‡1a…?a…3a‡・a…?Weba…?a‡¶a‡?a…3 -a… ?a…≪a…†a…?a…’a‡?a‡1a?‡a≫£a†Ra‡3a…3a‡≫a…?a…?a†¨a…?a‡  ̄a…‰a……a‡ ̄- InfoBegin InfoKey: Producer InfoValue: ImageMagick 6.9.1-10 Q16 amd64 2015-08-13 http://www.imagemagick.org PdfID0: dc6d7ca471dc1f3377a8a293675ca59d3f8acddf04d5ad81bececcc76c1246d9 PdfID1: dc6d7ca471dc1f3377a8a293675ca59d3f8acddf04d5ad81bececcc76c1246d9 NumberOfPages: 233 PageMediaBegin PageMediaNumber: 1 PageMediaRotation: 0 PageMediaRect: 0 0 643.567 810.084 PageMediaDimensions: 643.567 810.084 PageMediaBegin PageMediaNumber: 2 PageMediaRotation: 0 PageMediaRect: 0 0 643.567 810.084 PageMediaDimensions: 643.567 810.084
テキストファイルを読み込み PDF ファイルのプロパティを更新する
前項の反対に、PDF ファイルのプロパティを更新するには、”update_info_utf8″ というサブコマンドを指定します。また、更新された PDF ファイルの出力先を output で指定します。
/usr/local/bin/pdftk 更新対象PDFファイル update_info_utf8 読み込むテキストファイル output 更新後のPDFファイル
sed で プロパティファイルを編集
InfoKey: Title に対する InfoValue の編集には、以下のように sed を利用しています。
/usr/bin/sed -e "/Title/{N;s/InfoValue.*$/InfoValue: $TITLE/;}" ${META_TEMP} > ${META_NEW}
編集内容は、”/Title/{N;s/InfoValue.*$/InfoValue: $TITLE/;}” の部分です。
- /Title/{} → Title が含まれる行に対して、{} 内の処理を行う
- N; → 次の行を読み込む
- s/InfoValue.*$/InfoValue: $TITLE/; → 正規表現で InfoValue から 行末($) までを「InfoValue: $TITLE」で置換。$TITLE はシェルにて展開され、シェルの第一引数に置き換わる。
→ そのため、sed -e を シングルクォート ” ではなく、ダブルクォート “” で囲む
ひとこと
ImageMagick のプロパティ設定は、オプション回避なども難しそうですし、ブランクにしようにも、ファイル名ブランクにするわけにもいかないので、別プログラムで更新することにしました。
いまどき、多言語対応はできて欲しいところですが、回避できなくもないので、あまり需要が高くないのでしょうか…。
早く日本語でも扱えるようになると良いなぁ、と祈っておきます。
今回は以上です。
[pn-amzn-freebsd]