Import af HTML5-sidemedier

THPDFHTMLImporter.RenderHTML5 konverterer tolerant HTML5-opmærkning og print-CSS til sideinddelt PDF-indhold og bevarer samtidig den kompakte ældre RenderHTML-sti

CSS-længder og importørens Margin, BaseFontSize, ListIndent og BlockSpacing er i punkter, så begge renderere producerer samme side uanset hvad THotPDF.Resolution er sat til; din egen tegning før og efter importen bruger stadig 1/Resolution tomme

Deklaration

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;

Profilkontrakt

HTML5ProfileVersion returnerer 1, og HTML5ProfileMilestones rapporterer parser og kaskade, sidelayout, tabeller og formularer samt afgrænsede ressourcer

Målte afsnit og retning

Afsnit ombrydes med den aktuelle fonts målte fremskridt, inklusive fontskift, fed- og kursiv-runs, bogstavafstand, ordafstand, eksplicitte linjeskift og østasiatiske tegngrænser; justering og dekoration anvendes separat på hver resulterende linje

direction: ltr, direction: rtl og HTML-attributten dir vælger afsnitsretning; dir="auto" bruger det første stærke tegns Unicode-retning

I Windows opløses tovejsscript-runs med Uniscribe og omordnes på tværs af stilgrænser, mens den eksisterende PDF-tekstmotor håndterer glyph-formning inden for hvert run; dokumentets retning, viewer-præferencer og gemt sideteksttilstand gendannes efter linjen

Inline retningsoverstyringer, bdi og bdo bruger i øjeblikket afsnitsordning og giver en hdkLayoutFallback-diagnostik; unicode-bidi ligger uden for denne profil, og scriptformning følger stadig dokumentets formningskonfiguration

Afsnitsfragmentering

widows og orphans er nedarvede positive heltal, begge med standardværdien 2; pagineringen bruger de målte linjebokse i stedet for et anslået antal tegn

Importøren flytter et afsnit eller justerer dets opsplitning, så det ønskede minimum antal linjer efterlades før og efter et sideskift; break-inside: avoid holder et afsnit samlet, når det kan være på en frisk side

Når en side ikke kan rumme den anmodede begrænsning, gør renderingen fremskridt ved at lempe begrænsningen og registrere hdkPaginationConstraint; hvert sidefragment får sin egen baggrund og kant

Valgfri orddeling

hyphens: none undertrykker diskretionære brud, og standarden hyphens: manual bruger U+00AD eller ­; en synlig bindestreg udsendes kun, når det valgte brud anvendes

hyphens: auto kalder derudover OnHyphenate med ordet og den nedarvede HTML-lang-værdi; uden et callback bevarer den manuelle brud og rapporterer et layout-fallback, fordi ingen sprogordbog følger med

Brudpositioner tæller UTF-16-kodeenheder fra ordets start; ugyldige, uden for intervallet liggende, surrogat-delende og enkle kombinationsmærke-delende positioner ignoreres

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

Afgrænsede flex- og grid-bokse

display: flex understøtter row, row-reverse, column og column-reverse; rækkebørn bruger eksplicitte bredder eller deler den resterende bredde, og positive flex-grow-værdier vægter ekstra plads

Rækker understøtter justify-content start, end, center, space-between, space-around og space-evenly plus start-, end-, center- og stretch-tværaksejustering; kolonneflow understøtter naturligt lodret layout og udsender en diagnostik for ikke-understøttet fordeling med fast højde eller tværaksejustering

display: grid understøtter positive fastlængde- og fr-kolonnespor, inklusive afgrænset repeat(n, tracks) med op til 64 kolonner; celler placeres i kilderækkefølge og udfylder én række ad gangen

grid-column: span N og grid-column-end: span N lader et barn optage på hinanden følgende spor og deres mellemrum; et element, der ikke passer i den aktuelle række, flyttes til næste række, og spans større end antallet af spor giver et layout-fallback

flex-wrap: wrap starter en ny linje, når næste elements eksplicitte bredde og mellemrum ikke passer; hver linje anvender uafhængigt flex-grow og justify-content, mens row-reverse og RTL vender positionerne inden i hver linje uden at flytte elementer mellem linjer

gap accepterer én eller to længder med uafhængige row-gap- og column-gap-tilsidesættelser; parallelle rækker forbliver på én side og kontrolleres før maling

