複数のイメージをまとめてPDFに変換する(iTextを使用)
納品するソフトウェアのスクリーンショットを印刷しなければならない。
印刷対象となるスクリーンショット画像が多数あるので、なんとか単純化できないか?
(今後もバージョンアップのたびにこの作業は発生することだし。)
オライリーのPDF HACKSを見てみると、ImageMagickの convert ツールでこれができると 書いてある。
$ convert -density 100 -page "800x800>" -resize "800x800>" *.gif output.pdf
やってみると確かにカレントディレクトリにある *.gif画像のスクリーンショットを
全部一ページ一画像の形でPDFに変換してくれた。
超便利!と思ったけど、余白がない状態で出力される。
これなんとかならないか、と思って調べたが、余白をとる方法がわからなかった。
そもそも生成するconvertコマンドのオプション自体も意味がわからない(まさにマジックだ)。
仕方がないので再び iText にお世話になることにした。
iTextを使って画像をPDFに変換する
toPdf.py
import sys
import java.io as io
import com.lowagie.text as itext
SRCIMG=sys.argv[1]
OUTPDF=sys.argv[2]
RATE=0.7
doc=itext.Document(itext.PageSize.A4.rotate())
itext.pdf.PdfWriter.getInstance(doc, io.FileOutputStream(OUTPDF))
doc.open()
rect=doc.getPageSize()
pageW=rect.getWidth()
pageH=rect.getHeight()
img=itext.Image.getInstance(SRCIMG)
w=img.getWidth()
h=img.getHeight()
w_=pageW * RATE
#h_=pageH*RATE
h_= h * w_ / w
img.scaleAbsolute(w_,h_)
img.setAbsolutePosition( (pageW-w_)/2,(pageH-h_)/2 )
doc.add(img)
doc.close()
(source:toPdf.py)
RATEの指定した割合で、余白が設定されます。
RATE=0.8にすると、画像をページ横サイズに対して 0.8(80%)に設定して出力します。
(画像の縦サイズについては、画像の縦横比率を考慮して調整。)
実行するには、
itext-2.0.4.jar が必要です。
(iTextダウンロードページはこちら)
例によって、toPdf.py と同じディレクトリに itext-2.0.4.jar をコピーして、
以下のように実行します。
(参考)
$ export CLASSPATH=itext-2.0.4.jar; jython toPdf.py input.gif output.pdf
input.gif にPDFにしたい画像を用意して実行したら、output.pdfができます。 画像形式は、gif,jpg,png などいろいろな形式に対応しているはず。
追記
本日(2009-08-24)時点の最新版 iText-2.1.7.jar でも作動します。
複数の画像をPDFに変換する
toPdf.py は一度に一つの画像を一ページのPDFに変換することしかできない。 が、あとは、複数のPDFを一つのファイルに結合するを使って、 生成しておいたPDFを一つのファイルにまとめてしまえば、目的は達成される。
たとえば、1.gif,2.gif,3.gif .... スクリーンショット画像を用意しておき、 以下のシェルスクリプトで、カレントディレクトリ中のgif画像をPDFl化した上で、 ひとつのファイル result.pdf にまとめる。
convert.sh
export CLASSPATH=itext-2.0.4.jar
for item in `ls *.gif`
do
pdf=${item%.*}.pdf
jython toPdf.py $item $pdf
echo $pdf
done
pdftk *.pdf output result.pdf
(source:convert.sh)