Office OOXML 本地转 PDF / TXT / Markdown
引擎:libzen_office2pdf.so
Office 文档转换走 ZenConverter 自研的 native 库:
- 库文件:
libzen_office2pdf.so(arm64-v8a only); - 当前版本:v0.8.1;
- 依赖字体:Noto Sans 和 Noto Serif CJK(中简/中繁/日/韩),默认用系统字体,可选下载高保真版本。
为什么自研?因为 Android 没有内置的 Office 渲染 API,而开源的 LibreOffice Android 移植版本体积巨大(几百 MB)。libzen_office2pdf.so 的思路是只渲染,不编辑——不做 Office 文档编辑的完整实现,只做够"转 PDF"的那一部分。
支持的输入格式
| 输入 | 说明 |
|---|---|
| DOCX | Office Open XML 文档(Word 2007+) |
| PPTX | Office Open XML 演示(PowerPoint 2007+) |
| XLSX | Office Open XML 表格(Excel 2007+) |
不支持:老版 DOC/PPT/XLS(二进制 Office 格式)、Pages/Numbers/Keynote(苹果格式)、WPS 专有格式、PDF 输入(这是 PDF 路线负责的)。
输出格式
| 输出 | 说明 |
|---|---|
| office2pdf 原生渲染 → 输出 PDF | |
| TXT | 先转 PDF → 再用 PDFBox-Android 提取 TXT |
| Markdown | 先转 PDF → 再用 PDFBox-Android 提取 Markdown |
TXT 和 Markdown 输出不是 office2pdf 直接导出的——中间经过 PDF 作为桥接。这意味着 TXT/Markdown 的质量取决于:
- office2pdf 渲染 PDF 时有没有把文字正确渲染出来;
- PDFBox-Android 从渲染后的 PDF 里能不能正确提取文字层。
中文渲染:系统字体 vs Noto CJK
v0.2.0 版本引入了 Office 字体策略的改变:
| 策略 | 说明 | 字体来源 |
|---|---|---|
| 默认:系统字体 | 自动发现 Android 系统的可用字体路径 | 0 MB 下载,100% 离线 |
| 可选:Noto CJK | 按需下载高保真 Noto Sans/Serif CJK 字体 | 约 30.8 MB,渲染宋体/仿宋等衬线字体更准 |
v0.2.0 之前版本把 Noto CJK 打包进 APK,导致 APK 体积大幅增加。v0.2.0 之后改成系统字体优先 + 按需下载,既节省了 APK 体积,也让用户可以根据自己的设备情况选择。
系统字体在大多数 Android 设备上已经包含中文字体(Roboto CJK 或厂商定制字体),默认情况下已经能正确渲染中文。Noto CJK 适合需要精确匹配衬线字体(宋体、仿宋)或某些罕见字形的场景。
源文件上限 64 MiB
office2pdf 引擎整个输入文件一次性读入内存。为了避免 OOM,设定了 64 MiB 的硬上限——源文件超过 64 MiB 会直接失败,不会尝试处理。
64 MiB 对于绝大多数 Office 文档是绰绰有余的(一个典型的 50 页 Word 文档也就几 MB)。大 PPTX 如果嵌了很多高分辨率图片可能会逼近这个上限。
Beta 状态与版式保真边界
Office 文档转换路线当前标记为 Beta,原因直接写在 README 里:
No fidelity guarantee for Microsoft Office layout; overlapping text, shifted shapes, and degraded slide/spreadsheet layout remain expected on complex files.
翻译一下:不承诺 Microsoft Office 版式完全保真;文字重叠、图形偏移、幻灯片/表格布局降级在复杂文件上仍有可能发生。
具体边界:
| 场景 | 可能的问题 |
|---|---|
| 复杂 PPTX(多图层动画、自定义主题) | 文字可能重叠、图形可能错位 |
| 复杂 XLSX(合并单元格、公式计算、条件格式) | 合并单元格可能被拆开、公式只显示静态值 |
| 带嵌入媒体的 PPTX(视频、音频、Flash) | 媒体对象可能丢失或变成占位符 |
| 特殊字体(系统未安装) | 用替代字体渲染,版式偏移 |
| 表格/图表(Office 原生图表对象) | 可能被栅格化或用简化方式呈现 |
已知限制
- arm64-v8a only:
libzen_office2pdf.so只编译了 arm64,32 位 ARM 设备不走这条; - 只读全文件进内存:64 MiB 上限是硬限制,大文件不走分块读取;
- 不保留 Office 内部结构:输出 PDF 是"拍平"后的,不是 Office 文档的 1:1 矢量还原。
使用场景
| 场景 | 推荐 |
|---|---|
| 快速预览别人发来的 DOCX(手机上没装 Office) | office2pdf 转 PDF,然后 PDF 查看器直接看 |
| 从 DOCX 论文里提取纯文字做笔记 | DOCX → Markdown(走 office2pdf → PDFBox 管线) |
| 复杂版式的 PPTX 需要精确还原 | 桌面端 PowerPoint 更靠谱 |
相关页面
- PDF 合并与智能压缩 —— Office 转出来的 PDF 可以继续走 PDF 管线
- PDF 提取 TXT / Markdown —— Office → TXT/MD 也是先转 PDF 再提取
- 动态像素预算与 OOM 防护 —— Office 64 MiB 上限也是 OOM 防护策略的一部分
