Optional Document Handlers

THPDFDocumentHandlerRegistry는 약한 확장자나 MIME 힌트보다 검사한 콘텐츠로 교체 가능한 핸들러를 고른 뒤, 선택된 소스를 내보내기와 렌더링이 공유하는 하나의 불변 PDF 캐시로 변환합니다

내장 선택 핸들러

예산과 실패 격리

검증된 ZIP central-directory 스캔 한 번이 변환 전에 항목 수, 압축 바이트, 확장 바이트, 항목별, 중복 경로, 안전하지 않은 경로, 압축률 한도를 강제합니다

클래식 PKZIP ZipCrypto 항목은 ArchivePasswordCallback으로 자격 증명을 요청할 수 있습니다. 콜백은 소스 이름, 항목 이름, 1 기반 시도 번호를 받고, MaxPasswordAttempts는 재시도를 1~16으로 제한합니다

자격 증명과 부분 디코딩된 항목 바이트는 메모리에 머물다 시도 사이에 지워지고, 취소는 모든 콜백 전후로 검사되며, 콜백 누락, 자격 거부, 재시도 소진, 미지원 암호화는 fail-closed 됩니다

ZipCrypto는 현대의 authenticated encryption이 아니라 구식 암호 보호이며, non-ASCII 암호 바이트 관례는 ZIP 생산자마다 다를 수 있습니다

암호로 보호된 항목에는 Delphi 12 이상이 필요합니다. 이 버전의 System.Zip이 복호화 훅을 노출합니다. 더 오래된 Delphi 버전으로 빌드하면 핸들러는 암호화되지 않은 항목은 여전히 읽지만, 암호화된 항목은 ArchivePasswordCallback이 호출되기 전에 미지원으로 거부합니다

크기나 오프셋에 ZIP64 필드가 필요한 항목에는 Delphi 11 이상이 필요합니다. 그 이전 Delphi 버전은 이를 미지원으로 거부합니다

리소스, reflow, 페이지, 픽셀, DPI, 출력, 취소 한도는 변환·렌더링 내내 활성 상태를 유지하고, 출력 공개가 실패하면 seekable destination stream을 복원합니다

등록과 사용

var
  Registry: THPDFDocumentHandlerRegistry;
  Options: THPDFDocumentHandlerOptions;
  Handled: IHPDFHandledDocument;
  Info: THPDFDocumentHandlerInfo;
begin
  Registry:= THPDFDocumentHandlerRegistry.Create;
  try
    Registry.RegisterStandardHandlers;
    Options:= THPDFDocumentHandlerOptions.Default;
    Options.ArchivePasswordCallback:= SupplyArchivePassword;
    if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
      Handled.WritePDF(OutputStream, Options, Info);
  finally
    Registry.Free;
  end;
end;

관련 API