HTML5 uvoz medija s paginacijom

THPDFHTMLImporter.RenderHTML5 pretvara tolerantni HTML5 označivački jezik i print CSS u paginirani PDF sadržaj uz očuvanje kompaktne naslijeđene RenderHTML putanje

Duljine u CSS-u te importerovi Margin, BaseFontSize, ListIndent i BlockSpacing izraženi su u točkama, pa oba renderera daju istu stranicu bez obzira na postavku THotPDF.Resolution; vlastito crtanje prije i nakon uvoza i dalje koristi 1/Resolution inča

Deklaracija

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;

Ugovor profila

HTML5ProfileVersion vraća 1, a HTML5ProfileMilestones izvještava o razrješivaču i kaskadi, paginiranom rasporedu, tablicama i obrascima te ograničenim resursima

Mjereni paragrafi i smjer

Paragrafi se prelome koristeći izmjerene napredke trenutnog fonta, uključujući promjene fonta, podebljane i kurzivne nizove, razmak znakova, razmak riječi, eksplicitne prijelome redaka i granice istočnoazijskih znakova; poravnanje i ukrašavanje primjenjuju se zasebno na svaki dobiveni redak

direction: ltr, direction: rtl i HTML atribut dir odabiru smjer paragrafa; dir="auto" koristi Unicode smjer prvog jakog znaka

Na Windowsu se dvosmjerni skriptni nizovi razrješavaju s Uniscribeom i preuređuju preko granica stilova, dok postojeći PDF tekstni motor radi oblikovanje glifova unutar svakog niza; smjer dokumenta, postavke preglednika i spremljeno tekstno stanje stranice vraćaju se nakon retka

Inline nadjačavanja smjera, bdi i bdo trenutačno koriste redoslijed paragrafa i proizvode dijagnostiku hdkLayoutFallback; unicode-bidi je izvan ovog profila, a oblikovanje skripte i dalje slijedi konfiguraciju oblikovanja dokumenta

Fragmentacija paragrafa

widows i orphans su nasljeđeni pozitivni cijeli brojevi, oboje sa zadanom vrijednošću 2; paginacija koristi izmjerene okvire redaka umjesto procijenjenog broja znakova

Uvoznik premješta paragraf ili prilagođava njegovu podjelu da ostavi traženi najmanji broj redaka prije i nakon prijeloma stranice; break-inside: avoid drži paragraf na okupu kada stane na svježu stranicu

Kada stranica ne može zadovoljiti traženo ograničenje, renderiranje napreduje opuštanjem ograničenja i zapisivanjem hdkPaginationConstraint; svaki fragment stranice prima vlastitu pozadinu i okvir

Neobavezna hifenacija

hyphens: none potiskuje diskrecijske prijelome, a zadani hyphens: manual koristi U+00AD ili ­; vidljiva crtica emitira se samo kada se koristi odabrani prijelom

hyphens: auto dodatno poziva OnHyphenate s riječi i naslijeđenom HTML vrijednošću lang; bez povratnog poziva zadržava ručne prijelome i izvještava o padu rasporeda jer se nikakav jezični rječnik ne isporučuje uz paket

Položaji prijeloma broje UTF-16 kodne jedinice od početka riječi; nevažeći i izvan raspona položaji te položaji koji sijeku surrogate parove ili osnovne kombinirajuće oznake ignoriraju se

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

Ograničeni flex i grid okviri

display: flex podržava row, row-reverse, column i column-reverse; djeca retka koriste eksplicitne širine ili dijele preostalu širinu, a pozitivne vrijednosti flex-grow odmjeravaju dodatni prostor

Retci podržavaju justify-content start, end, center, space-between, space-around i space-evenly, plus poravnanje poprečne osi start, end, center i stretch; tok stupaca podržava prirodni vertikalni raspored i emitira dijagnostiku za nepodržanu distribuciju fiksne visine ili poravnanje poprečne osi

display: grid podržava pozitivne stupčane staze fiksne duljine i fr, uključujući ograničeni repeat(n, tracks) s najviše 64 stupca; ćelije se smještaju u redoslijedu izvora, popunjavajući jedan redak istodobno

grid-column: span N i grid-column-end: span N dopuštaju djetetu da zauzme uzastopne staze i njihove međupraznine; stavka koja ne stane u trenutni redak prelazi na sljedeći redak, a rasponi veći od broja staza proizvode pad rasporeda

flex-wrap: wrap pokreće novi redak kada se eksplicitna širina i razmak sljedeće stavke ne uklapaju; svaki redak neovisno primjenjuje flex-grow i justify-content, dok row-reverse i RTL obrnu položaje unutar svakog retka bez premještanja stavki između redaka

gap prihvaća jednu ili dvije duljine, uz neovisna nadjačavanja row-gap i column-gap; paralelni retci ostaju na jednoj stranici i provjeravaju se prije crtanja

