PDFの構造について4
暑さ寒さも彼岸までという言葉がありますが、今年の夏は暑くなったり涼しくなったり変な波があってよくわからない状態ですよね。先週はかなり雨に降られてちょっと湿気ってしまいました。
そんな事は置いておいて、今回はPDFの構造に関する続きで、フィルター関連の情報をお届けします。このフィルターの構造まで読めるようになるとPDFファイルの構成は一通り確認できるようになるのではないかと思います。
3.3フィルター
フィルターは、ストリームの仕様オプションであり、ストリームデータをどのようにデコードするべきかを示します。たとえば、ストリームにASCIIHexDecodeフィルターが適用されている場合、そのストリーム内のデータを読み取るアプリケーションは、ストリーム内のASCII16進エンコードデータをバイナリデータに変換します。
PDFファイルを生成するアプリケーションプログラムは、サンプリングされた画像のデータのような特定の情報をエンコードして、圧縮したりASCII表現に変換する事ができます。PDFファイルを扱うアプリケーションは、対応するデコードフィルターを呼び出してストリームを元の形式に戻します。
ストリームの1つまたは複数のフィルターは、ストリームに含まれるディクショナリのFilterエントリ、ストリームが外部ファイルを参照する場合はFFilterエントリによって指定されます。フィルタをカスケード接続して、2つ以上のデコード変換を順番に通過させるパイプライン処理も記述可能です。たとえば、LZWとASCII85エンコーディングを使用してエンコードされたデータは、下に示すようなstreamディクショナリに含まれるFilterエントリを利用してデコード処理を判別します。Filterエントリの値はブラケット([])で囲まれた配列として与えられます。PDFにおける配列は一般的プログラミング言語とは異なりデリミタがスペース(0x20)である事に注意してください。
/Filter [ /ASCII85Decode /LZWDecode ]
一部のフィルターでは、デコード時に更なるパラメーターを必要とする場合があります。オプションのパラメータは、streamディクショナリのDecodeParmsエントリ、ストリームが外部ファイルを参照する場合はFDecodeParmsエントリによって指定されます。
PDFは、次の2つの主要なカテゴリに分類されるフィルターの標準セットをサポートしています。
- ASCIIフィルタを使用すると、ASCIIテキストとしてエンコードされた任意の8ビットバイナリデータをデコードできます。ASCIIフィルターは、暗号化されたPDFファイルでは役に立たないことに注意してください。
- 展開フィルタは、圧縮されたデータをデコードする際に利用されます。元のデータがASCIIテキストであっても、圧縮データストリームは常に8ビットのバイナリ形式のストリームとなります。
圧縮処理はファイル容量を抑えたい場合に有効な手段であり、内包するコンテンツが大きなサイズの画像の様なものを含む場合は利用すべきです。DCT等の一部の圧縮フィルタは非可逆圧縮であり、エンコード中に元のデータが持つディテールが失われデータを展開する際に品質低下を起こします。対してZIP形式等のデータ損失が発生しない圧縮をロスレス圧縮と呼びます。
以下に標準フィルターについての要約を示します。次のセクションでは、これらのフィルターとそのパラメーターについて、一部のフィルターのエンコードアルゴリズムの仕様を含め、より詳細に説明します。
ASCIIHexDecode
- デコードパラメータ/なし
- ASCII 16進表現でエンコードされたデータをデコードし、元のバイナリデータを再現します。
ASCII85Decode
- デコードパラメータ/なし
- ASCII85表現でエンコードされたデータをデコードし、元のバイナリデータを再現します。
LZWDecode
- デコードパラメータ/要
- LZW(Lempel-Ziv-Welch)適応圧縮方式を使用してエンコードされたデータをデコードし、元のテキストまたはバイナリデータを再現します。
FlateDecode
- デコードパラメータ/要(PDF 1.2)
- zlib/deflate圧縮方式を使用してエンコードされたデータをデコードし、元のテキストまたはバイナリデータを再現します。
RunLengthDecode
- デコードパラメータ/なし
- バイト指向のランレングスエンコーディングアルゴリズムを使用してエンコードされたデータをデコードし、元のテキストまたはバイナリデータ(通常、モノクロ2階長画像の様な2進数で表現されるビットストリーム等に利用される)を再現します。
CCITTFaxDecode
- デコードパラメータ/要
- CCITTFax形式でエンコードされたデータをデコードし、元のデータ(通常は1ピクセルあたり1ビットのモノクロ画像データ)を再現します。
JBIG2Decode
- デコードパラメータ/要 (PDF 1.4)
- JBIG2フォーマットを使用してエンコードされたデータをデコードし、元のモノクロ(1ピクセルあたり1ビット)の画像データ(またはそのデータの近似値)を再現します。
DCTDecode
- デコードパラメータ/要
- JPEG標準に基づくDCT(離散コサイン変換)技術を使用してエンコードされたデータをデコードし、元のデータに近い画像サンプルデータを再現します。
JPXDecode
no (PDF 1.5)
- ウェーブレットベースのJPEG2000標準を使用してエンコードされたデータをデコードし、元の画像データを再現します。
Crypt
- デコードパラメータ/要 (PDF 1.5)
- セキュリティハンドラーによって暗号化されたデータを復号化し、暗号化前の元のデータを再現します。
以下の例はLZW圧縮方式を使用して圧縮され、ASCII85でエンコードされた、ページのマーキング命令を含むストリームを示しています。
1 0 obj << /Length 534 /Filter [ /ASCII85Decode /LZWDecode ] >> stream J..)6T`?p&<!J9%_[umg"B7/Z7KNXbN'S+,*Q/&"OLT'F LIDK#!n`$"<Atdi`\Vn%b%)&'cA*VnK\CJY(sF>c!Jnl@ RM]WM;jjH6Gnc75idkL5]+cPZKEBPWdR>FF(kj1_R%W_d &/jS!;iuad7h?[L−F$+]]0A3Ck*$I0KZ?;<)CJtqi65Xb Vc3\n5ua:Q/=0$W<#N3U;H,MQKqfg1?:lUpR;6oN[C2E4 ZNr8Udn.'p+?#X+1>0Kuk$bCDF/(3fL5]Oq)^kJZ!C2H1 'TO]Rl?Q:&'<5&iP!$Rq;BXRecDN[IJB`,)o8XJOSJ9sD S]hQ;Rj@!ND)bD_q&C\g:inYC%)&u#:u,M6Bm%IY!Kb1+ ":aAa'S`ViJglLb8<W9k6Yl\\0McJQkDeLWdPN?9A'jX* al>iG1p&i;eVoK&juJHs9%;Xomop"5KatWRT"JQ#qYuL, JD?M$0QP)lKn06l1apKDC@\qJ4B!!(5m+j.7F790m(Vj8 8l8Q:_CZ(Gm1%X\N1&u!FKHMB~> endstream endobj ※Adobe社発行 PDF Reference 1.7より引用
「1 0 obj」オブジェクトはディクショナリの構造を持ちます。子要素はLengthとFilterでLengthはFilterストリームの長さ、Filterは利用すべき種類が記述されます。この例ではASCII85でデコードしたのちLZW圧縮を解除します。そうして得られるのが下に示されたストリームです。
1 0 obj << /Length 568 >> stream 2 J BT /F1 12 Tf 0 Tc 0 Tw 72.5 712 TD [ ( Unencoded streams can be read easily ) 65 ( , ) ] TJ 0 −14 TD [ ( b ) 20 ( ut generally tak ) 10 ( e more space than \311 ) ] TJ T* ( encoded streams . ) Tj 0 −28 TD [ ( Se ) 25 ( v ) 15 ( eral encoding methods are a ) 20 ( v) 25 ( ailable in PDF ) 80 ( . ) ] TJ 0 −14 TD ( Some are used for compression and others simply ) Tj T* [ ( to represent binary data in an ) 55 ( ASCII format . ) ] TJ T* ( Some of the compression encoding methods are \ suitable ) Tj T* ( for both data and images , while others are \ suitable only ) Tj T* ( for continuous−tone images . ) Tj ET endstream endobj ※Adobe社発行 PDF Reference 1.7より引用