Импорт RichEdit и RTF с пагинацией

THotPDF.ImportRTF загружает RTF в Windows RichEdit, а THotPDF.ImportRichEdit разбивает существующий контрол на PDF-страницы

Модель рендеринга

Пагинация использует EM_FORMATRANGE с ограниченным прямоугольником страницы и выдаёт каждую страницу через enhanced metafile

Текст, смена шрифтов, форматирование абзацев, векторные линейки и прочие GDI-операции остаются PDF-текстом или векторными операторами всюду, где конвейеры RichEdit и EMF выдают их именно так

Данные RTF pict и поддерживаемые RichEdit статические OLE-представления идут тем же EMF-путём, поэтому полная растеризация страницы не требуется

Потоки и жизненный цикл

Безопасность и бюджеты

THPDFRTFImportOptions.Default ограничивает ввод 16 MiB, текст 4,000,000 символов, вывод 1,000 страниц, а накопленные данные EMF — 256 MiB

Встроенный OLE по умолчанию выключен и требует AllowOLE=True; включать его стоит только для доверенного RTF, потому что установленные OLE-обработчики находятся в ведении Windows RichEdit

CancellationToken проверяется между страницами и возвращает risCancelled без рендеринга дополнительных страниц

Отчёт о результате

THPDFRTFImportStatistics сообщает входные байты, диапазон символов, отрисованные и добавленные страницы, накопленные байты metafile, наличие OLE, усечение и стабильный THPDFRTFImportStatus

Исчерпание бюджета, неверная геометрия страницы, вызовы из чужого потока, пагинация без прогресса и сбои рендеринга возвращают False с конкретным статусом

Пример

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)]
  );

См. также: THotPDF.ImportRTF, THotPDF.ImportRichEdit, SVG Form XObject Import