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
- Il DOM tollerante accetta i comuni tag di fine omessi, preserva l'ordine del testo, salta le regioni di documento inattive e applica
MaxDOMNodes - Il cascade supporta selettori di tipo, classe, ID, attributo di uguaglianza, discendente e figlio diretto, ordine della sorgente, specificità, dichiarazioni inline,
!important,@media printe i margini@page - Il layout paginato supporta il flusso a blocchi, i titoli, le liste, i bordi, gli sfondi, la spaziatura delle caselle, le interruzioni di pagina esplicite, le tabelle, le immagini e la paginazione automatica dell'overflow
- Gli input di testo, i pulsanti, le caselle di controllo, i pulsanti radio, le aree di testo e i controlli select vengono resi come apparenze statiche o campi AcroForm nativi quando
CreateAcroFormsè abilitato
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