不少打印设备和打印服务只认 PCL(Printer Command Language,打印机命令语言)。手上的合同、手册是 PDF 时,过去要么装驱动用桌面软件另存,要么先把文件传到服务端转换——前者嵌不进 Web 流程,后者意味着文档离开了用户的设备。
本文介绍用 Spire.PDF for JavaScript 实现将 PDF 转换为 PCL。它基于 WebAssembly 在浏览器端直接加载与保存 PDF 文档,转换全过程在本地完成,通过虚拟文件系统(VFS)读写文件,无需后端配合。
有关安装和项目配置,请参考 React 项目中集成 Spire.PDF for JavaScript。以下示例默认已安装 Spire.PDF 并完成 WebAssembly 模块初始化。
将 PDF 转换为 PCL
要交给只认 PCL 的打印流程,可以用 PdfDocument.SaveToFile 把整份文档写成 PCL 文件——第二个参数传 FileFormat.PCL,输出为 HP-PCL XL(PCL6)。
function App() {
const convertPdfToPcl = async () => {
// 获取 Spire.PDF WASM 模块
const pdfModule = window.wasmModule?.spirepdf;
// 检查模块是否就绪
if (!pdfModule) {
alert('Spire.PDF is not ready yet');
return;
}
// 转换需要 Arial Unicode MS 字体,先放进虚拟文件系统
await window.spire.FetchFileToVFS('ARIAL UNICODE MS.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
// 将待转换的 PDF 文件载入 VFS
const inputFileName = '业务数据概览.pdf';
await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);
// 定义输出文件名
const outputFileName = '业务数据概览.pcl';
// 加载 PDF 文档,并指定 FileFormat.PCL 写出 PCL 文件
let doc = new pdfModule.PdfDocument();
doc.LoadFromFile(inputFileName);
doc.SaveToFile(outputFileName, pdfModule.FileFormat.PCL);
doc.Close();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/octet-stream' });
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>将 PDF 转换为 PCL</h1>
<button onClick={convertPdfToPcl}>
开始转换
</button>
</div>
);
}
export default App;
转换生成的 PCL 文件,文件头写明 PCL-XL 语言:

常见问题
输出文件名带 .pcl,为什么存出来的还是 PDF
原因:SaveToFile(fileName) 这个单参数重载固定按 PDF 格式写出,扩展名不参与格式判断——文件名以 .pcl 结尾,得到的依然是一份内容为 PDF 的文件。
解决:把输出格式显式作为第二个参数传入:
// 单参数:按 PDF 写出
doc.SaveToFile(outputFileName);
// 指定 FileFormat.PCL:写出真正的 PCL
doc.SaveToFile(outputFileName, pdfModule.FileFormat.PCL);
报 Cannot found font(Arial) installed on the system. 怎么解决
原因:转 PCL 要把页面上的文字转成打印机能识别的字体子集指令,转换器在虚拟文件系统的 /Library/Fonts/ 里找字体,目录为空就会抛这个错。
解决:在加载 PDF 之前把字体送进 VFS:
// 放在 LoadFromFile 之前,转换时字体已在 VFS 里
await window.spire.FetchFileToVFS('ARIAL UNICODE MS.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
生成的 PCL 文件用什么打开
原因:输出是 PCL-XL(PCL6),文件以 ESC%-12345X@PJL ENTER LANGUAGE = PCLXL 开头,其后是二进制的 HP-PCL XL;2;0 数据,并不是文本,用编辑器打开只会看到乱码。
解决:直接交给支持 PCL 的打印机或打印服务,不需要人工打开;要确认格式是否正确,看文件开头那段 PJL 声明即可。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







