HTML5 Paged-Media-import

THPDFHTMLImporter.RenderHTML5 converteert tolerant HTML5-opmaak en print-CSS naar gepagineerde PDF-inhoud, terwijl het compacte legacy-RenderHTML-pad behouden blijft

CSS-lengtes en de Margin-, BaseFontSize-, ListIndent- en BlockSpacing-waarden van de importer zijn in punten, dus beide renderers leveren bij elke THotPDF.Resolution dezelfde pagina; je eigen tekenwerk vóór en na de import blijft 1/Resolution inch gebruiken

Declaratie

function RenderHTML5(
  const HTML: WideString;
  const AuthorStyleSheet: WideString = ''
): Boolean;

function HPDFRenderHTML5Document(
  Doc: THotPDF;
  const HTML: WideString;
  const AuthorStyleSheet: WideString = '';
  MarginPt: Single = 72;
  const FontName: AnsiString = 'Arial';
  FontSize: Single = 12
): Boolean;

Profielcontract

HTML5ProfileVersion retourneert 1 en HTML5ProfileMilestones rapporteert parser- en cascadetrappen, gepagineerde layout, tabellen en formulieren, en begrensde resources

Gemeten paragrafen en richting

Paragrafen breken af op de gemeten advances van het huidige font, inclusief fontwisselingen, vette en cursieve reeksen, letterafstand, woordafstand, expliciete regeleinden en Oost-Aziatische tekegrenzen; uitlijning en decoratie worden apart toegepast op elke resulterende regel

direction: ltr, direction: rtl en het HTML-dir-attribuut kiezen de paragrafechtrichting; dir="auto" gebruikt de Unicode-richting van het eerste sterke teken

Op Windows worden bidirectionele scriptreeksen met Uniscribe opgelost en over stijlgrenzen heen geherordend, terwijl de bestaande PDF-tekstengine de glyphshaping binnen elke reeks verzorgt; de richting van het document, de viewer-preferences en de opgeslagen paginatekststatus worden na de regel hersteld

Inline-richtingoverrides, bdi en bdo gebruiken momenteel de paragraafordening en leveren een hdkLayoutFallback-diagnostiek op; unicode-bidi valt buiten dit profiel, en scriptshaping volgt nog steeds de shapingconfiguratie van het document

Paragraaffragmentatie

widows en orphans zijn overgeërfde positieve gehele getallen, beide met defaultwaarde 2; paginering gebruikt de gemeten regelboxen in plaats van een geschat aantal tekens

De importer verplaatst een paragraaf of past diens splitsing aan zodat het gevraagde minimum aantal regels vóór en na een paginabreuk overblijft; break-inside: avoid houdt een paragraaf bij elkaar wanneer die op een frisse pagina past

Wanneer een pagina de gevraagde beperking niet aan kan, komt rendering vooruit door de beperking te verslappen en hdkPaginationConstraint te registreren; elk paginafragment krijgt zijn eigen achtergrond en rand

Optionele afbreking

hyphens: none onderdrukt discretionaire breuken, en de default hyphens: manual gebruikt U+00AD of ­; een zichtbaar koppelteken wordt alleen uitgegeven wanneer de gekozen breuk wordt gebruikt

hyphens: auto roept bovendien OnHyphenate aan met het woord en de overgeërfde HTML-lang-waarde; zonder callback blijven handmatige breuken staan en volgt een layout-fallback, want er wordt geen taalwoordenboek meegeleverd

Breekposities tellen UTF-16-code-eenheden vanaf het begin van het woord; ongeldige, buiten bereik zijnde, surrogaat-splitsende en basis-combining-mark-splitsende posities worden genegeerd

THPDFHTMLHyphenationEvent = procedure(
  Sender: TObject;
  const WordText, Language: WideString;
  var BreakPositions: TArray<Integer>
) of object;

Begrensde flex- en gridboxen

display: flex ondersteunt row, row-reverse, column en column-reverse; kinderen in een rij gebruiken expliciete breedtes of delen de resterende breedte, en positieve flex-grow-waarden wegen de extra ruimte

Rijen ondersteunen justify-content start, end, center, space-between, space-around en space-evenly, plus start-, end-, center- en stretch-uitlijning op de dwarsas; kolomstroom ondersteunt natuurlijke verticale layout en geeft een diagnostiek voor niet-ondersteunde verdeling met vaste hoogte of dwarsasuitlijning

display: grid ondersteunt positieve vaste-lengte- en fr-kolomsporen, inclusief begrensde repeat(n, tracks) met maximaal 64 kolommen; cellen worden in bronvolgorde geplaatst, één rij per keer vullend

grid-column: span N en grid-column-end: span N laten een kind opeenvolgende sporen en hun tussenliggende tussenruimten bezetten; een item dat niet in de huidige rij past, schuift door naar de volgende rij, en spans groter dan het aantal sporen leveren een layout-fallback op

flex-wrap: wrap begint een nieuwe regel wanneer de expliciete breedte en tussenruimte van het volgende item niet passen; elke regel past flex-grow en justify-content onafhankelijk toe, terwijl row-reverse en RTL posities binnen elke regel omdraaien zonder items tussen regels te verplaatsen

gap accepteert één of twee lengtes, met onafhankelijke row-gap- en column-gap-overrides; parallelle rijen blijven op één pagina en worden vóór het tekenen gecontroleerd

