Método THotPDF.PreviewLoadedPageTextReplacement

Prepara el texto de reemplazo con fuentes Unicode embebidas, mide cada coincidencia y devuelve un plan auditable sin modificar el documento cargado

function PreviewLoadedPageTextReplacement(PageIndex: Integer;
  const Needle, Replacement: UnicodeString; MatchCase: Boolean;
  const Options: THPDFLoadedTextReplacementOptions;
  out Plan: THPDFLoadedTextReplacementPlan): Boolean;

Opciones y resultados

THPDFLoadedTextReplacementOptions.Default usa Arial, el tamaño de fuente original de la coincidencia, su ancho medido y una altura de 1.25 veces ese tamaño, con el rechazo atómico habilitado

Appearance selecciona fuente, estilo, color, alineación y padding; UseMatchFontSize=False usa el tamaño solicitado, mientras que un BoxWidth y un BoxHeight positivos proporcionan una caja de wrapping explícita

Appearance.OverflowPolicy selecciona ltopReject, ltopClip o ltopShrinkToFit; el clipping retiene solo el texto que hizo caber el productor y el shrink-to-fit se detiene en MinFontSize

THPDFLoadedTextReplacementPlan transporta la solicitud, las opciones, el fingerprint del origen, los conteos y el array THPDFLoadedTextReplacementResults

Cada THPDFLoadedTextReplacementResult reporta índices de glifos, posición original, dimensiones de la caja, tamaño de fuente efectivo y un valor THPDFLoadedTextReplacementStatus: ltrsReady, ltrsApplied, ltrsRejected o ltrsRolledBack, con un motivo de rechazo o de rollback

MaxMatches, MaxGlyphs, MaxContentTokens, MaxContentBytes, MaxGeneratedBytes y el límite de texto de la apariencia acotan el parseo del origen, la salida y los recursos de fuente copiados

Geometría y atomicidad

El reemplazo generado usa las cadenas de fallback de fuentes del documento, ShapingFeatures, los switches de auto-shaping de scripts y las selecciones de script e idioma del GSUB; configuren todo esto antes de previsualizar y mantengan los mismos ajustes al aplicar el plan

Cada apariencia de reemplazo limita las selecciones de fuentes de shaping distintas a 256 y los datos crudos de fuentes acumulados a 64 MiB, además de los presupuestos de parseo y de salida generada de la solicitud

El reemplazo cambia de fuente dentro del stream de texto original, mantiene el texto circundante buscable y restaura las matrices originales de pen y de línea para que los glifos siguientes y las transiciones de línea conserven sus posiciones

Se soporta el texto directo de página con geometría horizontal no singular, incluyendo transforms de página, escalado de texto, rise, el operador TJ, los operadores de comillas simples/dobles y las coincidencias que cruzan operandos adyacentes en la misma línea base

Se rechazan las coincidencias que cruzan líneas base, la escritura vertical, los transforms singulares, el contenido desbalanceado, los glifos faltantes y los documentos que contienen campos de firma; el texto dentro de Form XObjects queda fuera del alcance de coincidencias de esta API

Con Atomic=True, cualquier coincidencia rechazada hace rollback de todas las coincidencias listas; con Atomic=False, las coincidencias listas pueden aplicarse mientras las rechazadas quedan sin cambios, y el resultado booleano sigue siendo False cuando alguna coincidencia fue rechazada

La preview usa y revierte una transacción de graph anidada, preservando una transacción existente del llamador; puede invalidar cachés del documento e invocar la notificación de modificación del documento aunque el contenido se restaure

Commit

Pasen el plan a ApplyLoadedPageTextReplacement para revalidar su fingerprint de contenido y de métricas de glifos antes de aplicar la solicitud en una transacción de graph

Recalculen el plan después de cada cambio de contenido; un plan desactualizado lanza EInvalidOpException sin aplicar sus reemplazos

Options := THPDFLoadedTextReplacementOptions.Default;
Options.Appearance.OverflowPolicy := ltopShrinkToFit;
if PDF.PreviewLoadedPageTextReplacement(0, 'Original', NewText,
  True, Options, Plan) then
  if PDF.ApplyLoadedPageTextReplacement(Plan, Applied) then
    PDF.SaveLoadedDocument(TargetPath);