Importación de paged media HTML5

THPDFHTMLImporter.RenderHTML5 convierte markup HTML5 tolerante y print CSS en contenido PDF paginado conservando la ruta compacta heredada RenderHTML

Las longitudes CSS y el Margin, BaseFontSize, ListIndent y BlockSpacing del importador están en puntos, así que ambos renderers producen la misma página sin importar el valor de THotPDF.Resolution; 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 del profile

HTML5ProfileVersion devuelve 1 y HTML5ProfileMilestones reporta parser y cascade, layout paginado, tablas y formularios, y recursos acotados

Párrafos medidos y dirección

Los párrafos ajustan línea usando los avances medidos de la fuente actual, incluidos los cambios de fuente, las ejecuciones bold e italic, el letter spacing, el word spacing, 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 dir de HTML seleccionan la dirección del párrafo; dir="auto" usa la dirección Unicode del primer carácter fuerte

En Windows, las ejecuciones de scripts bidireccionales se resuelven con Uniscribe y se reordenan a través de los límites de estilo, mientras que el motor de texto PDF existente maneja el shaping de glifos dentro de cada ejecución; la dirección del documento, las viewer preferences y el estado de texto de página guardado se restauran después de la línea

Las anulaciones de dirección inline, bdi y bdo actualmente usan el orden del párrafo y producen un diagnóstico hdkLayoutFallback; unicode-bidi está fuera de este profile, 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 una cantidad estimada de caracteres

El importador mueve un párrafo o ajusta su división para dejar la cantidad mínima solicitada de líneas 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 cumplir 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 ­; un guion visible se emite solo cuando se usa el salto seleccionado

hyphens: auto además llama a OnHyphenate con la palabra y el valor lang de HTML heredado; sin un callback conserva los saltos manuales y reporta un fallback de layout, 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 inválidas, fuera de rango, que dividen pares sustitutos o que dividen marcas combinatorias 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 con start, end, center y stretch; el flujo en columna soporta layout vertical natural y emite un diagnóstico ante distribución de altura fija o alineación de eje transversal no soportada

display: grid soporta tracks de columna de longitud fija positivos y fr, incluidos repeat(n, tracks) acotados con hasta 64 columnas; las celdas se colocan en orden de fuente, llenando una fila a la vez

grid-column: span N y grid-column-end: span N permiten que un hijo ocupe tracks consecutivos y sus gaps intermedios; un ítem que no cabe en la fila actual pasa a la fila siguiente, y los spans mayores que la cantidad de tracks producen un fallback de layout

flex-wrap: wrap inicia otra línea cuando el ancho explícito y el gap del siguiente ítem no caben; cada línea aplica flex-grow y justify-content de forma independiente, mientras que row-reverse y RTL invierten posiciones dentro de cada línea sin mover ítems entre líneas

gap acepta una o dos longitudes, con anulaciones independientes de row-gap y column-gap; las filas paralelas permanecen en una página y se verifican antes de pintar

Los hijos paralelos soportan bloques de texto con estilo inline, 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 data URIs, conservan su relación de aspecto intrínseca cuando no se especifica altura y se decodifican una vez por nodo del DOM; el preflight y el fallback reutilizan la misma imagen en caché sin consumir otro request de recurso

Todas las cajas hijas se miden antes de pintar cualquier fila paralela, así que el contenido no soportado o demasiado grande cae 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 layout

Los hijos envueltos sin ancho explícito ocupan una línea completa; las tablas y listas dentro de hijos paralelos, el flex basis y el shrink, wrap-reverse, el dimensionamiento intrínseco de tracks, los tracks de fila y los row spans de grid y la colocación explícita de grid quedan fuera de este profile y producen diagnósticos observables

Diagnósticos de CSS no soportado

Diagnostics expone records 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 stylesheet que de lo contrario no se usan; los pseudo selectores se saltan en lugar de tratarse como selectores de tipo ordinarios

StrictCSS, deshabilitado por defecto, lanza EHPDFHTMLUnsupportedCSS ante un diagnóstico; el contenido previo puede ya haberse emitido, así que quienes necesiten una importación de todo o nada deben usar un documento separado

MaxDiagnostics tiene un valor por defecto de 256 y acota los records 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 records

Recursos acotados

Las stylesheets externas, las imágenes y las fuentes @font-face están deshabilitadas salvo que OnResource suministre sus bytes, así que la importación de HTML nunca abre un archivo o una conexión de red de forma implícita

@font-face soporta una 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 conexión carga los recursos de forma síncrona

Las fuentes deben ser recursos sfnt TrueType u OpenType embebibles con un nombre de familia Windows ASCII de 31 caracteres como máximo; WOFF, las colecciones de fuentes, local(...), los descriptores variables y las listas de fuentes producen diagnósticos

Las fuentes aceptadas se registran de forma privada en la memoria del proceso en Windows y permanecen como propiedad del documento hasta que este se destruye, así que liberar el importador antes de EndDoc no invalida el embebido diferido de fuentes

Los recursos data: y los resultados del callback comparten los límites de MaxResources, MaxResourceBytes y MaxTotalResourceBytes

MaxDecodedImageBytes tiene un valor por defecto de 128 MiB y acota de forma independiente el caché de imágenes decodificadas a cuatro bytes por píxel; las dimensiones BMP y PNG se verifican antes de decodificar, y cada imagen aceptada se verifica antes de retenerla

MaxDOMNodes, MaxCSSRules y MaxLayoutOperations acotan de forma independiente el parseo, la construcción de la cascade y el trabajo de layout

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

Estadísticas

THPDFHTMLImportStatistics reporta la versión del profile, los nodos parseados, las reglas CSS, las operaciones de layout, los saltos de página, las tablas, los controles de formulario, los requests 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 base cero de página y de línea de párrafo de la línea, el origen, el ancho y alto medidos, el texto lógico, la dirección y la bandera de separación silábica después de que el texto PDF real se haya emitido

Cada llamada a RenderHTML5 reinicia el registro de estadísticas, y las violaciones de budget 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, Declarative Layout DOM, Soporte de AcroForm