使用jspdf或其他npm包从PDF文件中提取图像

问题描述 投票:0回答:2

美好的一天。 有没有办法使用 jspdf 库或其他 npm 库从 pdf 文件中提取图像。 也许有一些反应解决方案?

我将不胜感激。

javascript reactjs jspdf
2个回答
4
投票

我使用“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')
  }))
}

2
投票

扫描文档(或任何整页图像)的解决方案:

万一其他人偶然发现了这一点,并且不想自己实现各种转换情况(灰度、带/不带 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;
});
© www.soinside.com 2019 - 2024. All rights reserved.