Importación de medios paginados HTML5
THPDFHTMLImporter.RenderHTML5 convierte el marcado HTML5 tolerante y el CSS de impresión en contenido PDF paginado mientras conserva la ruta heredada compacta RenderHTML
Las longitudes CSS y los Margin, BaseFontSize, ListIndent y BlockSpacing del importador están en puntos, así que ambos renderizadores producen la misma página sea cual sea el THotPDF.Resolution configurado; su propio dibujo antes y después de la importación sigue usando 1/Resolution de pulgada
Declaración
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;
Contrato de perfil
HTML5ProfileVersion devuelve 1 y HTML5ProfileMilestones informa del analizador y la cascada, el diseño paginado, las tablas y formularios y los recursos acotados
- El DOM tolerante acepta etiquetas de cierre omitidas comunes, conserva el orden del texto, omite las regiones de documento inactivas y aplica
MaxDOMNodes - La cascada admite selectores de tipo, clase, ID, atributo de igualdad, descendientes e hijos directos, orden de origen, especificidad, declaraciones en línea,
!important,@media printy márgenes de@page - El diseño paginado admite flujo de bloques, encabezados, listas, bordes, fondos, espaciado de cajas, saltos de página explícitos, tablas, imágenes y paginación automática por desbordamiento
- Las entradas de texto, los botones, las casillas de verificación, los botones de opción, las áreas de texto y los controles de selección se renderizan como apariencias estáticas o campos AcroForm nativos cuando
CreateAcroFormsestá habilitado
Párrafos medidos y dirección
Los párrafos se ajustan con los avances medidos de la fuente actual, incluidos los cambios de fuente, los runs bold e italic, el espaciado de letras, el espaciado de palabras, los saltos de línea explícitos y los límites de caracteres de Asia Oriental; la alineación y la decoración se aplican por separado a cada línea resultante
direction: ltr, direction: rtl y el atributo HTML dir seleccionan la dirección del párrafo; dir="auto" usa la dirección Unicode del primer carácter fuerte
En Windows, los runs bidiireccionales de script se resuelven con Uniscribe y se reordenan a través de los límites de estilo, mientras que el motor de texto PDF existente se encarga del shaping de glifos dentro de cada run; la dirección del documento, las preferencias del visor y el estado de texto de página guardado se restauran después de la línea
Las anulaciones de dirección en línea, bdi y bdo usan actualmente el orden del párrafo y producen un diagnóstico hdkLayoutFallback; unicode-bidi está fuera de este perfil, y el shaping de scripts sigue la configuración de shaping del documento
Fragmentación de párrafos
widows y orphans son enteros positivos heredables, ambos con valor por defecto 2; la paginación usa las cajas de línea medidas en lugar de un número estimado de caracteres
El importador mueve un párrafo o ajusta su división para dejar el número mínimo de líneas solicitado antes y después de un salto de página; break-inside: avoid mantiene un párrafo junto cuando cabe en una página nueva
Cuando una página no puede satisfacer la restricción solicitada, el renderizado avanza relajando la restricción y registrando hdkPaginationConstraint; cada fragmento de página recibe su propio fondo y borde
Separación silábica opcional
hyphens: none suprime los saltos discrecionales, y el valor por defecto hyphens: manual usa U+00AD o ­; el guion visible solo se emite cuando se usa el salto seleccionado
hyphens: auto además llama a OnHyphenate con la palabra y el valor HTML lang heredado; sin callback conserva los saltos manuales e informa de un fallback de maquetación, porque no se incluye ningún diccionario de idioma
Las posiciones de salto cuentan unidades de código UTF-16 desde el inicio de la palabra; las posiciones no válidas, fuera de rango, que parten sustitutos o que parten marcas combinables básicas se ignoran
THPDFHTMLHyphenationEvent = procedure(
Sender: TObject;
const WordText, Language: WideString;
var BreakPositions: TArray<Integer>
) of object;
Cajas flex y grid acotadas
display: flex soporta row, row-reverse, column y column-reverse; los hijos de una fila usan anchos explícitos o comparten el ancho restante, y los valores positivos de flex-grow ponderan el espacio adicional
Las filas soportan justify-content con start, end, center, space-between, space-around y space-evenly, más la alineación del eje transversal start, end, center y stretch; el flujo en columna soporta la maquetación vertical natural y emite un diagnóstico ante distribución de altura fija o alineación de eje transversal no soportadas
display: grid soporta pistas de columna fr y de longitud fija positivas, incluido repeat(n, tracks) acotado con hasta 64 columnas; las celdas se colocan en orden de origen, llenando una fila cada vez
grid-column: span N y grid-column-end: span N permiten que un hijo ocupe pistas consecutivas y sus huecos intermedios; un elemento que no cabe en la fila actual pasa a la fila siguiente, y los span mayores que el número de pistas producen un fallback de maquetación
flex-wrap: wrap inicia otra línea cuando el ancho explícito y el hueco del siguiente elemento no caben; cada línea aplica flex-grow y justify-content de forma independiente, mientras que row-reverse y RTL invierten las posiciones dentro de cada línea sin mover elementos entre líneas
gap acepta una o dos longitudes, con anulaciones independientes de row-gap y column-gap; las filas paralelas permanecen en una sola página y se comprueban antes de pintar
Los hijos paralelos soportan bloques de texto con estilo en línea, contenedores de bloque ordinarios anidados recursivamente con padding, bordes y fondos, contenedores flex y grid anidados, imágenes y controles de formulario estáticos o nativos
Las imágenes usan bytes suministrados por callback o URI de datos, conservan su relación de aspecto intrínseca cuando no se especifica altura y se decodifican una vez por nodo DOM; el preflight y el fallback reutilizan la misma imagen cacheada sin consumir otra solicitud de recurso
Todas las cajas hijas se miden antes de pintar cualquier fila paralela, de modo que el contenido no soportado o sobredimensionado recurre al flujo vertical de página sin repetir filas ya pintadas; la planificación anidada se acota a 64 niveles y consume el presupuesto existente de operaciones de maquetación
Los hijos envolventes sin ancho explícito ocupan una línea completa; las tablas y listas dentro de hijos paralelos, la base y reducción flex, wrap-reverse, el dimensionamiento intrínseco de pistas, las pistas de fila grid y los spans de fila, y la colocación grid explícita siguen fuera de este perfil y producen diagnósticos observables
Diagnósticos de CSS no soportado
Diagnostics expone registros con Kind, Subject, Value y MessageText; OnDiagnostic recibe la misma información durante el renderizado
Las propiedades desconocidas, los valores no soportados, los selectores no soportados y las at-rules no soportadas se ignoran con un diagnóstico, incluidas las declaraciones en reglas de hoja de estilo que no se usan; los pseudo selectores se omiten en lugar de tratarse como selectores de tipo ordinarios
StrictCSS, deshabilitado por defecto, lanza EHPDFHTMLUnsupportedCSS ante un diagnóstico; el contenido previo puede haberse emitido ya, así que los llamadores que exijan una importación de todo o nada deben usar un documento aparte
MaxDiagnostics vale 256 por defecto y acota los registros retenidos; DiagnosticCount y la entrega por callback siguen siendo observables después de alcanzar el límite de almacenamiento, y un límite no positivo deshabilita el almacenamiento de registros
Recursos acotados
Las hojas de estilo, imágenes y fuentes @font-face externas están deshabilitadas a menos que OnResource proporcione sus bytes, por lo que la importación HTML nunca abre un archivo o una conexión de red de forma implícita
@font-face soporta una única fuente url(...), format('truetype') o format('opentype') opcional, un alias de familia, estilo normal o italic, y peso normal, bold, 400 o 700; font-display acepta las políticas estándar porque la importación sin red carga los recursos de forma síncrona
Las fuentes deben ser recursos sfnt TrueType u OpenType incrustables con un nombre de familia Windows ASCII de 31 caracteres como máximo; WOFF, colecciones de fuentes, local(...), descriptores variables y listas de fuentes generan diagnósticos
Las fuentes aceptadas se registran de forma privada en memoria de proceso en Windows y siguen siendo propiedad del documento hasta que este se destruye, de modo que liberar el importador antes de EndDoc no invalida la incrustación de fuentes diferida
Los recursos data: y los resultados de devolución de llamada comparten los límites MaxResources, MaxResourceBytes y MaxTotalResourceBytes
MaxDecodedImageBytes vale 128 MiB por defecto y acota de forma independiente la caché de imágenes decodificadas a cuatro bytes por píxel; las dimensiones BMP y PNG se comprueban antes de decodificar, y cada imagen aceptada se comprueba antes de retenerla
MaxDOMNodes, MaxCSSRules y MaxLayoutOperations acotan de forma independiente el análisis, la construcción de la cascada y el trabajo de diseño
THPDFHTMLResourceEvent = procedure(
Sender: TObject;
const URI: WideString;
ResourceKind: THPDFHTMLResourceKind;
var Data: TBytes;
var ContentType: string;
var Handled: Boolean
) of object;
Estadísticas
THPDFHTMLImportStatistics informa de la versión del perfil, los nodos analizados, las reglas CSS, las operaciones de diseño, los saltos de página, las tablas, los controles de formulario, las solicitudes de recursos, las cargas aceptadas y rechazadas, los bytes de recursos aceptados, las líneas de texto medidas, las líneas con guion, los diagnósticos, los contenedores flex y los contenedores grid
OnLineLayout recibe los índices de línea de página y de párrafo basados en cero de la línea, el origen, el ancho y alto medidos, el texto lógico, la dirección y el indicador de separación silábica después de que el texto PDF real haya sido emitido
Cada llamada a RenderHTML5 restablece el registro de estadísticas, y las violaciones de presupuesto generan EHPDFHTMLImportBudget
Ejemplo
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;
Véase también: THPDFPage.TextOutHTML, DOM de diseño declarativo, Compatibilidad con AcroForm