RichEdit 与 RTF 分页导入
THotPDF.ImportRTF 将 RTF 加载到 Windows RichEdit 中,THotPDF.ImportRichEdit 将现有控件分页为 PDF 页面
渲染模型
分页使用 EM_FORMATRANGE 配合有界的页面矩形,并通过增强型图元文件发出每个页面
当 RichEdit 和 EMF 管线以这种方式公开时,文本、字体更改、段落格式、矢量规则和其他 GDI 操作保持为 PDF 文本或矢量运算符
RTF pict 数据和 RichEdit 支持的静态 OLE 呈现由同一 EMF 路径携带,因此不需要整页栅格化
线程与生命周期
- 只在进程 GUI 主线程上调用这两个 API
- 导入前调用
BeginDoc,以便存在当前页面 UseCurrentPage控制第一个导入页面是复用当前页面还是追加新页面- 有界读取后恢复 RTF 流位置
- 成功、取消或失败后释放 RichEdit 格式缓存
安全与预算
THPDFRTFImportOptions.Default 将输入限制为 16 MiB,文本限制为 4,000,000 个字符,输出限制为 1,000 页,累计 EMF 数据限制为 256 MiB
嵌入式 OLE 默认禁用,需要 AllowOLE=True;启用它应仅限于受信任的 RTF,因为 Windows RichEdit 拥有已安装的 OLE 处理程序表面
CancellationToken 在页面之间检查,返回 risCancelled 而不渲染额外页面
结果报告
THPDFRTFImportStatistics 报告输入字节、字符范围、渲染和添加的页面、累计图元文件字节、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 表单 XObject 导入