Maison > interface Web > js tutoriel > Comment convertir des pages PDF en images dans Node.js

Comment convertir des pages PDF en images dans Node.js

DDD
Libérer: 2024-09-18 19:47:36
original
647 Les gens l'ont consulté

How to Convert PDF Pages to Images in Node.js

Dans cet article, nous expliquerons comment convertir des pages PDF en images à l'aide de Node.js. Cela peut être utile pour générer des vignettes ou extraire du contenu visuel à partir de fichiers PDF. Nous utiliserons la bibliothèque pdfjs-dist pour charger et restituer les pages PDF, et le canevas pour créer des tampons d'image.

Prérequis
Avant de commencer, vous devez installer les packages requis :

npm install pdfjs-dist canevas

Code pour convertir des pages PDF en images et enregistrer localement :

const fs = require('fs');
const path = require('path');
const pdfjs = require('pdfjs-dist/legacy/build/pdf.js');
const Canvas = require('canvas');

/**
 * Converts a PDF to images by rendering each page and saving them to a local directory.
 * 
 * @param {Buffer} pdfBuffer - The PDF file as a buffer.
 * @param {string} outputDir - The directory where images will be saved.
 * @returns {Promise<void>} Resolves when all images are saved.
 */
async function convertPdfToImages(pdfBuffer, outputDir) {
  try {
    // Ensure the output directory exists
    if (!fs.existsSync(outputDir)) {
      fs.mkdirSync(outputDir, { recursive: true });
    }

    // Load the original PDF using pdf.js
    const loadingTask = pdfjs.getDocument({ data: pdfBuffer });
    const pdfDocument = await loadingTask.promise;

    // Loop through each page of the PDF
    for (let i = 1; i <= pdfDocument.numPages; i++) {
      const page = await pdfDocument.getPage(i);

      // Render the page as an image and save it
      const imageBuffer = await renderPageToImage(page);

      // Save the image to the output directory
      const imagePath = path.join(outputDir, `page_${i}.jpg`);
      fs.writeFileSync(imagePath, imageBuffer);
      console.log(`Saved: ${imagePath}`);
    }
  } catch (error) {
    console.error('Error converting PDF to images:', error);
  }
}

/**
 * Renders a single PDF page to an image buffer.
 * 
 * @param {PDFPageProxy} page - The PDF.js page object.
 * @returns {Promise<Buffer>} The image as a buffer (JPEG format).
 */
async function renderPageToImage(page) {
  // Scale the page to 2x for a higher quality image output
  const viewport = page.getViewport({ scale: 2.0 });
  const canvas = Canvas.createCanvas(viewport.width, viewport.height);
  const context = canvas.getContext('2d');

  const renderContext = {
    canvasContext: context,
    viewport: viewport,
  };

  // Render the PDF page to the canvas
  await page.render(renderContext).promise;

  // Convert the canvas content to a JPEG image buffer and return it
  return canvas.toBuffer('image/jpeg');
}

// Example usage:
// const pdfBuffer = fs.readFileSync('sample.pdf');
// convertPdfToImages(pdfBuffer, './output_images');
Copier après la connexion

Explication du code

  1. Charger le PDF : nous utilisons pdfjs-dist pour charger un fichier PDF à partir d'un tampon.
const loadingTask = pdfjs.getDocument({ data: pdfBuffer });
const pdfDocument = await loadingTask.promise;
Copier après la connexion
  1. Rendu chaque page : pour chaque page du PDF, nous la rendons sur un canevas à l'aide des méthodes getPage et render de pdfjs-dist.
const page = await pdfDocument.getPage(pageNumber);
const renderContext = {
  canvasContext: context,
  viewport: viewport,
};
await page.render(renderContext).promise;
Copier après la connexion
  1. Enregistrer l'image localement : une fois la page rendue sur le canevas, nous enregistrons le tampon d'image au format JPEG à l'aide du module fs de Node.js.
fs.writeFileSync(imagePath, imageBuffer);
Copier après la connexion

Conclusion :
Cette approche fonctionne efficacement pour convertir des PDF en images, vous permettant de traiter ou de visualiser le contenu PDF. Pour des images de haute qualité, nous redimensionnons la toile à 2x. Cela peut être facilement ajusté en fonction de vos besoins.

J'espère que cela vous aidera ! N'hésitez pas à adapter le code selon vos besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal