オプションのドキュメントハンドラー
THPDFDocumentHandlerRegistry は、弱い拡張子または MIME ヒントの前に検査されたコンテンツによって交換可能なハンドラーを選択し、選択したソースをエクスポートとレンダリングで共有される 1 つの不変 PDF キャッシュに変換します
組み込みのオプションハンドラー
- XPS と OpenXPS は固定ページ寸法と視覚順序を保持し、自己終了またはプロパティ付きの省略形
Pathジオメトリをネイティブな PDF ベクトルへ変換し、属性およびプロパティ要素のソリッドブラシ、マルチストップのLinearGradientBrushと楕円形のRadialGradientBrushシェーディングパターンを保持し、パッケージ内の JPEG・PNG・TIFF・JPEG XR のImageBrushリソースをTileMode=Noneでパス塗りに使用します - XPS の画像塗りは、絶対指定または
RelativeToBoundingBoxのViewbox/Viewportマッピング、None・Tile・FlipX・FlipY・FlipXYのタイルモード、ネイティブなパスと配置のクリッピング、有限の 6 パラメータTransform属性またはImageBrush.TransformMatrixTransform要素、ブラシとパスの不透明度、PNG ソフトマスクアルファ、画像 DPI、パッケージリソースのキャッシュに対応します - XPS の
Path.OpacityMaskは、ソリッド・マルチストップの線形 / 楕円放射グラデーション・PNGImageBrushマスクに対応し、画像セルの繰り返しと反射を含みます。一様なアルファは既存のグラフィックス状態に折り込まれ、可変アルファは上限付きのネイティブ DeviceGray 透過グループを使います。シェーディングパターンと画像ソフトマスクストリームを共有します - XPS Canvas の
OpacityとCanvas.OpacityMaskは、重なり合う子孫を個別に減衰させる代わりに、分離された DeviceRGB Form XObject を通じて 1 回だけ合成します。一様なマスクアルファはグループ状態に折り込まれ、可変のグラデーションや PNG 画像のアルファはネイティブのソフトマスクリソースを再利用し、ネストしたグループは変換済みクリップ・リソースの所有権・上限付きリンク注釈を保持します。グループ数 4,096・グループあたり取得コンテンツ 16 MiB の制限内です - XPS の
VisualBrushは、インラインまたはリソースベースのCanvas・Path・Glyphsのビジュアルを再帰的に変換し、ネストしたリモートのResourceDictionaryスコープを解決し、絶対Viewboxを絶対または相対のViewportへマッピングし、1 つの上限付き PDF Form XObject を直接配置・タイル配置・反射配置の間で再利用します - XPS の
Canvas.Clipは、上限付きの省略形ジオメトリ、ローカル / リモートのStaticResourcePathGeometry値、および構造化された直線・ベジエ・二次曲線・円弧の図形とジオメトリ変換・空ジオメトリ・EvenOdd/NonZeroの塗り規則を持つ直接プロパティ要素を受け入れます。ネストしたクリップはネイティブな PDFW*/Wパスになり、ナビゲーション矩形はアクティブな変換済みクリップ境界と交差判定され、パースは数値 100,000 個までに制限され、不正または特異なクリップは、子ビジュアルの描画前に fail closed します - XPS の
Glyphsは、厳密なIndicesマッピングを最大 65,536 件受け入れます。一対多および多対一のクラスタ進行・明示的な em の 1/100 単位のアドバンス・水平 / 垂直オフセット・奇数BidiLevelの逆進行・ソリッド属性またはプロパティ要素の塗り・不透明度・Unicode 抽出・fail-closed の不正入力診断を保持します。単純なランはネイティブな PDFTJ配列を使い、大きなマッピングバッファは償却線形コストで拡張します - パッケージの
FontUriリソースは、TrueType / OpenType のプログラム・TTC のメンバーフラグメント・XPS の GUID 難読化フォントに対応します。正確なグリフ ID・cmap 由来のラン・クラスタ・アドバンス・オフセット・RTL 原点・フォントリソースの再利用・埋め込み権限・省略可能なサブセット化・ToUnicode抽出マップは、GDI の代替に頼らないネイティブな PDF フォントデータのままです - 変換された
Path/Glyphsビジュアル上の XPSFixedPage.NavigateUriは、ジオメトリまたはメトリクスから導かれた境界を持つネイティブな PDF リンク注釈になります。HTTP・HTTPS・メールのリンクは URI アクションのままです。パッケージ相対のページや、パーセントデコードされたLinkTargetフラグメントは、すべてのページが利用可能になった後で、前向き / 後ろ向きの GoTo アクションになります - Canvas の
FixedPage.NavigateUriは、子孫が独自の URI を指定するまで、すべての子孫のPath・Glyphs・ネストした Canvas ビジュアルに継承されるターゲットになります。スコープ付きターゲットは、ネストした上書きの後で復元され、各ビジュアルのジオメトリと変換に従い、アクティブな Canvas クリップに制約され、分離された不透明度グループの取得をまたいで生き残り、再利用可能なVisualBrushForm の中では抑制されたままです - ナビゲーションは 65,536 リンク・URI あたり 8,192 文字に制限され、公開中はキャンセルをチェックされ、再利用可能な
VisualBrushの取得中は抑制され、制御文字・危険なスキーム・欠落したターゲット・パスやフラグメントの不一致では拒否されます - 非標準の
RelativeTransform・未解決のマトリックスリソース・Repeat / Reflect のグラデーションスプレッド・非 sRGB の補間・可変アルファの描画ブラシ・色変換・画像ストローク・相対VisualBrushのビューボックス・スタイルのシミュレーション・回転グリフ・高度なストロークプロパティは、明示的な診断の対象のままです - EPUB は
container.xml・manifest・spine の順序を解決した後、コールバック専用のパッケージリソースを使う、上限付きの HTML5 ページメディアインポーターを使用します - CBZ は対応する画像エントリを認識し、決定論的な自然ファイル名順を適用し、設定された画像 DPI で画像 1 枚につき 1 ページを作成します
予算と失敗の分離
検証済みの ZIP セントラルディレクトリ走査が 1 回行われ、変換の前にエントリ数・圧縮バイト数・展開バイト数・エントリごとの上限・重複パス・危険なパス・圧縮率の各上限を強制します
旧式の PKZIP ZipCrypto エントリは ArchivePasswordCallback を通じて資格情報を要求できます。コールバックはソース名・エントリ名・1 起点の試行回数を受け取り、MaxPasswordAttempts が再試行を 1 から 16 の範囲に制限します
資格情報と部分的にデコードされたエントリバイトはメモリに保持され、試行の合間にクリアされます。キャンセルはすべてのコールバックの前後で確認され、コールバックの欠落・資格情報の拒否・再試行の枯渇・未対応の暗号化では fail closed します
ZipCrypto は近代的な認証付き暗号化ではなく旧式のパスワード保護であり、非 ASCII パスワードのバイト規約は ZIP の作成者によって異なる場合があります
パスワード保護されたエントリには、復号フックを公開する Delphi 12 以降の System.Zip が必要です。それより前の Delphi バージョンでビルドした場合、ハンドラは暗号化されていないエントリは引き続き読みますが、ArchivePasswordCallback が呼ばれる前に暗号化エントリを未対応として拒否します
エントリのサイズやオフセットに ZIP64 フィールドが必要な場合は Delphi 11 以降が必要です。それより前の Delphi バージョンでは未対応として拒否されます
リソース・リフロー・ページ・ピクセル・DPI・出力・キャンセルの各上限は、変換とレンダリングを通じて常に有効です。出力の公開に失敗した場合、シーク可能な出力先ストリームが復元されます
登録と使用
var
Registry: THPDFDocumentHandlerRegistry;
Options: THPDFDocumentHandlerOptions;
Handled: IHPDFHandledDocument;
Info: THPDFDocumentHandlerInfo;
begin
Registry:= THPDFDocumentHandlerRegistry.Create;
try
Registry.RegisterStandardHandlers;
Options:= THPDFDocumentHandlerOptions.Default;
if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
Handled.WritePDF(OutputStream, Options, Info);
finally
Registry.Free;
end;
end;