MY-NOTEBOOK

Wednesday, July 4, 2007

複数のイメージをまとめて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()

RATEの指定した割合で、余白が設定されます。
RATE=0.8にすると、画像をページ横サイズに対して 0.8(80%)に設定して出力します。
(画像の縦サイズについては、画像の縦横比率を考慮して調整。)

実行するには、 itext-2.0.4.jar が必要です。
( [iTextダウンロードページはこちら":http://www.lowagie.com/iText/download.html )
例によって、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を一つのファイルに結合する”:catPdf.html を使って、生成しておいた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
© 2006-2012 Tomoaki Oshima