You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron中Docx转PDF生成损坏文件问题排查及库推荐咨询

代码存在的问题

  1. PDF保存编码错误
    PDF是二进制文件,你用fs.writeFile时指定了'utf-8'编码,会把二进制内容转成文本格式写入,直接破坏文件结构,导致PDF损坏。修正时去掉编码参数即可:
// 错误写法
fs.writeFile( docPaths[p].replace('.docx', '.pdf'), Buffer.from(outputFile), 'utf-8', (err) => { ... })
// 修正后
fs.writeFile(docPaths[p].replace('.docx', '.pdf'), Buffer.from(outputFile), (err) => { ... })
  1. 重复处理文件的逻辑漏洞
    你维护的docPaths数组会不断累加文件路径,每次生成新文件后都循环整个数组提交转换,导致旧文件被重复处理,甚至可能因为文件已被删除而报错。直接处理当前生成的filePath即可,不需要全局数组。

  2. 未校验API响应有效性
    调用在线API后没有检查响应状态,如果API返回4xx/5xx错误,你会把错误页面的内容当成PDF保存,自然出现损坏。应该先判断响应是否正常:

if (!response.ok) throw new Error(`API请求失败: ${response.status}`);
const outputFile = await response.arrayBuffer();
  1. 异步逻辑混乱
    你在async函数里嵌套大量then,不仅可读性差,还容易出现异步顺序错误。建议用async/await替代链式then,简化代码结构。

推荐的Docx转PDF方案

不想依赖不稳定的在线API的话,优先选择本地处理方案:

  • docx-pdf:基于LibreOffice封装的Node.js库,支持Windows/macOS/Linux,转换效果能保留大部分Docx样式,适合Electron应用。使用前需要确保系统安装LibreOffice,打包时可提示用户安装依赖。
    简化使用示例:
    const docxConverter = require('docx-pdf');
    docxConverter(inputDocxPath, outputPdfPath, (err) => {
      if (err) throw err;
      // 转换完成后删除原Docx文件
      fs.unlink(inputDocxPath, (err) => { ... });
    });
    
  • unoconv:同样依赖LibreOffice,支持更多Office格式转换,功能和docx-pdf类似。
  • 若需纯JS实现(无外部依赖),可尝试mammoth解析Docx内容,再用pdfkit生成PDF,但这种方式对复杂样式支持有限,仅适合简单文档。

内容的提问来源于stack exchange,提问作者OHICT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:07:43