记录如何在node中将PDF每页转换为图片格式
先介绍几个库
- 1、pdf-lid: 这个库是基于pdf.js和pdfkit的、文档健全、操作方便、Api调用简介。可以对PDF进行提取、编辑、增删改查。
- 2、pdf2pic: 这个库用于将PDF每页转为图片但是不能进行PDF的一系列加工但是这并不影响他的强大
- 3、pdf.js: 这个库是一个处理PDF非常强大的库、可以对PDF进行一系列操作、也可用于web端渲染PDF每页。
- 4、pdfmake: 主要生成PDF、可以对生成的内容进行精细化的加工
- 5、pdfkit: 这也是用与生成PDF的一个库、个人觉得生成PDF还是pdfmake方便一点
接下来贴一点代码片段如何在node以及web中将PDF文档逐页转换为图片并获取他们的编码数据
const { fromPath, fromBuffer } = require('pdf2pic')
const { PDFDocument } = require('pdf-lib')
const fs = require('fs')
const fsExtra = require('fs-extra')
const pdfBuffer = fs.readFileSync('hello.pdf')
const pdfToImage = async (pdfBuffer, savePath) => {
try {
if (!fsExtra.pathExistsSync(savePath)) fsExtra.ensureDirSync(savePath)
const baseOptions = {
density: 330,
saveFilename: 'untitled',
format: 'png',
savePath,
}
let imgBufferList = [], imgBase64List = []
const pdfDoc = await PDFDocument.load(pdfBuffer, { ignoreEncryption: true })
const pages = await pdfDoc.getPages()
for (let [pageIndex, page] of pages.entries()) {
const { width, height } = await page.getSize()
const toImageOptions = { ...baseOptions, width, height }
const storeAsImage = fromBuffer(pdfBuffer, toImageOptions);
storeAsImage(pageIndex + 1).then(({ path }) => {
const data = fs.readFileSync(path)
imgBufferList.push({ page: pageIndex + 1, data })
if (pageIndex + 1 === pages.length) {
console.log(imgBufferList)
}
}).catch(err => {
console.log(`第${pageIndex + 1}页转换失败`);
console.log(err)
})
new Promise(async (resolve, reject) => {
const [{ base64: data }] = await fromBuffer(pdfBuffer, toImageOptions).bulk(pageIndex + 1, true)
if (data) resolve({ pageIndex, data })
else reject()
}).then(({ data }) => {
imgBase64List.push({ page: pageIndex + 1, data })
if (pageIndex + 1 === pages.length) {
console.log(imgBase64List);
}
}).catch(err => {
console.log(`第${pageIndex + 1}页转换失败`);
console.log(err)
})
}
} catch (err) {
console.log(err);
}
}
pdfToImage(pdfBuffer, './images')