Opcjonalne moduły obsługi dokumentów
THPDFDocumentHandlerRegistry wybiera zastępowalne moduły obsługi wg zbadań treści przed słabymi wskazówkami rozszerzenia lub MIME, a następnie konwertuje wybrane źródło na jedną niezmienną pamięć podręczną PDF współdzieloną przez eksport i renderowanie
Wbudowane moduły opcjonalne
- XPS i OpenXPS zachowują wymiary stałych stron i kolejność wizualną, konwertują skróconą geometrię
Pathsamozamykającą się albo z elementami property na natywne wektory PDF, zachowują jednolite pędzle atrybutowe i property-element, wzory cieniowaniaLinearGradientBrushwielostopniowe i eliptyczneRadialGradientBrushoraz wypełniają ścieżki z zasobówImageBrushJPEG, PNG, TIFF albo JPEG XR pakietu przyTileMode=None - Wypełnienia obrazami XPS wspierają mapowanie
ViewboxiViewportabsolutne alboRelativeToBoundingBox, tryby kafelkówNone,Tile,FlipX,FlipYiFlipXY, natywne clipowanie ścieżki i umiejscowienia, skończone atrybutyTransformo sześciu parametrach albo elementyMatrixTransformwImageBrush.Transform, nieprzezroczystość pędzla i ścieżki, alfę miękkiej maski PNG, DPI obrazu i cache zasobów pakietu - XPS
Path.OpacityMaskwspiera maski jednolite, wielostopniowe liniowe albo eliptyczne radialne gradienty i maski PNGImageBrush, łącznie z powtarzanymi i odbitymi komórkami obrazu; jednolita alfa jest składana w istniejące stany graficzne, a zmienna alfa używa ograniczonych natywnych grup transparency DeviceGray współdzielących wzory cieniowania i strumienie miękkich masek obrazów - XPS Canvas
OpacityiCanvas.OpacityMaskskładują nachodzących potomków raz przez izolowane Form XObject DeviceRGB zamiast osłabiać każde dziecko niezależnie; jednolita alfa maski jest składana w stan grupy, zmienna alfa gradientu albo obrazu PNG reużywa natywnych zasobów miękkich masek, a zagnieżdżone grupy zachowują stransformowane clipy, własność zasobów i ograniczone adnotacje linków w granicach 4096 grup i 16 MiB przechwyconej treści na grupę - XPS
VisualBrushrekurencyjnie konwertuje wizualiaCanvas,PathiGlyphsinline albo z zasobów, rozwiązuje zagnieżdżone i zdalne zakresyResourceDictionary, mapuje absolutnyViewboxna absolutny albo względnyViewporti reużywa jedno ograniczone Form XObject PDF między umieszczeniami bezpośrednimi, kafelkowymi i odbitymi - XPS
Canvas.Clipprzyjmuje ograniczoną skróconą geometrię, wartościPathGeometryz lokalnego albo zdalnegoStaticResourceoraz bezpośrednie elementy property ze ustrukturyzowanymi figurami linii, Béziera, kwadratowymi albo łukowymi, transformacjami geometrii, pustą geometrią i regułami wypełnieniaEvenOddalboNonZero; zagnieżdżone clipy stają się natywnymi ścieżkami PDFW*alboW, prostokąty nawigacji są przecinane z aktywnymi stransformowanymi granicami clipów, parsowanie jest limitowane do 100 000 wartości numerycznych, a zniekształcone albo osobliwe clipy failują na zamkniętym, zanim wizualia dzieci zostaną namalowane - XPS
Glyphsprzyjmuje co najwyżej 65 536 ścisłych mapowańIndices, zachowuje progresję klastrów jeden-do-wielu i wiele-do-jednego, jawne przesunięcia w setnych em, offsety poziome i pionowe, odwrotną progresję przy nieparzystymBidiLevel, wypełnienia atrybutowe albo property-element, nieprzezroczystość, ekstrakcję Unicode i fail-closed diagnostyki zniekształconego wejścia; proste przebiegi używają natywnych tablicTJPDF, a duże bufory mapowań rosną z amortyzowanym kosztem liniowym - Zasoby
FontUripakietu wspierają programy TrueType i OpenType, fragmenty członków TTC i fonty XPS zaciemnione GUID; dokładne glyph ID, przebiegi z cmap, klastry, przesunięcia, offsety, originy RTL, reużycie zasobów fontów, uprawnienia osadzania, opcjonalne podzbiory i mapy ekstrakcjiToUnicodepozostają natywnymi danymi fontów PDF bez podstawienia GDI - XPS
FixedPage.NavigateUrina stransformowanych wizualiachPathiGlyphsstaje się natywną adnotacją linku PDF o granicach z geometrii albo metryk; linki HTTP, HTTPS i mail pozostają akcjami URI, a strony względne do pakietu i fragmentyLinkTargetz dekodowaniem procentowym stają się akcjami GoTo w przód albo w tył, gdy wszystkie strony są już dostępne - Canvas
FixedPage.NavigateUristaje się odziedziczonym celem każdego potomnego wizualiumPath,Glyphsalbo zagnieżdżonego Canvas, dopóki potomek nie poda własnego URI; scope'owane cele przywracają się po zagnieżdżonych nadpisaniach, podążają za geometrią i transformacją każdego wizualium, pozostają ograniczone aktywnymi clipami Canvas, przeżywają przechwycenie do izolowanej grupy opacity i pozostają stłumione wewnątrz reużywalnych FormVisualBrush - XPS i OpenXPS zachowują wymiary stron stałych, kolejność sekwencji i tekst z elementów
Glyphs, jednocześnie raportując nieobsługiwane funkcje rysowania stron stałych - Niestandardowy
RelativeTransform, nierozwiązane zasoby macierzy, rozlanie gradientu Repeat albo Reflect, interpolacja nie-sRGB, pędzle farby o zmiennej alfie, konwersja kolorów, kreskowanie obrazami, względne viewboxyVisualBrush, symulacja stylów, glify boczne i zaawansowane właściwości kreski pozostają jawnymi diagnostykami - EPUB rozpoznaje
container.xml, manifest i kolejność spine, a następnie używa ograniczonego importera HTML5 paged-media z zasobami pakietu tylko do wywołań zwrotnych - CBZ rozpoznaje obsługiwane wpisy obrazów, stosuje deterministyczną naturalną kolejność nazw plików i tworzy jedną stronę na obraz przy skonfigurowanym DPI obrazu
Budżety i izolacja awarii
Jeden zwalidowany skan centralnego katalogu ZIP egzekwuje przed konwersją limity wpisów, bajtów skompresowanych, bajtów rozwiniętych, per wpis, zduplikowanych ścieżek, niebezpiecznych ścieżek i stosunku kompresji
Klasyczne wpisy PKZIP ZipCrypto mogą żądać poświadczeń przez ArchivePasswordCallback; callback dostaje nazwę źródła, nazwę wpisu i numer próby od jedynki, a MaxPasswordAttempts ogranicza ponowienia do zakresu 1-16
Poświadczenia i częściowo zdekodowane bajty wpisu pozostają w pamięci i są czyszczone między próbami, anulowanie jest sprawdzane przed i po każdym callbacku, a brakujące callbacki, odrzucone poświadczenia, wyczerpane ponowienia albo nieobsługiwane szyfrowanie failują na zamkniętym
ZipCrypto to przestarzała ochrona hasłem, a nowoczesne uwierzytelnione szyfrowanie, i konwencje bajtów haseł nie-ASCII mogą się różnić między producentami ZIP
Wpisy chronione hasłem wymagają Delphi 12 lub nowszego, którego System.Zip udostępnia hak deszyfrowania; zbudowane ze starszą wersją Delphi handlery nadal czytają wpisy niezaszyfrowane, ale odrzucają zaszyfrowane jako nieobsługiwane, zanim zostanie wywołany ArchivePasswordCallback
Wpisy, których rozmiary albo offsety wymagają pól ZIP64, wymagają Delphi 11 lub nowszego; starsze wersje Delphi odrzucają je jako nieobsługiwane
Limity zasobów, reflow, stron, pikseli, DPI, wyjścia i anulowania pozostają aktywne przez całą konwersję i renderowanie, podczas gdy nieudana publikacja wyjścia przywraca możliwy do przewijania strumień docelowy
Rejestracja i użycie
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;