PHP无原生RTF转Markdown支持,推荐用unrtf转HTML再转Markdown;次选用php-rtf库解析简单RTF;最优解是源头改用.docx/HTML等易处理格式。

PHP 本身不原生支持 RTF 解析,也没有内置函数直接将 RTF 转为 Markdown。但可以通过组合外部工具或第三方库实现——核心思路是:先将 RTF 解析为纯文本或结构化内容(如 HTML),再转换为 Markdown。
用 rtf2html 工具链中转(推荐,稳定)
RTF 格式复杂,直接解析易出错。更可靠的方式是借助成熟的命令行工具(如 unrtf 或 rtf2html)先把 RTF 转成 HTML,再用 PHP 将 HTML 转为 Markdown。
- 安装
unrtf(Linux/macOS):sudo apt install unrtf或brew install unrtf - PHP 中调用并获取 HTML:
zuojiankuohaophpcn?php
$rtfPath = '/path/to/file.rtf';
$html = shell_exec("unrtf --html '$rtfPath' 2>/dev/null | grep -v '^<!--'");
?> - 再用轻量库如 HTMLToMarkdown 转换:
$converter = new HtmlConverter();
$md = $converter->convert($html);
用 PHP-RTF 库尝试纯 PHP 解析(适合简单 RTF)
开源库 php-rtf 可读取基础 RTF 并提取文本和部分样式,但不支持嵌套表格、图片、复杂字体等。
- 通过 Composer 安装:
composer require jeremyharris/php-rtf - 基础用法:
<?php
use JeremyHarris\RTF\Document;
$doc = Document::loadFromFile('file.rtf');
$text = $doc->getText(); // 纯文本,无格式
// 若需保留粗体/斜体,需自行扩展解析逻辑(如遍历段落+控制字)
?> - 注意:该库不输出 Markdown,仅提供原始文本或低级对象,后续需手动映射样式(如
\b→**),适合定制化需求强、RTF 极简的场景。
绕过 RTF,改用中间格式导出(治本建议)
如果 RTF 来源可控(如用户上传前可选格式),优先引导使用更易处理的格式:
立即学习“PHP免费学习笔记(深入)”;
- Word 文档(.docx):用 PHPWord 解析,支持提取带样式的文本,再转 Markdown 更准确
- 纯文本(.txt)或 HTML:跳过 RTF 解析环节,直读直转
- 若来自 Word / WPS,建议导出为 HTML 或 Markdown 原生支持格式(如 Typora、Obsidian 导出),避免 RTF 这一“兼容性黑洞”
注意事项与常见坑
RTF 转 Markdown 不是无损过程,以下情况需提前预判:
- 图片:RTF 中图片通常为内嵌二进制或 OLE 对象,
unrtf一般忽略或转为占位符,需额外提取 base64 或保存为文件再重写链接 - 表格:
unrtf --html可输出 HTML 表格,但 Markdown 表格语法限制多(列数固定、对齐难),建议保留 HTML 片段或用扩展语法(如markdown-it插件) - 中文乱码:确保 RTF 文件编码为 ANSI(Windows-1252)或 UTF-16;
unrtf默认按 Latin1 解析,可用iconv预处理:iconv -f GBK -t UTF-8 file.rtf | unrtf --html - - 安全性:禁用
shell_exec时,考虑用 Docker 封装unrtf服务,或改用 Web API(如 Pandoc as a Service)











