Importación paginada de RichEdit y RTF
THotPDF.ImportRTF carga RTF en un RichEdit de Windows y THotPDF.ImportRichEdit pagina un control existente en páginas PDF
Modelo de renderizado
La paginación usa EM_FORMATRANGE con un rectángulo de página acotado y emite cada página a través de un enhanced metafile
El texto, los cambios de fuente, el formato de párrafo, las reglas vectoriales y las demás operaciones GDI se mantienen como texto u operadores vectoriales de PDF siempre que los pipelines de RichEdit y EMF los expongan así
Los datos pict de RTF y las presentaciones OLE estáticas soportadas por RichEdit viajan por la misma ruta EMF, así que no se requiere rasterización de la página completa
Threading y ciclo de vida
- Llame a ambas APIs solo en el thread principal de GUI del proceso
- Llame a
BeginDocantes de importar para que exista una página actual UseCurrentPagecontrola si la primera página importada reutiliza la página actual o añade una nueva- La posición del stream RTF se restaura después de una lectura acotada
- La caché de formato de RichEdit se libera después de un éxito, una cancelación o un fallo
Seguridad y presupuestos
THPDFRTFImportOptions.Default limita la entrada a 16 MiB, el texto a 4,000,000 de caracteres, la salida a 1,000 páginas y los datos EMF acumulados a 256 MiB
El OLE incrustado está deshabilitado por defecto y requiere AllowOLE=True; activarlo debería limitarse a RTF de confianza porque Windows RichEdit expone la superficie de handlers OLE instalados
CancellationToken se revisa entre páginas y devuelve risCancelled sin renderizar páginas adicionales
Reporte de resultados
THPDFRTFImportStatistics reporta los bytes de entrada, el rango de caracteres, las páginas renderizadas y añadidas, los bytes de metafile acumulados, la presencia de OLE, el truncamiento y un THPDFRTFImportStatus estable
El agotamiento del presupuesto, la geometría de página inválida, las llamadas desde un thread equivocado, la paginación sin progreso y los fallos de renderizado devuelven False con un estado específico
Ejemplo
Options := THPDFRTFImportOptions.Default;
Options.PageWidth := 612;
Options.PageHeight := 792;
Options.MarginLeft := 54;
Options.MarginRight := 54;
Document.BeginDoc;
RTFStream.Position := 0;
if not Document.ImportRTF(RTFStream, Options, Statistics) then
raise Exception.CreateFmt(
'RTF import failed with status %d',
[Ord(Statistics.Status)]
);
See also: THotPDF.ImportRTF, THotPDF.ImportRichEdit, SVG Form XObject Import