Import Paged-Media HTML5

THPDFHTMLImporter.RenderHTML5 converte il markup HTML5 tollerante e il CSS di stampa in contenuto PDF paginato preservando il percorso compatto legacy RenderHTML

Le lunghezze CSS e Margin, BaseFontSize, ListIndent e BlockSpacing dell'importer sono in punti, così entrambi i renderer producono la stessa pagina qualunque sia la THotPDF.Resolution impostata; il tuo disegno prima e dopo l'import continua a usare 1/Resolution di pollice

Dichiarazione

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;

Contratto del profilo

HTML5ProfileVersion restituisce 1 e HTML5ProfileMilestones riporta parser e cascade, layout paginato, tabelle e moduli e risorse limitate

Paragrafi misurati e direzione

I paragrafi vanno a capo usando gli avanzamenti misurati del font corrente, inclusi cambi di font, sequenze bold e italic, spaziatura lettere, spaziatura parole, interruzioni di riga esplicite e confini tra caratteri dell'Asia orientale; allineamento e decorazione si applicano separatamente a ogni riga risultante

direction: ltr, direction: rtl e l'attributo HTML dir selezionano la direzione del paragrafo; dir="auto" usa la direzione Unicode del primo carattere forte

Su Windows, le sequenze di script bidirezionali vengono risolte con Uniscribe e riordinate attraverso i confini di stile, mentre l'engine di testo PDF esistente gestisce lo shaping dei glifi dentro ogni sequenza; la direzione del documento, le viewer preferences e lo stato del testo di pagina salvato vengono ripristinati dopo la riga

Gli override di direzione inline, bdi e bdo attualmente usano l'ordinamento del paragrafo e producono una diagnostica hdkLayoutFallback; unicode-bidi è fuori da questo profilo, e lo shaping degli script segue ancora la configurazione di shaping del documento

Frammentazione dei paragrafi

widows e orphans sono interi positivi ereditati, entrambi con predefinito 2; la paginazione usa le line box misurate invece di un numero stimato di caratteri

L'importer sposta un paragrafo o ne regola la divisione per lasciare il numero minimo richiesto di righe prima e dopo un'interruzione di pagina; break-inside: avoid tiene unito un paragrafo quando entra in una pagina nuova

Quando una pagina non può soddisfare il vincolo richiesto, il rendering procede rilassando il vincolo e registrando hdkPaginationConstraint; ogni frammento di pagina riceve il proprio sfondo e bordo

Sillabazione opzionale

hyphens: none sopprime le interruzioni discrezionali, e il predefinito hyphens: manual usa U+00AD o ­; un trattino visibile viene emesso solo quando l'interruzione selezionata viene usata

hyphens: auto chiama inoltre OnHyphenate con la parola e il valore HTML lang ereditato; senza callback conserva le interruzioni manuali e riporta un fallback di layout, perché nessun dizionario linguistico è incluso

Le posizioni di interruzione contano le unità di codice UTF-16 dall'inizio della parola; le posizioni non valide, fuori intervallo, che spaccano surrogate e che spaccano segni combinanti di base vengono ignorate

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

Box flex e grid con limiti

display: flex supporta row, row-reverse, column e column-reverse; i figli di riga usano larghezze esplicite o condividono la larghezza rimanente, e i valori positivi di flex-grow ponderano lo spazio aggiuntivo

Le righe supportano justify-content start, end, center, space-between, space-around e space-evenly, più l'allineamento sull'asse trasversale start, end, center e stretch; il flusso a colonna supporta il layout verticale naturale ed emette una diagnostica per distribuzione a altezza fissa o allineamento trasversale non supportati

display: grid supporta track di colonna a lunghezza fissa positive e fr, inclusi repeat(n, tracks) limitati fino a 64 colonne; le celle vengono piazzate in ordine di sorgente, riempiendo una riga alla volta

grid-column: span N e grid-column-end: span N permettono a un figlio di occupare track consecutive e i loro gap intermedi; un elemento che non entra nella riga corrente passa alla riga successiva, e span maggiori del numero di track producono un fallback di layout

flex-wrap: wrap inizia un'altra riga quando larghezza esplicita e gap dell'elemento successivo non entrano; ogni riga applica indipendentemente flex-grow e justify-content, mentre row-reverse e RTL invertono le posizioni dentro ogni riga senza spostare elementi tra righe

gap accetta una o due lunghezze, con override indipendenti row-gap e column-gap; le righe parallele restano su una pagina e vengono verificate prima del disegno

