GZip and PDF
拙作のサーバサイドJavaのフレームワークではHTTP1.1のGZip圧縮に対応した
ストリームの入出力を実装しているんだけれどGZip圧縮有効の状態でオンザフライで
PDFを生成してIE等のHTTP1.1に対応しているブラウザに戻すとAdobeが提供している
IE用のPDF閲覧プラグインで問題が発生する。
PDF生成時にセットしている全てのヘッダをまとめるとこんな感じなんだけど
response.setHeader("Pragma", "cache"); response.setHeader("Cache-Control", "public"); response.setContentType("application/pdf"); response.setContentLength(生成したPDFのバイト長); response.setHeader("Content-Encoding", "gzip");
今までのプラグインの各バージョンへの対応経緯として
AcrobatReader5 -> OK
AdobeReader6 -> NG -> パス情報の末尾に".pdf"付加 -> OK
AdobeReader7 -> NG -> HTTPヘッダ"Accept-Ranges" "none"追加 -> OK
とそれぞれのバージョンでアドホックに対応が必要になるのが最悪。
更にたちが悪いのがAdobeReader7対応でAccept-Rangesヘッダを追加すると今度は
AcrobatReader5で"ファイルの始まりがPDF%-ではありません"等と怒られるし更には
なぜかPOSTとGETの2回のリクエストがコントローラ(Servlet)に上がっている始末...
結局GZip圧縮/圧縮解除を行っているフィルタ内でPDF関連のパスを見つけたらGZip圧縮の
対象からは外すようにする事にした。
GZip圧縮による圧縮率を計測してみるとHTMLやXML等のプレーンテキストだと悪くても
30〜40%程度の大きさになるのだがPDFだとせいぜい70%〜80%にしかならない。
CPU使用率の上昇と圧縮による帯域削減を天秤にかけると割に合うとは思えない数値だ。
そう、PDFは生成時に既にLZW圧縮がかかっていたのだった。