gotenberg+ chromiumly + pdf.js 进行office 文档转换以及预览处理

发布时间 2023-04-12 20:27:19作者: 荣锋亮

日常中office 预览是一个比较常见的问题,基于微软的office online 是一个选择,但是移动端效果不是很好
就有pdf 以及一些基于生成图片的方案也是不错的,以下是基于gotenberg+ chromiumly 的一个尝试

简单说明

gotenberg 是基于golang 开发的包装了Chromium 以及 LibreOffice 的基于api 的无状态pdf 转换服务,可以支持多种格式文件的
pdf 转换生成,比较灵活而且比较强大,包装下可以实现一个基本符合大部分场景的office 预览服务

环境准备

  • docker-compose 文件
 
version: "3"
services:
   convert:
      image: gotenberg/gotenberg:7
      ports:
        - "3000:3000"

代码集成使用

基于了chromiumly 包装的服务

  • demo.js
const { PDFEngine } = require("chromiumly");
const fs = require("fs");
const pdf = require('pdf-parse');
(async function () {
    const buffer = await PDFEngine.convert({
        files: ["app.docx"],
    });
    fs.writeFile("mydemo.pdf", buffer, "binary", function (err) {
        if (err) {
            console.log(err);
        } else {
            let dataBuffer = fs.readFileSync('mydemo.pdf');
            pdf(dataBuffer).then(function (data) {
                // number of pages
                console.log(data.numpages);
                // number of rendered pages
                console.log(data.numrender);
                // PDF info
                console.log(data.info);
                // PDF.js version
                // check https://mozilla.github.io/pdf.js/getting_started/
                console.log(data.version);
            })
        }
    });
})()

备注: 以上只是简单的pdf 生成以及pdf 解析,对于实际预览没有直接包含,但是我们可以基于openresty proxy + pdf.js 提供的预览可以方便的处理pdf预览
具体可以参考我以前写的文章

说明

gotenberg 同时支持基于webhook的异步处理也比较强大,比较适合较大文件,而且需要消息通知的,以上只是一个简单的集成说明,实际上对于转换的文件
我们可以直接存放到minio 中,基于s3 实现预览的权限了控制,同时chromiumly client 有点不好的是目前只支持文件,因为包装了文件流,不是很方便,可以
自己开发一个rest api 基于form-data 进行处理,完整运行demo 参考github

参考资料

https://www.cnblogs.com/rongfengliang/p/13693067.html
https://www.cnblogs.com/rongfengliang/p/13913100.html
https://gotenberg.dev/
https://github.com/gotenberg/gotenberg
https://www.npmjs.com/package/chromiumly
https://github.com/rongfengliang/gotenberg_chromiumly_learning