当前位置:首页 > 技术分析 > 正文内容

eggjs如何将word文档转PDF

ruisui883周前 (04-11)技术分析13

在Egg.js中将Word文档转换为PDF可以通过两种主要方法实现:使用LibreOffice命令行工具或结合Mammoth.js和Puppeteer库,其中使用LibreOffice的质量好,下面介绍一下这种方式:

步骤1:安装LibreOffice

确保服务器安装LibreOffice:

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install libreoffice

步骤2:处理文件上传

配置Egg.js的文件上传,在config.default.js中:

config.multipart = {
  mode: 'file',
  tmpdir: path.join(__dirname, '../tmp'),
};

步骤3:编写转换Controller

// app/controller/convert.js
const Controller = require('egg').Controller;
const { exec } = require('child_process');
const util = require('util');
const path = require('path');
const fs = require('fs').promises;

const execPromise = util.promisify(exec);

class ConvertController extends Controller {
  async wordToPdf() {
    const { ctx } = this;
    const file = ctx.request.files[0];
    
    if (!file) {
      ctx.status = 400;
      return ctx.body = { error: '未上传文件' };
    }

    const outputDir = path.join(this.config.baseDir, 'tmp/pdf');
    await fs.mkdir(outputDir, { recursive: true });

    try {
      // 转换命令
      const cmd = `libreoffice --headless --convert-to pdf --outdir ${outputDir} "${file.filepath}"`;
      await execPromise(cmd);

      // 生成PDF路径
      const pdfName = `${path.basename(file.filename, path.extname(file.filename))}.pdf`;
      const pdfPath = path.join(outputDir, pdfName);

      // 设置响应头
      ctx.set('Content-Type', 'application/pdf');
      ctx.set('Content-Disposition', `attachment; filename="${pdfName}"`);
      ctx.body = await fs.readFile(pdfPath);

      // 清理文件
      await Promise.all([
        fs.unlink(file.filepath),
        fs.unlink(pdfPath),
      ]);
    } catch (error) {
      ctx.logger.error('转换失败:', error);
      ctx.status = 500;
      ctx.body = { error: '转换失败' };
    }
  }
}

module.exports = ConvertController;

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3444.html

标签: js文档
分享给朋友:

“eggjs如何将word文档转PDF” 的相关文章

Git分布式系统---Gitlab多人工作流程

前言在上一次推文中,我们已经很清楚的讲解了如何创建本地仓库、提交(push)项目到远程仓库以及从远程仓库clone(克隆)项目到本地的相关操作。大家可以先去看前面的推文(快速掌握Git分布式系统操作)点击查看目前无论你是否步入社会还是在校学生,都会使用Gitlab来进行团队的代码管理。(可以这样说:...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

Acustica Audio 发布模拟Roland Jupiter 双声道合成器插件 TH2

福利: Acustica Audio 发布模拟Roland Jupiter 风格的双声道合成器插件 TH2 免费下载 意大利 Acustica Audio 公司发布布模拟Roland Jupiter 风格的双声道合成器插件 TH2 ,灵感来源于Acustica Audio的THING-8系列,它是...

三维家-系统快捷键使用

快键件使用:通过简单的键盘+鼠标操作,快速完成搭配。1.基础快捷键1) Ctrl+V:复制选中对象第一步:鼠标左击物体,按下Ctrl+V 即可复制选中对象。2) Ctrl+G:组合多选对象第一步:按住Ctrl键多选对象--按住Ctrl+G--确定。3) Ctrl+B:解组选中对象第一步:左击选中对象...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...

Vue页面传参详解

一、两种方式方法1:name跳转页面this.$router.push({name:'anotherPage',params:{id:1}})另一页面接收参数方式:this.$route.params.id示例:控制台展示:方法2:path跳转页面this.$router.push(...