Nodejs实现PDF转图片

nodejs 将PDF转为图片的过程中主要依赖 fs(读取文件)、pdfjs-dist(解析PDF)、@napi-rs/canvas(PDF内容渲染到画布)、jimp(将画布内容转为图片). 由于canvas module需要依赖系统,所以为了不依赖系统使用@napi-rs/canvas

1. 读取PDF

nodejs解析PDF需要依赖pdfjs-dist@^3.10.111,需要注意pdfjs-dist的版本,3.X版本和4.X版本用法不同

const pdfjs = require('pdfjs-dist/legacy/build/pdf');
// 配置 PDF.js Worker
pdfjs.GlobalWorkerOptions.workerSrc = require.resolve('pdfjs-dist/legacy/build/pdf.worker.min.js');
// 1. 读取PDF文件
const pdfBuffer = await fs.readFile(filePath);
const pdfBytes = new Uint8Array(pdfBuffer);
// 2. 加载PDF文档
const pdfDoc = await pdfjs.getDocument({ data: pdfBytes }).promise;
const page = await pdfDoc.getPage(1); // 获取PDF第1页内容
await page.getOperatorList({
    intent: 'display', // 确保使用 RGB 渲染
});
// 获取viewport , scale: 缩小或放大倍率,数字越大,越清晰,对应的图片也会越清晰,同时照片占用的空间也越大
const viewport = page.getViewport({ scale: 1.0 }); 

2. 渲染PDF到画布(canvas)

创建画布,并将获取的pdf内容渲染到画布上。为了不依赖系统所以需要使用的是"@napi-rs/canvas": “^0.1.67”,
package.json中引入这个依赖时需要注意,由于pdfjs-dist会引用canvas module,所以在引用时需要给@napi-rs/canvas起一个别名,否则pdfjs-dist在渲染PDF内容到canvas时会报错,找不到canvas module。所以package.json中可以这样引用"canvas": “npm:@napi-rs/canvas@^0.1.67”,

const canvas = createCanvas(viewport.width, viewport.height);
const ctx = canvas.getContext('2d');
 await page.render({
     canvasContext: ctx,
     viewport: viewport
 }).promise;

3. 转为图片

从画布上获取图片数据,并将其转为PNG或bmp图片。使用"jimp": “^0.22.10”,
Jimp支持的图片格式:在这里插入图片描述

const image = await Jimp.create(viewport.width, viewport.height);
image.bitmap = {
    data: Buffer.from(imageData.data),
    width: imageData.width,
    height: imageData.height,
};
const imageBuffer = image.getBufferAsync(Jimp.MIME_BMP);

4. 保存转换后的图片

//保存到本地
await fs.writeFile('./test.bmp',  imageBuffer);
//转为base64
const base64Img = `data:image/bmp;base64,${imageBuffer.toString('base64')}`;
可以使用`pdfkit`和`canvas`模块来实现图片合成 pdf。 首先需要安装这两个模块: ``` npm install pdfkit canvas ``` 然后编写代码: ```javascript const PDFDocument = require('pdfkit'); const { createCanvas, loadImage } = require('canvas'); const fs = require('fs'); // 创建一个 PDF 文档 const doc = new PDFDocument(); // 定义图片的宽度和高度 const width = 300; const height = 200; // 加载图片 loadImage('image1.jpg').then(image1 => { loadImage('image2.jpg').then(image2 => { // 获取图片数量 const imageCount = 2; // 设置文档页面数量 doc.info['Title'] = 'My Document'; doc.info['Author'] = 'John Doe'; doc.info['Subject'] = 'Testing PDF Kit'; doc.info['Keywords'] = 'PDFKit, JavaScript, PDF, generator'; doc.info['Producer'] = 'PDFKit'; doc.info['Creator'] = 'John Doe'; doc.registerFont('NotoSans', 'fonts/NotoSansCJKsc-Regular.otf'); doc.info['Title'] = 'My Document'; doc.pipe(fs.createWriteStream('output.pdf')); // 循环添加每张图片到文档中 for (let i = 0; i < imageCount; i++) { const canvas = createCanvas(width, height); const ctx = canvas.getContext('2d'); ctx.drawImage(i === 0 ? image1 : image2, 0, 0, width, height); // 将 canvas 添加到 PDF 文档中 doc.image(canvas.toBuffer(), 50, 50, { width: width, height: height }); doc.addPage(); } // 结束文档 doc.end(); }); }); ``` 在以上代码中,我们使用`loadImage`方法从文件中加载图片,并将它们添加到 PDF 文档中。我们还需要使用`createCanvas`方法创建一个新的画布,并在画布上绘制图片。最后,我们使用`doc.image`方法将画布添加到 PDF 文档中。 运行代码后,会在当前目录下生成一个名为`output.pdf`的 PDF 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值