Parallelle børn understøtter tekstblokke med inline-styling, rekursivt nestede almindelige blokcontainere med padding, kanter og baggrunde, nestede flex- og grid-containere, billeder samt statiske eller native formularcontrolelementer

Billeder bruger callback-leverede eller data URI-bytes, bevarer deres iboende aspektforhold, når ingen højde er angivet, og afkodes én gang pr. DOM-node; preflight og fallback genbruger det samme cachede billede uden at bruge endnu en ressourceanmodning

Alle børnebokse måles, før nogen parallel række males, så ikke-understøttet eller for stort indhold falder tilbage til lodret sideflow uden at gentage tidligere malede rækker; nested planlægning er afgrænset til 64 niveauer og forbruger det eksisterende layoutoperationsbudget

Ombrydende børn uden eksplicit bredde optager én komplet linje; tabeller og lister inde i parallelle børn, flex basis og shrink, wrap-reverse, iboende sporstørrelsessætning, grid-rækkespor og række-spans samt eksplicit grid-placering forbliver uden for denne profil og giver observerbar diagnostik

Diagnostik af ikke-understøttet CSS

Diagnostics eksponerer poster med Kind, Subject, Value og MessageText; OnDiagnostic modtager de samme oplysninger under renderingen

Ukendte egenskaber, ikke-understøttede værdier, ikke-understøttede selektorer og ikke-understøttede at-rules ignoreres med en diagnostik, inklusive deklarationer i ellers ubrugte stylesheet-regler; pseudo-selektorer springes over i stedet for at behandles som almindelige type-selektorer

StrictCSS, deaktiveret som standard, udløser EHPDFHTMLUnsupportedCSS ved en diagnostik; tidligere indhold kan allerede være udsendt, så kaldere, der kræver alt-eller-intet-import, bør bruge et separat dokument

MaxDiagnostics har standardværdien 256 og afgrænser gemte poster; DiagnosticCount og callback-levering forbliver observerbare, efter at lagergrænsen er nået, og en ikke-positiv grænse deaktiverer postlageret

Afgrænsede ressourcer

Eksterne stylesheets, billeder og @font-face-fonts er deaktiveret, medmindre OnResource leverer deres bytes, så HTML-import aldrig åbner en fil- eller netværksforbindelse implicit

@font-face understøtter én url(...)-kilde, valgfri format('truetype') eller format('opentype'), et familiealias, normal eller italic stil og normal-, bold-, 400- eller 700-vægt; font-display accepterer standardpolicyerne, fordi offline-import indlæser ressourcer synkront

Fonts skal være indlejrbare TrueType- eller OpenType-sfnt-ressourcer med et ASCII Windows-familienavn på højst 31 tegn; WOFF, fontsamlinger, local(...), variable deskriptorer og kildelister giver diagnostik

Accepterede fonts registreres privat i proceshukommelsen i Windows og forbliver ejet af dokumentet, indtil det destrueres, så at frigive importøren før EndDoc invaliderer ikke udskudt fontindlejring

data:-ressourcer og callback-resultater deler grænserne MaxResources, MaxResourceBytes og MaxTotalResourceBytes

MaxDecodedImageBytes har standardværdien 128 MiB og afgrænser uafhængigt det afkodede billedcache til fire bytes pr. pixel; BMP- og PNG-dimensioner kontrolleres før afkodning, og hvert accepteret billede kontrolleres, før det bevares

MaxDOMNodes, MaxCSSRules og MaxLayoutOperations afgrænser uafhængigt parsing, opbygning af kaskaden og layoutarbejde

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

Statistik

THPDFHTMLImportStatistics rapporterer profilversion, parsete noder, CSS-regler, layoutoperationer, sideskift, tabeller, formularkontroller, ressourceanmodninger, accepterede og afviste indlæsninger, accepterede ressourcebytes, målte tekstlinjer, orddelte linjer, diagnostik, flex-containere og grid-containere

OnLineLayout modtager linjens nulbaserede side- og afsnitslinjeindeks, oprindelse, målt bredde og højde, logisk tekst, retning og orddelingsflag, efter den faktiske PDF-tekst er udsendt

Hvert RenderHTML5-kald nulstiller statistikposten, og budgetoverskridelser udløser EHPDFHTMLImportBudget

Eksempel

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;

Se også: THPDFPage.TextOutHTML, Deklarativ Layout DOM, AcroForm-understøttelse