Опциональные document handler'ы

THPDFDocumentHandlerRegistry выбирает заменяемые handler'ы сначала по инспектированному содержимому и лишь затем по слабым подсказкам расширения или MIME, после чего конвертирует выбранный источник в один неизменяемый PDF cache, общий для экспорта и рендеринга

Встроенные опциональные handler'ы

Бюджеты и изоляция сбоев

Одна проверенная проходка по центральному каталогу ZIP поддерживает лимиты на записи, сжатые и распакованные байты, размер отдельной записи, дубликаты путей, небезопасные пути и коэффициент сжатия до конвертации

Записи классического PKZIP ZipCrypto могут запрашивать учётные данные через ArchivePasswordCallback: callback получает имя источника, имя записи и номер попытки, начиная с единицы, а MaxPasswordAttempts ограничивает повторы диапазоном от 1 до 16

Учётные данные и частично декодированные байты записи остаются в памяти и стираются между попытками, отмена проверяется до и после каждого callback, а отсутствие callback, отклонённые учётные данные, исчерпанные повторы или неподдерживаемое шифрование приводят к безопасному отказу

ZipCrypto — устаревшая парольная защита, а не современная аутентифицированная encryption, и соглашения о байтах не-ASCII паролей могут различаться у разных производителей ZIP

Записям, защищённым паролем, нужен Delphi 12 или новее, чей System.Zip открывает hook расшифровки; собранные с более ранней версией Delphi, обработчики всё ещё читают незашифрованные записи, но отклоняют зашифрованные как неподдерживаемые до вызова ArchivePasswordCallback

Записи, чьи размеры или смещения требуют полей ZIP64, требуют Delphi 11 или новее; более ранние версии Delphi отклоняют их как неподдерживаемые

Лимиты на ресурсы, reflow, страницы, пиксели, DPI, вывод и отмену действуют на протяжении всей конвертации и рендеринга, а при неудачной публикации вывода восстанавливается seekable целевой 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