Parallelle kinderen ondersteunen tekstblokken met inline-styling, recursief geneste gewone blokcontainers met padding, randen en achtergronden, geneste flex- en gridcontainers, afbeeldingen en statische of native formulierbedieningen

Afbeeldingen gebruiken bytes uit een callback of data-URI, behouden hun intrinsieke aspectratio wanneer geen hoogte is opgegeven en worden één keer per DOM-node gedecodeerd; preflight en fallback hergebruiken dezelfde gecachte afbeelding zonder een extra resourceverzoek te verbruiken

Alle kindboxen worden gemeten voordat een parallelle rij wordt getekend, dus niet-ondersteunde of te grote inhoud valt terug op verticale paginastroom zonder eerder getekende rijen te herhalen; geneste planning is begrensd op 64 niveaus en verbruikt het bestaande layoutbewerkingsbudget

Kinderen die omlopen en geen expliciete breedte hebben, nemen één volledige regel in beslag; tabellen en lijsten binnen parallelle kinderen, flex basis en shrink, wrap-reverse, intrinsieke sporbemating, grid-rijsporen en rijspans, en expliciete gridplaatsing blijven buiten dit profiel en leveren waarneembare diagnostiek op

Diagnostiek voor niet-ondersteunde CSS

Diagnostics stelt records bloot met Kind, Subject, Value en MessageText; OnDiagnostic ontvangt dezelfde informatie tijdens rendering

Onbekende eigenschappen, niet-ondersteunde waarden, niet-ondersteunde selectors en niet-ondersteunde at-rules worden genegeerd met een diagnostiek, inclusief declaraties in verder ongebruikte stylesheet-regels; pseudo-selectors worden overgeslagen in plaats van als gewone typeselectors behandeld

StrictCSS, standaard uit, geeft EHPDFHTMLUnsupportedCSS bij een diagnostiek; eerdere inhoud kan al zijn uitgegeven, dus aanroepers die all-or-nothing-import willen, gebruiken een apart document

MaxDiagnostics staat standaard op 256 en begrenst bewaarde records; DiagnosticCount en callback-levering blijven waarneembaar nadat de opslaglimiet is bereikt, en een niet-positieve limiet schakelt recordopslag uit

Begrensde resources

Externe stylesheets, afbeeldingen en @font-face-fonts zijn uitgeschakeld tenzij OnResource hun bytes levert, zodat HTML-import nooit impliciet een bestand of netwerkverbinding opent

@font-face ondersteunt één url(...)-bron, optioneel format('truetype') of format('opentype'), een familie-alias, normale of cursieve stijl en normaal, bold, 400 of 700 gewicht; font-display accepteert de standaardbeleidsregels omdat offline import resources synchroon laadt

Fonts moeten inbedbare TrueType- of OpenType-sfnt-resources zijn met een ASCII-Windows-familienaam van maximaal 31 tekens; WOFF, fontcollecties, local(...), variable-descriptors en bronlijsten leveren diagnostiek op

Geaccepteerde fonts worden privé geregistreerd in het procesgeheugen op Windows en blijven eigendom van het document totdat het wordt vernietigd, dus het vrijgeven van de importer vóór EndDoc maakt uitgestelde fontinbedding niet ongeldig

data:-resources en callbackresultaten delen de limieten van MaxResources, MaxResourceBytes en MaxTotalResourceBytes

MaxDecodedImageBytes staat standaard op 128 MiB en begrenst de gedecodeerde afbeeldingscache onafhankelijk op vier bytes per pixel; BMP- en PNG-dimensies worden vóór decodering gecontroleerd, en elke geaccepteerde afbeelding wordt gecontroleerd voordat die wordt bewaard

MaxDOMNodes, MaxCSSRules en MaxLayoutOperations begrenzen onafhankelijk parsing, cascadeconstructie en layoutwerk

THPDFHTMLResourceEvent = procedure(
  Sender: TObject;
  const URI: WideString;
  ResourceKind: THPDFHTMLResourceKind;
  var Data: TBytes;
  var ContentType: string;
  var Handled: Boolean
) of object;

Statistieken

THPDFHTMLImportStatistics rapporteert de profielversie, geparste knooppunten, CSS-regels, layoutbewerkingen, paginabreken, tabellen, formulierbedieningen, resourceverzoeken, geaccepteerde en afgewezen ladingen, geaccepteerde resourcebytes, gemeten tekstregels, regels met afbreking, diagnostiek, flexcontainers en gridcontainers

OnLineLayout ontvangt na het uitzenden van de echte PDF-tekst de op nul gebaseerde pagina- en paragraafregelindexen van de regel, de oorsprong, gemeten breedte en hoogte, de logische tekst, de richting en de afbrekingsvlag

Elke RenderHTML5-aanroep reset de statistiekrecord, en budgetoverschrijdingen werpen EHPDFHTMLImportBudget

Voorbeeld

Importer := THPDFHTMLImporter.Create(Doc);
try
  Importer.CreateAcroForms := True;
  Importer.MaxResources := 16;
  Importer.RenderHTML5(
    '<style>@page { margin: 36pt } ' +
    'table { width: 100% }</style>' +
    '<h1>Invoice</h1>' +
    '<table><tr><td>Total</td><td>42</td></tr></table>' +
    '<input name="approved" type="checkbox">'
  );
finally
  Importer.Free;
end;

Zie ook: THPDFPage.TextOutHTML, Declaratief-Layout-DOM, AcroForm-ondersteuning