Импорт RichEdit и RTF с пагинацией
THotPDF.ImportRTF загружает RTF в Windows RichEdit, а THotPDF.ImportRichEdit разбивает существующий контрол на PDF-страницы
Модель рендеринга
Пагинация использует EM_FORMATRANGE с ограниченным прямоугольником страницы и выдаёт каждую страницу через enhanced metafile
Текст, смена шрифтов, форматирование абзацев, векторные линейки и прочие GDI-операции остаются PDF-текстом или векторными операторами всюду, где конвейеры RichEdit и EMF выдают их именно так
Данные RTF pict и поддерживаемые RichEdit статические OLE-представления идут тем же EMF-путём, поэтому полная растеризация страницы не требуется
Потоки и жизненный цикл
- Вызывайте оба API только в главном GUI-потоке процесса
- Вызывайте
BeginDocдо импорта, чтобы текущая страница существовала UseCurrentPageопределяет, переиспользует ли первая импортированная страница текущую страницу или добавляет новую- Позиция RTF stream восстанавливается после ограниченного чтения
- Кеш форматирования RichEdit освобождается после успеха, отмены или сбоя
Безопасность и бюджеты
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