Extraer texto seleccionable de un PDF
Devuelve el texto por página y unido. Orientado a Vite + navegador moderno.
typescript
import * as pdfjsLib from "pdfjs-dist";
import workerUrl from "pdfjs-dist/build/pdf.worker.min.mjs?url";
pdfjsLib.GlobalWorkerOptions.workerSrc = workerUrl;
export async function extractPdfText(file: File): Promise<{ pages: string[]; text: string }> {
const data = new Uint8Array(await file.arrayBuffer());
const pdf = await pdfjsLib.getDocument({ data }).promise;
const pages: string[] = [];
for (let n = 1; n <= pdf.numPages; n += 1) {
const page = await pdf.getPage(n);
const content = await page.getTextContent();
const pageText = content.items
.map((item) => ("str" in item ? item.str : ""))
.join(" ")
.replace(/\s+/g, " ")
.trim();
pages.push(pageText);
}
await pdf.destroy();
return { pages, text: pages.join("\n\n") };
}Dependencias
pdfjs-distNotas de uso
- La config de worker de arriba es para Vite (import con ?url).
- Alternativa con bundler genérico (sin Vite): GlobalWorkerOptions.workerPort = new Worker(new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url), { type: 'module' }).
- Alternativa CDN: GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/<VERSION>/pdf.worker.min.mjs'.
- Usá result.pages para el texto por página o result.text para el texto unido.
Limitaciones
- No hace OCR: solo extrae texto ya seleccionable. Un PDF escaneado (imágenes) puede devolver vacío.
- El orden y el espaciado son aproximados (sin reconstrucción de columnas ni saltos de línea de layout).
- La versión del worker debe coincidir con la versión de pdfjs-dist instalada.