Опциональные document handler'ы
THPDFDocumentHandlerRegistry выбирает заменяемые handler'ы сначала по инспектированному содержимому и лишь затем по слабым подсказкам расширения или MIME, после чего конвертирует выбранный источник в один неизменяемый PDF cache, общий для экспорта и рендеринга
Встроенные опциональные handler'ы
- XPS и OpenXPS сохраняют размеры фиксированных страниц и визуальный порядок, конвертируют сокращённую геометрию
Path— самозакрывающуюся или с property-элементами — в нативные PDF-векторы, сохраняют сплошные заливки из атрибутов и property-элементов, shading pattern многостоповыхLinearGradientBrushи эллиптическихRadialGradientBrush, а также заливают пути через package-ресурсыImageBrushс JPEG, PNG, TIFF или JPEG XR приTileMode=None - Заливки изображениями в XPS поддерживают абсолютное или
RelativeToBoundingBoxотображениеViewboxиViewport, tile-режимыNone,Tile,FlipX,FlipYиFlipXY, нативный clipping путей и размещений, конечные шестипараметровые атрибутыTransformили элементыMatrixTransformвImageBrush.Transform, прозрачность кистей и путей, альфу PNG soft mask, DPI изображений и кэширование package-ресурсов Path.OpacityMaskв XPS поддерживает сплошные маски, многостоповые линейные или эллиптические радиальные градиенты и маски PNGImageBrush, включая повторяющиеся и отражённые ячейки изображения; однородная альфа сворачивается в существующие графические состояния, а переменная альфа использует ограниченные нативные transparency group DeviceGray, которые шарят shading pattern и soft mask stream изображений- Canvas
OpacityиCanvas.OpacityMaskв XPS компонуют перекрывающихся потомков один раз через изолированные Form XObject DeviceRGB вместо ослабления каждого ребёнка по отдельности; однородная альфа маски сворачивается в состояние группы, переменная градиентная или PNG-альфа переиспользует нативные soft mask ресурсы, а вложенные группы сохраняют трансформированные clipping, владение ресурсами и ограниченные link annotation в пределах 4 096 групп и 16 MiB захваченного содержимого на группу VisualBrushв XPS рекурсивно конвертирует inline- или ресурсные визуалыCanvas,PathиGlyphs, разрешает вложенные и удалённые областиResourceDictionary, отображает абсолютныйViewboxв абсолютный или относительныйViewportи переиспользует один ограниченный PDF Form XObject при прямых, tiled и отражённых размещенияхCanvas.Clipв XPS принимает ограниченную сокращённую геометрию, локальные или удалённые значенияPathGeometryизStaticResourceи прямые property-элементы со структурными фигурами — линиями, Bézier, квадратичными кривыми или дугами, — трансформациями геометрии, пустой геометрией и правилами заливкиEvenOddилиNonZero; вложенные clipping становятся нативными PDF-путямиW*илиW, прямоугольники навигации пересекаются с активными трансформированными границами clip, разбор ограничен 100 000 числовых значений, а некорректные или вырожденные clip безопасно отказывают до отрисовки дочерних визуаловGlyphsв XPS принимает не более 65 536 строгих соответствийIndices, сохраняет прогрессию кластеров «один ко многим» и «многие к одному», явные advances в сотых долях em, горизонтальные и вертикальные смещения, обратную прогрессию при нечётномBidiLevel, сплошные заливки из атрибутов или property-элементов, прозрачность, извлечение Unicode и диагностику некорректного ввода с безопасным отказом; простые run используют нативные PDF-массивыTJ, а большие mapping-буферы растут с амортизированно линейной стоимостью- Ресурсы
FontUriв package поддерживают программы TrueType и OpenType, фрагменты членов TTC и обфусцированные по GUID шрифты XPS; точные glyph ID, run из cmap, кластеры, advances, смещения, RTL-начала, переиспользование font-ресурсов, права на встраивание, опциональный subsetting и карты извлеченияToUnicodeостаются нативными данными шрифтов PDF без подмены через GDI FixedPage.NavigateUriв XPS на трансформированных визуалахPathиGlyphsстановится нативной link annotation PDF с границами, выведенными из геометрии или метрик; ссылки HTTP, HTTPS и mail остаются URI-действиями, а package-относительные страницы и percent-декодированные фрагментыLinkTargetстановятся GoTo-действиями вперёд или назад, когда доступны все страницыFixedPage.NavigateUriна Canvas становится унаследованной целью каждого дочернего визуалаPath,Glyphsили вложенного Canvas, пока потомок не задаст собственный URI; scoped-цели восстанавливаются после вложенных переопределений, следуют геометрии и трансформации каждого визуала, остаются ограниченными активными Canvas clip, переживают изолированный захват opacity-групп и подавляются внутри переиспользуемыхVisualBrushForms- Навигация ограничена 65 536 ссылками и 8 192 символами на URI, проверяется на отмену при публикации, подавляется во время повторно используемого захвата
VisualBrushи отклоняется при управляющих символах, небезопасных схемах, отсутствующих целях или несовпадении путей и фрагментов - Нестандартный
RelativeTransform, неразрешённые matrix-ресурсы, spread градиента Repeat или Reflect, интерполяция вне sRGB, красящие кисти с переменной альфой, преобразование цвета, обводки изображениями, относительные viewbox уVisualBrush, имитация стилей, глифы с боковым набором и продвинутые свойства stroke остаются явными диагностиками - EPUB разрешает
container.xml, manifest и порядок spine, затем использует ограниченный HTML5 paged-media importer с доступом к package-ресурсам только через callback - CBZ распознаёт поддерживаемые записи изображений, применяет детерминированный естественный порядок имён файлов и создаёт по странице на изображение с настроенным image DPI
Бюджеты и изоляция сбоев
Одна проверенная проходка по центральному каталогу 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;