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

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