RichEdit and RTF Pagination Import
THotPDF.ImportRTF loads RTF into Windows RichEdit and THotPDF.ImportRichEdit paginates an existing control into PDF pages
Rendering model
A paginação usa EM_FORMATRANGE com um retângulo de página limitado e emite cada página através de um enhanced metafile
O texto, as mudanças de fonte, a formatação de parágrafos, as linhas vetoriais e as restantes operações GDI continuam a ser operadores PDF de texto ou vetoriais sempre que os pipelines do RichEdit e de EMF os exponham dessa forma
Os dados pict de RTF e as apresentações OLE estáticas suportadas pelo RichEdit seguem o mesmo caminho EMF, pelo que não é necessário rasterizar páginas inteiras
Threading and lifecycle
- Chame ambas as APIs apenas a partir da thread principal de GUI do processo
- Chame
BeginDocbefore importing so a current page exists UseCurrentPagecontrola se a primeira página importada reutiliza a página atual ou acrescenta uma nova- A posição do stream RTF é reposta depois de uma leitura limitada
- A cache de formatos do RichEdit é libertada após sucesso, cancelamento ou falha
Segurança e orçamentos
THPDFRTFImportOptions.Default limita a entrada a 16 MiB, o texto a 4 000 000 de carateres, a saída a 1000 páginas e os dados EMF acumulados a 256 MiB
O OLE incorporado está desativado por predefinição e exige AllowOLE=True; a sua ativação deve limitar-se a RTF de confiança, porque o RichEdit do Windows controla a superfície de handlers OLE instalados
CancellationToken é verificado entre páginas e devolve risCancelled sem renderizar mais páginas
Result reporting
THPDFRTFImportStatistics regista os bytes de entrada, o intervalo de carateres, as páginas renderizadas e adicionadas, os bytes acumulados de metafile, a presença de OLE, o truncamento e um THPDFRTFImportStatus estável
Budget exhaustion, invalid page geometry, wrong-thread calls, no-progress pagination, and rendering failures return False with a specific status
Exemplo
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)]
);
Ver também: THotPDF.ImportRTF, THotPDF.ImportRichEdit, SVG Form XObject Import