■概要
インターネットの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が完成することになります。