■概要
インターネットのWebページをPDFでスナップショット撮影します。
*WebサイトがAjaxだと無理です。静的なページか、URL変数で表示するページに対して使えます。
openofficをバックグランド常駐させてPDFを作らせる。
まず、裏方として働くopenofficeをインストールします。
yum groupinstall Office/Productivity yum install openoffice.org-langpack-ja_JP (日本語環境) yum install xorg-x11-server-Xvfb (仮想フレームバッファー)
っで、これを常駐稼動させるのだが、下記でいいみたい。
export DISPLAY=:1.0 /usr/bin/Xvfb :1 -screen 0 1024x768x8 & /usr/bin/soffice -invisible -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
これを含んだ起動スクリプトを書いて、/etc/init.d/sofficeとして保存。chkconfig辺りでrc3とrc5で起動させておきます。
これでローカルの8100ポートから命を受けて働いてくれます。
次にこのsofficeにデータを投げてPDFに変換指示をしてくれるもの。Jodconverterをインストール。っと言っても最新版を取得して特定の場所に広げるだけ。
使い方は、
java -jar /opt/Jodconverter/jodconverter/lib/jodconverter-cli-2.2.2.jar 変換元 PDFファイル
とするだけである。どうもjodconverterが直に8100ポートと通じているような。。
またもっと賢くはGroovyを使うこともできて、CLASSPATHにjodconverter-cli-2.2.2.jarを入れて、下記をConvertToPDF.groovyとして保存。(別途 groovyをインストールしますけど)
import com.artofsolving.jodconverter.* import com.artofsolving.jodconverter.openoffice.connection.* import com.artofsolving.jodconverter.openoffice.converter.* if (args.length < 2) { println "USAGE: ConvertToPdf.groovy <input-file> <output-file>" System.exit(255) } def input = new File(args[0]) def output = new File(args[1]) def connection = new SocketOpenOfficeConnection(8100) connection.connect() def registry = new DefaultDocumentFormatRegistry() def converter = new OpenOfficeDocumentConverter(connection, registry) def pdf = registry.getFormatByFileExtension("pdf") def pdfOptions = [ 'ReduceImageResolution': true, 'MaxImageResolution': 600, 'RestrictPermissions': true, 'PermissionPassword':1234 ] pdf.setExportOption(DocumentFamily.TEXT, "FilterData", pdfOptions) converter.convert(input, output, pdf) connection.disconnect()
そして、これを
groovy ConvertToPDF.groovy 変換元 PDFファイル
として実行してもOK。この場合、PDF化される際の解像度を指定することもできるような。まぁーこれはjodconverterの展開先のdocument-formats.xmlを調整してもできるとのこと。
次に実践編。
とあるURLの中身をPDF化したいと。。この場合ばず、そのURLの中身をwgetなどで全部取得します。
とあるフォルダを掘って、そこにhtmlファイルと関連ファイルを置く。例えばとあるURLの場合、
wget -nd -k -p -E "http://hogehoge/dataView.aspx?id=20101210"
とすると、そのフォルダにhtmlのほか、その画面を構成する画像ファイルらが置かれる。
この場合、始めのindex.htmlに該当するのが dataView.aspx?id=20101210.htmlとなるのが残念なのだが仕方ない。。
そして、ここで大事なのがページサイズ。htmlなんて印刷サイズなんて気にしない仕様なので取得したhtmlに「このhtmlはA4サイズで横長ですよ」とかをCSSを使って追記します。
<STYLE TYPE="text/css"> <!-- @page { size:landscape } --> </STYLE>
こうするとPDFにした際、横長で印刷されます。画像のサイズが大きくて一枚に収まらなくA3サイズでPDFを作成したい場合は
@page { size: 42cm 29.7cm }
とA3サイズを直接入力します。
このようにしてできたhtmlを先のJodconverterに掛けると思ったイメージなPDFが完成することになります。