Use pdf-lib para procesar PDF en Node.js

El módulo pdf-lib npm es una buena herramienta para crear y editar archivos PDF usando Node.js. Puppeteer es una excelente herramienta que puede generar PDF a partir de HTML , pero desafortunadamente, en mi experiencia, el soporte del navegador para el diseño de impresión en CSS no es muy bueno. El módulo pdf-lib le brinda un control muy fino sobre el PDF. Se puede usar para combinar archivos PDF, agregar números de página, marcas de agua, dividir archivos PDF y cualquier otra función que pueda usar para procesar archivos PDF usando la API ILovePDF .

Empezando

Usemos pdf-lib para crear un documento PDF simple. Este documento PDF tiene solo una página, y el icono de Mastering JS se mostrará en el medio de la página.

const { PDFDocument } = require('pdf-lib');
const fs = require('fs');

run().catch(err => console.log(err));

async function run() {
  // Create a new document and add a new page
  const doc = await PDFDocument.create();
  const page = doc.addPage();

  // Load the image and store it as a Node.js buffer in memory
  let img = fs.readFileSync('./logo.png');
  img = await doc.embedPng(img);

  // Draw the image on the center of the page
  const { width, height } = img.scale(1);
  page.drawImage(img, {
    x: page.getWidth() / 2 - width / 2,
    y: page.getHeight() / 2 - height / 2
  });

  // Write the PDF to a file
  fs.writeFileSync('./test.pdf', await doc.save());
}

La ejecución del script anterior generará el siguiente PDF. Usar pdf-lib es muy simple, con solo algunas trampas: nota PDFDocument#embedPng()y PDFDocument#save()devolución Promise, por lo que debe usarlo await.

Un simple PDF

Fusionar PDF

La característica principal de pdf-lib es que puede modificar archivos PDF existentes, no solo crear nuevos. Por ejemplo, suponga que tiene dos archivos PDF: uno contiene la portada de un libro electrónico y el otro contiene el contenido del libro electrónico. ¿Cómo fusionar dos archivos PDF? Utilicé la API ILovePDF en el último libro electrónico ( Mastering Async / Await ), pero pdf-lib facilita esta tarea en Node.js.

Hay dos archivos PDF: cover.pdfy page-30-31.pdf. La siguiente secuencia de comandos, utilizando pdf-lib PDF de combinación de los dos para un test.pdfarchivo.

const { PDFDocument } = require('pdf-lib');
const fs = require('fs');

run().catch(err => console.log(err));

async function run() {
  // Load cover and content pdfs
  const cover = await PDFDocument.load(fs.readFileSync('./cover.pdf'));
  const content = await PDFDocument.load(fs.readFileSync('./page-30-31.pdf'));

  // Create a new document
  const doc = await PDFDocument.create();

  // Add the cover to the new doc
  const [coverPage] = await doc.copyPages(cover, [0]);
  doc.addPage(coverPage);

  // Add individual content pages
  const contentPages = await doc.copyPages(content, content.getPageIndices());
  for (const page of contentPages) {
    doc.addPage(page);
  }

  // Write the PDF to a file
  fs.writeFileSync('./test.pdf', await doc.save());
}

El efecto después de la fusión se puede ver en la figura a continuación.

Fusionar PDF

Agregar número de página

Una de las mayores dificultades para usar Puppeteer para generar archivos PDF a partir de HTML es la molestia de agregar números de página . Aunque agregar números de página parece simple, el diseño de impresión CSS no puede implementar esta función correctamente. Puede echar un vistazo al bucle for que escribí que usa un desplazamiento de píxeles de código rígido para que el número de página se muestre correctamente.

Por ejemplo, Mastering asíncrono / aguardan el PDF de la parte delantera de cuatro no lo hicieron Página: ./content.pdf. El siguiente script agregará páginas a cada página en el PDF.

const { PDFDocument, StandardFonts, rgb } = require('pdf-lib');
const fs = require('fs');

run().catch(err => console.log(err));

async function run() {
  const content = await PDFDocument.load(fs.readFileSync('./content.pdf'));

  // Add a font to the doc
  const helveticaFont = await content.embedFont(StandardFonts.Helvetica);

  // Draw a number at the bottom of each page.
  // Note that the bottom of the page is `y = 0`, not the top
  const pages = await content.getPages();
  for (const [i, page] of Object.entries(pages)) {
    page.drawText(`${+i + 1}`, {
      x: page.getWidth() / 2,
      y: 10,
      size: 15,
      font: helveticaFont,
      color: rgb(0, 0, 0)
    });
  }

  // Write the PDF to a file
  fs.writeFileSync('./test.pdf', await content.save());
}

El efecto después de agregar el número de página se puede ver en la figura a continuación
Agregar número de página

Para continuar

Hay muchas bibliotecas excelentes en el ecosistema Node.js que pueden resolver casi cualquier problema que se te ocurra. Módulo pdf-lib le permite manejar PDF, de Sharp le permite manejar casi todo con imágenes, PKG proyecto conjunto de nodos en un archivo ejecutable independiente, y así sucesivamente. Antes de comenzar a buscar API en línea para resolver sus problemas, si intenta buscar npm primero, puede encontrar una mejor solución.

原文 :Trabajando con archivos PDF en Node.js Usando pdf-lib

Supongo que te gusta

Origin www.cnblogs.com/tianliupingzong/p/12703007.html
Recomendado
Clasificación