Stream filter
Stream filterとは、PDFのstreamディクショナリの`/Filter`エントリに指定される名前付きアルゴリズムで、streamの生データをどのようにデコードまたはエンコードすべきかを定義します。
Stream filterとは、PDFのstreamディクショナリの/Filterエントリに指定される名前付きアルゴリズムで、streamの生データをどのようにデコードまたはエンコードすべきかを定義します
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。Filterはstreamデータを圧縮、暗号化、またはその他の方法で変換し、ファイルサイズを削減したりコンテンツを保護したりします。一般的なfilterには、汎用圧縮用の/FlateDecodeやJPEG画像データ用の/DCTDecodeがあります。
Stream filterは、streamデータに適用される特定のデコードまたはエンコードアルゴリズムを識別するPDF name objectです。PDFの構文では、filterはstreamディクショナリ内の/Filterキーの値として表され、単一の名前(例:/FlateDecode)、または複数のfilterが順次適用される場合は名前の配列として記述されます
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。Filterは、streamとendstreamキーワードの間の生バイトデータを、元のデータを復元するためにどのように処理すべきかを決定します。
Stream filterは、コンテンツのプロパティを記述するのではなく、データ変換を制御するという点で、他のPDFディクショナリエントリとは異なります。Streamディクショナリには/Lengthや/Typeなどのメタデータが含まれる場合がありますが、/Filterエントリは操作的なものであり、PDFプロセッサにどのアルゴリズムを呼び出すべきかを指示します。各filterはPDF仕様で定義された標準化された名前を持ち、異なるPDFリーダーやジェネレーター間で一貫した解釈が保証されます。
PDFを扱う開発者にとって、stream filterの理解はいくつかの実用的な理由から不可欠です。第一に、適切なfilterの選択はファイルサイズに直接影響します。/FlateDecodeを/LZWDecodeの代わりに選択したり、/DCTDecodeや/JPXDecodeで適切な画像圧縮を実装することで、ドキュメントサイズを大幅に削減できます。第二に、プログラム的にPDFコンテンツを読み取る際、テキスト、画像、その他の埋め込みリソースを抽出する場合でも、実際のデータにアクセスするためにfilterされたstreamを正しくデコードする必要があります。
さらに、filterの処理はセキュリティと暗号化ワークフローに影響します。/Crypt filterは暗号化されたstreamデータを管理し、PDFセキュリティ機能を実装する開発者は、暗号化filterが他の圧縮filterとどのように相互作用するかを理解する必要があります。PDF生成の問題をデバッグする際には、コンテンツが正しくレンダリングされない理由やファイルサイズが予想外に大きい理由を判断するために、stream filterを調査することがよくあります。
PDFプロセッサがstream objectに遭遇すると、streamディクショナリを読み取り、/Filterエントリの有無を確認します。存在する場合、プロセッサは指定されたfilterをエンコードされたstreamデータに適用して、デコードされた出力を生成します
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。例えば、/Filter /FlateDecodeを持つstreamには、zlib/deflateアルゴリズムを使用して圧縮されたデータが含まれており、プロセッサはstreamを読み取る際にこれを解凍します。
配列を指定することで複数のfilterを適用できます:/Filter [/ASCII85Decode /FlateDecode]。Filterはエンコード時には配列の順序で適用され、デコード時には逆順で処理されます。プロセッサはまずASCII85エンコーディングを除去し、次にFlateDecodeデータを解凍します。各filterには、並列の/DecodeParmsディクショナリで指定される関連パラメータがあり、圧縮レベルや色空間変換などのfilter固有のオプションを制御します。
PDF仕様で定義されている標準filterには、可逆圧縮filter(/FlateDecode、/LZWDecode、/RunLengthDecode)、バイナリデータ転送用のエンコーディングfilter(/ASCII85Decode、/ASCIIHexDecode)、画像専用filter(JPEG用の/DCTDecode、JPEG 2000用の/JPXDecode、モノクロ画像用の/JBIG2Decode、FAX圧縮用の/CCITTFaxDecode)、および暗号化filter(/Crypt)があります。適切なfilterの選択は、データタイプ、望ましい圧縮率、互換性要件によって異なります。
- Stream object – filterされる可能性のあるディクショナリと関連バイナリデータで構成されるPDF object
- Stream dictionary – filterの仕様やメタデータを含むstream objectのディクショナリ部分
- Compression – データサイズを削減するプロセスで、FlateDecodeなどのstream filterを通じて実現されることが多い
- Image XObject – 画像データを含むstream objectで、通常はDCTDecodeなどの画像専用filterを使用する
- Decode parameters – filterの動作を制御する
/DecodeParmsで指定される追加設定
- (N.A.) (2020)
- (N.A.). (2020). Document management — Portable document format — Part 2: PDF 2.0 . International Organization for Standardization Retrieved from https://www.iso.org/standard/75839.html
