pdf/a 是 iso 标准化的长期归档格式,它将文档中的字体、色彩和元数据固化到统一的合规层级,确保文档在未来数十年内无论使用何种 pdf 阅读器都能完整重现。与之相对,普通 pdf 在日常编辑和内容提取上更加灵活。实际业务中通常需要在两种格式间灵活切换:合同归档时转为 pdf/a 以满足法规要求,审计复核时又需还原为普通 pdf 以提取文本内容。
spire.pdf for javascript 基于 webassembly 在浏览器端直接完成 pdf 与 pdf/a 之间的双向转换,通过虚拟文件系统(vfs)管理输入输出文件,无需后端j9官方网址的服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 react 项目中集成 spire.pdf for javascript。以下示例默认已安装 spire.pdf 并完成 webassembly 模块初始化。
转换 pdf 到 pdf/a
pdf/a 归档转换的核心在于将普通 pdf 中的字体、色彩和元数据固化到符合 iso 标准的层级。spire.pdf 通过 pdfstandardsconverter 组件一键完成此操作,产品支持 pdf/a-1a、pdf/a-1b、pdf/a-2a、pdf/a-2b、pdf/a-3a、pdf/a-3b 等多个合规级别。
pdfstandardsconverter 支持的转换标准及其适用场景如下:
| 方法 | 标准 | 说明 |
|---|---|---|
topdfa1b |
pdf/a-1b | 基于 pdf 1.4,仅保证视觉外观的可再现性,是最常用的归档级别 |
topdfa1a |
pdf/a-1a | 在 1b 基础上要求文档标签与结构信息,支持无障碍阅读 |
topdfa2a |
pdf/a-2a | 基于 pdf 1.7,要求标签与结构信息,支持图层和透明度 |
topdfa2b |
pdf/a-2b | pdf/a-2 基本合规级别,允许透明度、图层和嵌入 ole 对象 |
topdfa3a |
pdf/a-3a | 在 2a 基础上允许嵌入 xml、excel 等任意格式文件作为附件 |
topdfa3b |
pdf/a-3b | pdf/a-3 基本合规级别,支持嵌入任意格式附件 |
topdfx1a2001 |
pdf/x-1a:2001 | 印刷交换标准,适合出版和打印工作流 |
以下以 pdf/a-2b 为例演示转换过程:
function app() {
const converttopdfa = 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/`);
// 创建 pdfstandardsconverter
let converter = new pdfmodule.pdfstandardsconverter({ filepath: inputfilename });
// 转换为 pdf/a-1b 格式
const outputfilename = 'topdfa_result.pdf';
converter.topdfa2b({ filepath: outputfilename });
// // 转换为 pdf/a-1a
// converter.topdfa1a({ filepath: outputfilename });
// // 转换为 pdf/a-2a
// converter.topdfa2a({ filepath: outputfilename });
// // 转换为 pdf/a-2b
// converter.topdfa2b({ filepath: outputfilename });
// // 转换为 pdf/a-3a
// converter.topdfa3a({ filepath: outputfilename });
// // 转换为 pdf/a-3b
// converter.topdfa3b({ filepath: outputfilename });
// // 转换为 pdf/x-1a:2001
// converter.topdfx1a2001({ filepath: outputfilename });
// 从 vfs 读取转换后的文件,触发下载
const filearray = window.dotnetruntime.module.fs.readfile(outputfilename);
const blob = new blob([filearray], { type: 'application/pdf' });
const url = url.createobject;
const a = document.createelement('a');
a.href = url;
a.download = outputfilename;
a.click();
url.revokeobject;
// 释放资源
converter.dispose();
};
return (
在 react 中使用 javascript 实现 pdf 与 pdf/a 格式互转-j9官方网址
);
}
export default app;
通过 pdfstandardsconverter 转换后生成的 pdf/a 输出

转换 pdf/a 到 pdf
pdf/a 是长期归档的标准格式,但在日常编辑和内容提取场景中,可能需要将 pdf/a 还原为标准 pdf。spire.pdf for javascript 通过加载 pdf/a 文档后逐页复制内容到新文档的方式实现这一反向转换,确保输出的标准 pdf 不保留 pdf/a 合规约束。
function app() {
const converttonormalpdf = 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 = 'pdfa_jp.pdf';
await window.spire.fetchfiletovfs(inputfilename, "", `${process.env.public_url}/data/`);
// 创建 pdfdocument 对象
let doc = new pdfmodule.pdfdocument();
doc.loadfromfile(inputfilename);
// 创建新的 pdf 文档用于在新文件上绘制内容
let newdoc = new pdfmodule.pdfnewdocument();
newdoc.compressionlevel = pdfmodule.pdfcompressionlevel.none;
// 遍历原始文档中的每一页
for (let i = 0; i < doc.pages.count; i ) {
let page = doc.pages.get_item(i);
// 获取当前页面的大小
let size = page.size;
// 向新文档添加相同大小且无边距的页面
let newpage = newdoc.pages.add({ size: size, margins: new pdfmodule.pdfmargins() });
// 将原始页面的内容绘制到新页面上
let template = page.createtemplate();
let layoutwidget = new pdfmodule.pdflayoutwidget(template.h);
layoutwidget.draw({ page: newpage, x: 0, y: 0 });
// page.createtemplate().draw({page: newpage, x: 0, y: 0});
}
// 定义输出文件名
const outputfilename = "pdfatopdf_result.pdf";
// 保存文档到指定路径
newdoc.save(outputfilename);
// 从 vfs 读取生成的文件并触发下载
const filearray = window.dotnetruntime.module.fs.readfile(outputfilename);
const blob = new blob([filearray], { type: 'application/pdf' });
const url = url.createobject;
const a = document.createelement('a');
a.href = url;
a.download = outputfilename;
a.click();
url.revokeobject;
// 释放资源
newdoc.dispose();
doc.dispose();
};
return (
);
}
export default app;
通过创建新文档逐页复制内容生成的普通 pdf 输出

常见问题
加密的 pdf 能否转换为 pdf/a
原因:需要输入密码才能打开的加密 pdf 无法直接被 pdfstandardsconverter 处理,需要在加载时提供密码。
解决:pdfstandardsconverter 方法支持传入 password 参数,转换带密码的 pdf 到 pdf/a:
// 创建 pdfstandardsconverter 时指定密码
let converter = new pdfmodule.pdfstandardsconverter({ filepath: inputfilename, password: "password" });
converter.topdfa2a({ filepath: outputfilename });
converter.dispose();
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用javascript。获取有效期 30 天的临时许可证。




