nestjs 结合LibreOffice 实现word转pdf在线预览

6 篇文章 0 订阅
1 篇文章 0 订阅

一、下载-并安装LibreOffice

在这里插入图片描述

下载地址:https://zh-cn.libreoffice.org/download/libreoffice/

  1. 下载后安装并配置环境变量
  2. 打开新的cmd窗口,输入soffice,如果此时会自动打开LibreOffice 即可继续往下进行

二、nestjs配置并安装依赖

1. 开启nestjs项目静态资源

编辑于 main.ts

// 配置 public 文件夹为静态目录,以达到可直接访问下面文件的目的
const rootDir = join(__dirname, '..');
app.use('/public', express.static(join(rootDir, 'public')));

2. 开发上传模块

1. 下载相关依赖 office-to-pdf
npm install office-to-pdf -S
2. 开启文件上传功能
编辑于 file_manage.module.ts

import { Module } from '@nestjs/common';
import { FileManageService } from './file_manage.service';
import { FileManageController } from './file_manage.controller';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { checkDirAndCreate } from '../common/utils/checkDirAndCreate';
import { image, video, audio } from '../common/config/file.config';
import * as nuid from 'nuid';
import dayjs = require('dayjs');
@Module({
  imports: [
    MulterModule.register({
      storage: diskStorage({
        // 配置文件上传后的文件夹路径
        destination: (req, file, cb) => {
          // 根据上传的文件类型将图片视频音频和其他类型文件分别存到对应英文文件夹
          const mimeType = file.mimetype.split('/')[1];
          let temp = 'other';
          image.filter((item) => item === mimeType).length > 0
            ? (temp = 'image')
            : '';
          video.filter((item) => item === mimeType).length > 0
            ? (temp = 'video')
            : '';
          audio.filter((item) => item === mimeType).length > 0
            ? (temp = 'audio')
            : '';
          const filePath = `public/${temp}/${dayjs().format('YYYY-MM-DD')}`;
          checkDirAndCreate(filePath); // 判断文件夹是否存在,不存在则自动生成
          return cb(null, `./${filePath}`);
        },
        filename: (req, file, cb) => {
          // 在此处自定义保存后的文件名称
          // const mimeType = file.mimetype.split('/')[1];
          const mimeType = file.originalname.split('.')[1];
          const filename = `${nuid.next()}.${mimeType}`;
          return cb(null, filename);
        },
      }),
    }),
  ],
  controllers: [FileManageController],
  providers: [FileManageService],
})
export class FileManageModule {}

3. 开启upload端口监听
编辑与file_manage.controller.ts

// 监听
import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { FileManageService } from './file_manage.service';
import { UpdateFileManageDto } from './dto/update-file_manage.dto';

// 上传文件模块
@Controller('file-manage')
export class FileManageController {
  constructor(private readonly fileManageService: FileManageService) {}
  // 监听Post模式下的file-manage/upload端口
  @Post('upload')
  @UseInterceptors(FileInterceptor('file'))
  upload(
    // @Body() createFileManageDto: CreateFileManageDto,
    @UploadedFile() file,
  ) {
    const type = [
      'application/msword',
      'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    ];
    for (let k = 0; k < type.length; k++) {
      if (type[k] == file.mimetype) {
        return this.fileManageService.upload(file);
      }
    }
  }
}

4. 编写转格式代码
编辑与 file_manage.service.ts

// 引入依赖
import * as fs from 'fs';
const toPdf = require('office-to-pdf');
// 新建upload方法 内容如下
async upload(file) {
   	// 定义基础地址
    const pdfPath = 'http://127.0.0.1:3001/';

    function toPdfFUN() {
      return new Promise((resolve, reject) => {
        fs.readFile(file.path, async (err, res) => {
					// 若读取文件报错,则返回报错信息
          if (err) {
            console.log(err);
            reject(err);
            return err;
          } else {
						// 等下要返回的基础数据
            const sendData: any = {};
            // 开启word转pdf
            const pdfBuffer = await toPdf(res);
            let path: any = file.path.split('.');
            path[path.length - 1] = 'pdf';
            path = path.join('.');
            // 通过fs写入转换后的文件
            await fs.writeFileSync(path, pdfBuffer);
            // 转换后的地址
            sendData.pdfPath = pdfPath + path.replace(/\\/g, '/');
            sendData.wordPath = pdfPath + file.path.replace(/\\/g, '/');
            sendData.name = file.filename;
            resolve(sendData);
          }
        });
      });
    }
    return await toPdfFUN();

三、使用postman调试

在这里插入图片描述
在这里插入图片描述

Node.js 是一种在服务器端运行的 JavaScript 运行环境,可以用于实现各种各样的应用程序。而 LibreOffice 是一款免费、开源的办公软件套件,其中包括了 Writer、Calc、Impress 等应用程序,支持多种文档格式。下面是一个基于 Node.js 和 LibreOffice实现 Word PDF 的简单方法: 1.安装 LibreOffice:首先需要在服务器上安装 LibreOffice,可以通过命令行或者图形界面进行安装。 2.使用 Node.js 的 child_process 模块:在 Node.js 中可以通过 child_process 模块来执行系统命令,在本例中可以使用该模块执行 LibreOffice 的命令行工具来进行 Word PDF 的操作。 3.编写 Node.js 代码:可以通过 Node.js 编写一个简单的脚本来实现 Word PDF。以下是一个简单的示例代码: ```javascript const { spawn } = require('child_process'); const inputFilePath = '/path/to/input.docx'; const outputFilePath = '/path/to/output.pdf'; const libreoffice = spawn('libreoffice', [ '--headless', '--convert-to', 'pdf', inputFilePath, '--outdir', outputFilePath, ]); libreoffice.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); libreoffice.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); libreoffice.on('close', (code) => { console.log(`child process exited with code ${code}`); }); ``` 以上代码中,spawn 方法会启动一个新的进程来执行 LibreOffice 命令行工具。'--headless' 参数表示以无头模式运行,'--convert-to pdf' 参数表示换成 PDF 格式,inputFilePath 参数表示输入文件的路径,'--outdir' 参数表示输出文件的路径。 4.运行 Node.js 代码:在终端中运行 Node.js 脚本即可进行 Word PDF 的操作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值