I figli paralleli supportano blocchi di testo con stile inline, contenitori blocco ordinari annidati ricorsivamente con padding, bordi e sfondi, contenitori flex e grid annidati, immagini e controlli di form statici o nativi

Le immagini usano byte forniti da callback o data URI, conservano il loro aspect ratio intrinseco quando non è specificata un'altezza e vengono decodificate una volta per nodo DOM; preflight e fallback riusano la stessa immagine in cache senza consumare un'altra richiesta di risorsa

Tutte le caselle figlie vengono misurate prima che una qualsiasi riga parallela venga disegnata, così il contenuto non supportato o sovradimensionato ripiega sul flusso verticale di pagina senza ripetere righe già disegnate; la pianificazione annidata è limitata a 64 livelli e consuma il budget esistente di operazioni di layout

I figli a capo senza larghezza esplicita occupano una riga completa; tabelle e liste dentro figli paralleli, flex basis e shrink, wrap-reverse, sizing intrinseco dei track, track di riga e row span del grid e piazzamento grid esplicito restano fuori da questo profilo e producono diagnostica osservabile

Diagnostica CSS non supportato

Diagnostics espone record contenenti Kind, Subject, Value e MessageText; OnDiagnostic riceve le stesse informazioni durante il rendering

Proprietà sconosciute, valori non supportati, selettori non supportati e at-rule non supportati vengono ignorati con una diagnostica, incluse le dichiarazioni in regole di stylesheet altrimenti inutilizzate; i pseudo-selettori vengono saltati invece di essere trattati come normali selettori di tipo

StrictCSS, disabilitato per default, solleva EHPDFHTMLUnsupportedCSS su una diagnostica; il contenuto precedente può essere già stato emesso, quindi i chiamanti che richiedono un import all-or-nothing dovrebbero usare un documento separato

MaxDiagnostics vale 256 per default e limita i record conservati; DiagnosticCount e la consegna tramite callback restano osservabili dopo il raggiungimento del limite di archiviazione, e un limite non positivo disabilita l'archiviazione dei record

Risorse limitate

I fogli di stile esterni, le immagini e i font @font-face sono disabilitati a meno che OnResource non fornisca i loro byte, quindi l'import HTML non apre mai un file o una connessione di rete implicitamente

@font-face supporta una sorgente url(...), format('truetype') o format('opentype') opzionali, un alias di famiglia, stile normal o italic, e peso normal, bold, 400 o 700; font-display accetta le policy standard perché l'import offline carica le risorse in modo sincrono

I font devono essere risorse sfnt TrueType o OpenType incorporabili con un nome famiglia Windows ASCII di al massimo 31 caratteri; WOFF, collezioni di font, local(...), descrittori variabili e liste di sorgenti producono diagnostica

I font accettati vengono registrati privatamente nella memoria del processo su Windows e restano di proprietà del documento fino alla sua distruzione, quindi liberare l'importer prima di EndDoc non invalida l'incorporamento differito dei font

Le risorse data: e i risultati delle callback condividono i limiti MaxResources, MaxResourceBytes e MaxTotalResourceBytes

MaxDecodedImageBytes vale 128 MiB per default e limita indipendentemente la cache delle immagini decodificate a quattro byte per pixel; le dimensioni di BMP e PNG vengono verificate prima della decodifica, e ogni immagine accettata viene verificata prima di essere conservata

MaxDOMNodes, MaxCSSRules e MaxLayoutOperations limitano indipendentemente il parsing, la costruzione del cascade e il lavoro di layout

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

Statistiche

THPDFHTMLImportStatistics riporta la versione del profilo, i nodi parsati, le regole CSS, le operazioni di layout, le interruzioni di pagina, le tabelle, i controlli di modulo, le richieste di risorse, i caricamenti accettati e rifiutati, i byte di risorse accettati, le righe di testo misurate, le righe sillabate, la diagnostica, i contenitori flex e i contenitori grid

OnLineLayout riceve gli indici zero-based di pagina e riga del paragrafo, l'origine, la larghezza e l'altezza misurate, il testo logico, la direzione e il flag di sillabazione dopo che il testo PDF effettivo è stato emesso

Ogni chiamata RenderHTML5 azzera il record delle statistiche e le violazioni di budget sollevano EHPDFHTMLImportBudget

Esempio

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;

Vedi anche: THPDFPage.TextOutHTML, DOM di Layout Dichiarativo, Supporto AcroForm