Paralelna djeca podržavaju tekstne blokove s inline stiliziranjem, rekurzivno ugniježđene obične blok kontejnere s paddingom, okvirima i pozadinama, ugniježđene flex i grid kontejnere, slike te statične ili nativne kontrole forme

Slike koriste bajtove dostavljene povratnim pozivom ili data URI, zadržavaju svoj intrinzični omjer slike kada visina nije navedena i dekodiraju se jednom po DOM čvoru; preflight i pad ponovno koriste istu predmemoriranu sliku bez trošenja novog zahtjeva resursa

Svi dječji okviri mjere se prije nego što se bilo koji paralelni redak nacrta, pa nepodržani ili preveliki sadržaj pada na vertikalni tok stranice bez ponavljanja prethodno nacrtanih redaka; ugniježđeno planiranje ograničeno je na 64 razine i troši postojeći proračun operacija rasporeda

Prelomna djeca bez eksplicitne širine zauzimaju jedan kompletan redak; tablice i popisi unutar paralelne djece, flex basis i shrink, wrap-reverse, intrinzičko dimenzioniranje staza, staze i rasponi redaka u gridu te eksplicitno grid postavljanje ostaju izvan ovog profila i proizvode uočljivu dijagnostiku

Dijagnostika nepodržanog CSS-a

Diagnostics izlaže zapise koji sadrže Kind, Subject, Value i MessageText; OnDiagnostic prima iste informacije tijekom renderiranja

Nepoznata svojstva, nepodržane vrijednosti, nepodržani selektori i nepodržana at-pravila ignoriraju se uz dijagnostiku, uključujući deklaracije u inače nekorištenim pravilima stila; pseudo selektori se preskaču umjesto da se tretiraju kao obični selektori tipa

StrictCSS, onemogućen po zadanom, podiže EHPDFHTMLUnsupportedCSS pri dijagnostici; prethodni sadržaj možda je već emitiran, pa pozivatelji kojima treba uvoz sve-ili-ništa trebaju koristiti zaseban dokument

MaxDiagnostics ima zadanu vrijednost 256 i ograničava zadržane zapise; DiagnosticCount i dostava povratnih poziva ostaju uočljivi nakon dostizanja ograničenja pohrane, a nepozitivno ograničenje onemogućuje pohranu zapisa

Ograničeni resursi

Vanjski stilski listovi, slike i @font-face fontovi onemogućeni su osim ako OnResource ne isporučuje njihove bajtove, tako da uvoz HTML-a nikada implicitno ne otvara datoteku ili mrežnu vezu

@font-face podržava jedan izvor url(...), opcionalni format('truetype') ili format('opentype'), alias obitelji, normalan ili kurzivan stil te težine normal, bold, 400 ili 700; font-display prihvaća standardne politike jer izvanmrežni uvoz učitava resurse sinkrono

Fontovi moraju biti ugradivi TrueType ili OpenType sfnt resursi s ASCII Windows nazivom obitelji od najviše 31 znaka; WOFF, zbirke fontova, local(...), opisivači varijabli i liste izvora proizvode dijagnostiku

Prihvaćeni fontovi registriraju se privatno u memoriji procesa na Windowsu i ostaju u vlasništvu dokumenta dok se ne uništi, pa oslobađanje uvoznika prije EndDoc ne poništava odgođeno ugrađivanje fontova

Resursi data: i rezultati povratnih poziva dijele ograničenja MaxResources, MaxResourceBytes i MaxTotalResourceBytes

MaxDecodedImageBytes ima zadanu vrijednost 128 MiB i neovisno ograničava predmemoriju dekodiranih slika na četiri bajta po pikselu; dimenzije BMP-a i PNG-a provjeravaju se prije dekodiranja, a svaka prihvaćena slika provjerava se prije zadržavanja

MaxDOMNodes, MaxCSSRules i MaxLayoutOperations neovisno ograničavaju razrješavanje, izgradnju kaskade i rad rasporeda

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

Statistika

THPDFHTMLImportStatistics izvještava o verziji profila, razrješenim čvorovima, CSS pravilima, operacijama rasporeda, lomovima stranica, tablicama, kontrolama forme, zahtjevima resursa, prihvaćenim i odbijenim učitavanjima, prihvaćenim bajtovima resursa, izmjerenim tekstnim retcima, hifeniziranim retcima, dijagnostici te flex i grid kontejnerima

OnLineLayout prima indekse retka stranice i retka paragrafa od nule, ishodište, izmjerenu širinu i visinu, logički tekst, smjer i zastavicu hifenacije nakon što je stvarni PDF tekst emitiran

Svaki poziv RenderHTML5 resetira zapis statistike, a kršenja proračuna podižu EHPDFHTMLImportBudget

Primjer

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;

Pogledajte također: THPDFPage.TextOutHTML, Deklarativni layout DOM, AcroForm potpora