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

eggjs如何将word文档转PDF

ruisui882周前 (04-11)技术分析12

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

有效地简化导航-Part 1:信息架构

「四步走」——理想的导航系统要做一个可用的导航系统,网页设计师必须按顺序回答以下4个问题:1. 如何组织内容?2. 如何解释导航的选项?3. 哪种导航菜单最适合容纳这些选项?4. 如何设计导航菜单?前两个问题关注构建和便签内容,通常称为信息架构。信息架构师通常用网站地图(site map diagr...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

Excel中的FILTER函数详细介绍及使用示例

在Excel中处理大量数据时,经常需要根据特定条件筛选出符合条件的数据行或列。这正是Excel的FILTER函数发挥作用的地方。FILTER函数是Excel中一个非常强大的工具,它可以基于一个或多个条件动态地过滤数据,使数据分析和报告制作变得更加高效和准确。本文将详细介绍FILTER函数的用法,并提...

Vue从入门到实践 丨Vue-router基本使用

1. 什么是 vue-routervue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。vue-router 的官方文档地址:https://router.vuejs.org/zh/2. vue-router 安装...

微信外H5跳转小程序——组件(vue项目)

场景有个H5(vue项目),需要实现点击商品item跳转到小程序,微信内和微信外都要支持,这里我们只介绍一下H5在微信外的跳转。如图所示,红框内是一个商品,就是点击这里,要跳转小程序:配置微信小程序云开发(云函数)1、开通云开发然后选择免费额度2、云开发权限设置找到权限设置,把这里的「未登录用户访问...

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码

项目介绍本系统功能包括: 前台展示+后台管理+SAAS管理端,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,收货地址,后台商品管 理,订单管理,用户管理等等功能,小伙伴一起来看看吧。三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城...