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')}`;