OFD(Open Fixed-layout Document)是国家标准的版式文档格式,广泛应用于电子发票、电子证照、行政审批等政务与金融场景。OFD 基于 XML 描述文档结构,具有自主可控、信息安全等优势。与此同时,PDF 作为国际通用的文档格式在跨平台分发领域依然不可或缺。实际业务中经常需要在两种格式间灵活切换:接收 OFD 格式的电子发票后转为 PDF 以便打印分发,或者将现有 PDF 合同转为 OFD 以满足政务平台的上传要求。
Spire.PDF for JavaScript 基于 WebAssembly 在浏览器端直接完成 PDF 与 OFD 之间的双向转换,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.PDF for JavaScript。以下示例默认已安装 Spire.PDF 并完成 WebAssembly 模块初始化。
转换 PDF 到 OFD
PDF 转 OFD 的核心在于将 PDF 文档中的页面内容、字体和图形元素重新编码为符合 OFD 标准的 XML 描述结构。Spire.PDF for JavaScript 通过 PdfDocument 对象的 SaveToFile 方法配合 FileFormat.OFD 枚举值,一键完成格式转换,无需手动处理底层格式差异。
function App() {
const convertToOFD = async () => {
// 获取 Spire.PDF WASM 模块
const pdfModule = window.wasmModule?.spirepdf;
// 检查模块是否就绪
if (!pdfModule) {
alert('Spire.PDF is not ready yet');
return;
}
// 将字体和 PDF 文件载入 VFS
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = '演示模板.pdf';
await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);
// 创建 PdfDocument 对象并加载 PDF 文档
let doc = new pdfModule.PdfDocument();
doc.LoadFromFile(inputFileName);
// 定义为 OFD 格式的输出文件名
const outputFileName = '输出OFD.ofd';
// 保存为 OFD 格式
doc.SaveToFile({ fileName: outputFileName, fileFormat: pdfModule.FileFormat.OFD });
doc.Close();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/ofd' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Convert PDF To OFD</h1>
<button onClick={convertToOFD}>
Generate
</button>
</div>
);
}
export default App;
通过 SaveToFile 方法指定 FileFormat.OFD 生成的 OFD 文档

转换 OFD 到 PDF
OFD 转 PDF 是政务电子文件分发场景中的常见需求。Spire.PDF for JavaScript 提供了 OfdConverter 组件,专门负责将 OFD 版式文档解析并导出为标准 PDF 文件,保持原始文档的版面布局和视觉效果不变。
function App() {
const convertOFDToPDF = async () => {
// 获取 Spire.PDF WASM 模块
const pdfModule = window.wasmModule?.spirepdf;
// 检查模块是否就绪
if (!pdfModule) {
alert('Spire.PDF is not ready yet');
return;
}
// 将字体和 OFD 文件载入 VFS
await window.spire.FetchFileToVFS('SIMKAI.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = '电子发票.ofd';
await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);
// 创建 OfdConverter 对象并传入 OFD 文件路径
let converter = new pdfModule.OfdConverter(inputFileName);
// 定义为 PDF 格式的输出文件名
const outputFileName = '输出PDF.pdf';
// 转换为 PDF 格式
converter.ToPdf(outputFileName);
converter.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Convert OFD To PDF</h1>
<button onClick={convertOFDToPDF}>
Generate
</button>
</div>
);
}
export default App;
通过 OfdConverter 转换后生成的 PDF 文档

常见问题
加密的 PDF 能否转换为 OFD
原因:受密码保护的加密 PDF 无法直接通过 SaveToFile 保存为 OFD 格式,需要先解密文档。
解决:在加载 PDF 时通过 LoadFromFile 的第二个参数传入密码进行解密,然后再保存为 OFD:
// 加载带密码的 PDF 文档
let doc = new pdfModule.PdfDocument();
doc.LoadFromFile(inputFileName, "password");
// 保存为 OFD 格式
doc.SaveToFile({ fileName: outputFileName, fileFormat: pdfModule.FileFormat.OFD });
doc.Close();
转换后的 OFD 打开出现乱码
原因:OFD 文档依赖字体嵌入来保证跨平台显示一致性,如果输入 PDF 使用了未嵌入的字体且 VFS 中未加载对应字体文件,转换后可能出现文字显示异常。
解决:确保在调用转换前已将所需的 TrueType 字体文件(如 ARIALUNI.TTF)加载到 VFS 的 /Library/Fonts/ 目录下。ARIALUNI.TTF 包含了常用的中日韩文字符,是保证转换质量的首选字体。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









