美好的一天。 有没有办法使用 jspdf 库或其他 npm 库从 pdf 文件中提取图像。 也许有一些反应解决方案?
我将不胜感激。
我使用“pdf-lib”和“stream-mime-type”库从pdf文件中获取了所有图像。 这是函数本身,希望对您有用。
const {PDFDocument} = require('pdf-lib');
const fs = require('fs')
const {getMimeType} = require('stream-mime-type')
const createJpgFile = require('./utils/createJpgFile.js')
const path = require("path");
async function getImageFromPdf() {
const existingPdfBytes = await new Promise((resolve, reject) => {
fs.readFile(path.join(rootPath, 'test.pdf'), (err, result) => {
if (err) {
reject(err)
}
if (!err) {
resolve(result)
}
})
})
const pdfDoc = await PDFDocument.load(existingPdfBytes)
const pages = pdfDoc.getPages()
const result = []
pages[0].doc.context.indirectObjects.forEach(el => {
if (el.hasOwnProperty('contents')) result.push(el.contents)
})
const mime = await Promise.all(result.map(async (el) => {
return new Promise(async (resolve) => {
const res = await getMimeType(el)
if (res) {
resolve(res)
}
})
}));
await Promise.all(mime.map(async (el, i) => {
if (el.mime === 'image/jpeg') {
return new Promise(async (resolve) => {
const res = await writeJpgFile(result[i], `image-${i}`,
'jpg')
resolve(res)
})
}
})
)
}
添加: 我还编写了一个函数,可以在不使用第三方库的情况下从 pdf 文件中解析 jpg 图像。该函数通过签名查找 jpg 图像的开头。对于其他格式,您需要使用其他签名。
const parserJpegFromPdf = async () => {
const existingPdfBytes = await getArrayBufferFromPdf()
const convertedBuffer = new Uint8Array(existingPdfBytes)
const firstBeginSignatureSymbol = parseInt('ff', 16)
const secondBeginSignatureSymbol = parseInt('d8', 16)
const indexesStartSignatureImage = []
convertedBuffer.forEach((el, i) => {
if (el === firstBeginSignatureSymbol &&
convertedBuffer[i + 1] === secondBeginSignatureSymbol &&
convertedBuffer[i + 2] === firstBeginSignatureSymbol &&
(convertedBuffer[i + 3] === parseInt('e0', 16) ||
convertedBuffer[i + 3] === parseInt('e1', 16) ||
convertedBuffer[i + 3] === parseInt('e2', 16) ||
convertedBuffer[i + 3] === parseInt('e3', 16) ||
convertedBuffer[i + 3] === parseInt('e8', 16))) {
indexesStartSignatureImage.push(i)
}
})
const resultSlicedCodeImage = indexesStartSignatureImage.reduce((arr,
el) => {
arr.push(convertedBuffer.slice(el));
return arr
}, [])
await Promise.all(resultSlicedCodeImage.map(async (el, i) => {
await createFile(el, `test_image_${i}`, 'jpeg')
}))
}
扫描文档(或任何整页图像)的解决方案:
万一其他人偶然发现了这一点,并且不想自己实现各种转换情况(灰度、带/不带 alpha 等),我终于找到了一个可以为我做所有事情的库 - pdf-img-转换。它在底层使用 pdf.js。
npm install pdf-img-convert
并像这样使用:
import { convert } from "pdf-img-convert";
const outputImages = await convert("/path/to/pdf.pdf");
const imagePaths = outputImages.map((image, i) => {
const path = "output" + i + ".png";
writeFileSync(path, image);
return path;
});