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

eggjs如何将word文档转PDF

ruisui882个月前 (04-11)技术分析25

在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” 的相关文章

如何在GitLab上回退指定版本的代码?GitLab回退指定版本问题分析

在Git中,回退到指定版本并不是删除或撤销之前的提交,而是创建一个新的提交,该提交包含指定版本的内容。这意味着您需要将当前代码更改与指定版本之间的差异进行比较,并将其合并到一个新的提交中。如果您没有更新本地代码,并且您希望将 GitLab 仓库回退到指定版本,您可以使用以下命令:git fetchg...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令![送心]git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!# 按顺序执行 git config --global user.name "自己的账号" git config -...

雅马哈TMAX 560 TECH MAX 外媒深度测评

应雅马哈(Yamaha)的邀请,在葡萄牙埃斯托里尔对全新的Yamaha TMAX 560 Tech Max踏板车进行了测试,在这里TMAX 560 Tech Max售价为11649英镑。雅马哈TMAX长期以来一直站在踏板车的顶端,就声誉和知名度而言,它是当之无愧的大踏板界NO.1。2020 TMAX...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...

Vue真是太好了 壹万多字的Vue知识点 超详细!

1??、Vue和其他两大框架的区别Angular 学习成本太高React 代码可读性差Vue 学习成本较低 很容易上手VUE官方: https://cn.vuejs.org/v2/guide/comparison.html?2??、Vue是什么Vue是一套用于构建用户界面的渐进式框架 "前端...

「网络」异常网络RST包出现的原因分析

有以下情况会发送RST包1.connect一个不存在的端口;2.向一个已经关掉的连接send数据;3.向一个已经崩溃的对端发送数据(连接之前已经被建立);4.close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;5.a重启,收到b...