オプションのドキュメントハンドラー

THPDFDocumentHandlerRegistry は、弱い拡張子または MIME ヒントの前に検査されたコンテンツによって交換可能なハンドラーを選択し、選択したソースをエクスポートとレンダリングで共有される 1 つの不変 PDF キャッシュに変換します

組み込みのオプションハンドラー

予算と失敗の分離

検証済みの 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;

関連 API