00

Blog · Automatización · Desarrollo Web · Data · Integración · Optimización

Extraer Datos de PDF en Frontend con TypeScript y PDF.js

2026-07-26 · 5 min de lectura · Juan David Arias Martínez

Descubre cómo procesar y extraer contenido de archivos PDF en el navegador web usando TypeScript y PDF.js con rendimiento optimizado.

Extraer Datos de PDF en Frontend con TypeScript y PDF.js
  • Frontend
  • TypeScript
  • PDF.js
  • Web Development
  • JavaScript PDF
  • Parsing PDF

Puntos Clave / Resumen Ejecutivo:

  • Procesamiento 100% en el navegador sin dependencia de APIs o servidores backend.
  • Integración tipada y segura utilizando TypeScript junto a la librería oficial Mozilla PDF.js.
  • Uso eficiente de Web Workers para mantener el hilo principal fluido y optimizar el rendimiento.

El procesamiento de documentos en el lado del cliente se ha convertido en una arquitectura fundamental para aplicaciones web modernas. Extraer texto e metadatos de archivos PDF directamente en el navegador mejora drásticamente la privacidad del usuario y reduce costes de infraestructura servidor.

En esta guía técnica aprenderás a integrar PDF.js en un entorno con TypeScript, garantizando un código limpio, seguro y orientado a máximo rendimiento.

Arquitectura de PDF.js en el Frontend

PDF.js es una biblioteca mantenida por Mozilla que renderiza y parsea archivos PDF mediante HTML5 y JavaScript. La biblioteca se divide principalmente en dos capas:

  1. Core / Display Layer: Administra la carga del documento y la interacción en la interfaz.
  2. Worker Layer: Realiza el parseado intensivo de la estructura binaria del PDF en un hilo secundario (Web Worker).

Es fundamental configurar correctamente el Web Worker para evitar bloquear la interfaz gráfica (UI) durante el procesado de archivos de gran tamaño.

Configuración del Entorno de Desarrollo

Primero, instala la dependencia oficial pdfjs-dist en tu proyecto mediante npm o yarn:

npm install pdfjs-dist
npm install --save-dev @types/pdfjs-dist

Para que TypeScript gestione correctamente los archivos binarios del worker, debemos asegurar la importación adecuada del paquete en nuestro código base.

Implementación de la Extracción en TypeScript

A continuación, se presenta un módulo de producción preparado para recibir un objeto File o un ArrayBuffer y devolver el texto estructurado por páginas.

Configuración Inicial del Worker

import * as pdfjsLib from 'pdfjs-dist';

// Asignación de la ruta del Web Worker para el motor de PDF.js
pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`;

Función de Extracción Completa de Texto

interface ExtractedPage {
  pageNumber: number;
  text: string;
}

export async function extractTextFromPDF(file: File): Promise<ExtractedPage[]> {
  const arrayBuffer = await file.arrayBuffer();
  const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });
  
  const pdfDocument = await loadingTask.promise;
  const totalPages = pdfDocument.numPages;
  const extractedData: ExtractedPage[] = [];

  for (let pageNum = 1; pageNum <= totalPages; pageNum++) {
    const page = await pdfDocument.getPage(pageNum);
    const textContent = await page.getTextContent();
    
    const pageText = textContent.items
      .map((item: any) => ('str' in item ? item.str : ''))
      .join(' ');

    extractedData.push({
      pageNumber: pageNum,
      text: pageText.trim()
    });
  }

  return extractedData;
}

Optimización de Rendimiento y Gestión de Memoria

El análisis de archivos PDF extensos puede afectar los índices de Core Web Vitals (especialmente INP o Interaction to Next Paint). Aplica estas recomendaciones para mantener el rendimiento al máximo:

  • Liberar Recursos de Memoria: Destruye la instancia del documento invocado mediante pdfDocument.destroy() al finalizar la extracción.
  • Carga Diferida (Lazy Loading): Importa la librería dinámicamente (await import('pdfjs-dist')) solo cuando el usuario adjunte un archivo PDF.
  • Procesamiento Asíncrono por Bloques: En archivos de cientos de páginas, inserta breves pausas con setTimeout o requestIdleCallback entre iteraciones de páginas para permitir que la UI responda eventos del usuario.

Referencias y Documentación

Compartir Artículo

← Blog

© 2026 Juan David Arias. Todos los derechos reservados.

Desarrollado con React, TypeScript, Express y Tailwind CSS.

Privacidad
SYSTEM: ONLINE