Rumah  >  Artikel  >  hujung hadapan web  >  Cara Menukar Halaman PDF kepada Imej dalam Node.js

Cara Menukar Halaman PDF kepada Imej dalam Node.js

DDD
DDDasal
2024-09-18 19:47:36502semak imbas

How to Convert PDF Pages to Images in Node.js

Dalam artikel ini, kami akan membincangkan cara menukar halaman PDF kepada imej menggunakan Node.js. Ini boleh berguna untuk menjana lakaran kecil atau mengekstrak kandungan visual daripada fail PDF. Kami akan menggunakan perpustakaan pdfjs-dist untuk memuatkan dan memaparkan halaman PDF dan kanvas untuk membuat penimbal imej.

Prasyarat
Sebelum bermula, anda perlu memasang pakej yang diperlukan:

npm pasang pdfjs-dist canvas

Kod untuk Menukar Halaman PDF kepada Imej dan Menyimpan Setempat:

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

Penjelasan Kod

  1. Muat PDF: Kami menggunakan pdfjs-dist untuk memuatkan fail PDF daripada penimbal.
const loadingTask = pdfjs.getDocument({ data: pdfBuffer });
const pdfDocument = await loadingTask.promise;
  1. Render Setiap Halaman: Untuk setiap halaman dalam PDF, kami memaparkannya ke kanvas menggunakan kaedah getPage dan render daripada pdfjs-dist.
const page = await pdfDocument.getPage(pageNumber);
const renderContext = {
  canvasContext: context,
  viewport: viewport,
};
await page.render(renderContext).promise;
  1. Simpan Imej Setempat: Setelah halaman dipaparkan ke kanvas, kami menyimpan penimbal imej dalam format JPEG menggunakan modul fs Node.js.
fs.writeFileSync(imagePath, imageBuffer);

Kesimpulan:
Pendekatan ini berfungsi dengan cekap untuk menukar PDF kepada imej, membolehkan anda memproses atau menggambarkan kandungan PDF. Untuk imej berkualiti tinggi, kami menskalakan kanvas kepada 2x. Ini boleh dilaraskan dengan mudah berdasarkan keperluan anda.

Saya harap ini membantu! Jangan ragu untuk menyesuaikan kod mengikut keperluan anda.

Atas ialah kandungan terperinci Cara Menukar Halaman PDF kepada Imej dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn