JSPM

  • Created
  • Published
  • Downloads 5544885
  • Score
    100M100P100Q199485F
  • License Apache-2.0

A pure TypeScript/JavaScript, cross-platform module for extracting text, images, and tabular data from PDF files.

Package Exports

  • pdf-parse

Readme

pdf-parse

A pure TypeScript/JavaScript, cross-platform module for extracting text, images, and tabular data from PDF files.

npm downloads npm version node version tests biome vitest codecov socket badge test & coverage reports


Contributing Note: When opening an issue, please attach the relevant PDF file if possible. Providing the file will help us reproduce and resolve your issue more efficiently. For detailed guidelines on how to contribute, report bugs, or submit pull requests, see: contributing to pdf-parse

Features

  • Supports Node.js and browsers
  • CommonJS and ESM support
  • Vulnerability and security info : security policy
  • Extract document info : getInfo
  • Extract page text : getText
  • Render pages as PNG : getScreenshot
  • Extract embedded images : getImage
  • Detect and extract tabular data : getTable
  • For additional usage examples, check the test folder and live demo
  • Live demo source: gh-pages branch

Similar Packages

Benchmark Note: The benchmark currently runs only against pdf2json. I don't know the current state of pdf2json — the original reason for creating pdf-parse was to work around stability issues with pdf2json. I deliberately did not include pdf-parse or other pdf.js-based packages in the benchmark because dependencies conflict. If you have recommendations for additional packages to include, please open an issue.benchmark results

Installation

npm install pdf-parse
# or
pnpm add pdf-parse
# or
yarn add pdf-parse
# or
bun add pdf-parse

Usage

Migration From v1 to v2

// v1
const pdf = require('pdf-parse');
pdf(buffer).then(result => console.log(result.text));

// v2
const { PDFParse } = require('pdf-parse');
const parser = new PDFParse({ data: buffer });

parser.getText().then((result)=>{
    console.log(result.text)
}).finally(async ()=>{
    await parser.destroy();
});

getInfo — Extract Metadata and Document Information

// Node / ESM
import { PDFParse } from 'pdf-parse';
import { readFile } from 'node:fs/promises';

const buffer = await readFile('test/test-01/test.pdf');

const parser = new PDFParse({ data: buffer });
const info = await parser.getInfo();
await parser.destroy();

console.log(`Total pages: ${info.total}`);
console.log(`Title: ${info.info?.Title}`);
console.log(`Author: ${info.info?.Author}`);
console.log(`Creator: ${info.info?.Creator}`);
console.log(`Producer: ${info.info?.Producer}`);

// Access parsed date information
const dates = info.getDateNode();
console.log(`Creation Date: ${dates.CreationDate}`);
console.log(`Modification Date: ${dates.ModDate}`);

// Links, pageLabel, width, height (when `parseHyperlinks` is enabled)
console.log(`Per-page information: ${info.pages}`);

Usage Examples:

  • Parse hyperlinks from pages: test/test-get-info
  • To extract hyperlinks, pass { parseHyperlinks: true }
  • const info = await parser.getInfo({ parseHyperlinks: true })

getText — Extract Text

// Node / ESM
import { PDFParse } from 'pdf-parse';
import { readFile } from 'node:fs/promises';

const buffer = await readFile('test/test-01/test.pdf');

const parser = new PDFParse({ data: buffer });
const textResult = await parser.getText();
await parser.destroy();
console.log(textResult.text);

For a complete list of configuration options, see:

Usage Examples:

getScreenshot — Render Pages as PNG

// Node / ESM
import { PDFParse } from 'pdf-parse';
import { readFile, writeFile } from 'node:fs/promises';

const buffer = await readFile('test/test-01/test.pdf');

const parser = new PDFParse({ data: buffer });
const result = await parser.getScreenshot();
await parser.destroy();

for (const pageData of result.pages) {
    const imgFileName = `page_${pageData.pageNumber}.png`;
    await writeFile(imgFileName, pageData.data, { flag: 'w' });
}

getImage — Extract Embedded Images

// Node / ESM
import { PDFParse } from 'pdf-parse';
import { readFile, writeFile } from 'node:fs/promises';

const buffer = await readFile('test/test-01/test.pdf');

const parser = new PDFParse({ data: buffer });
const result = await parser.getImage();
await parser.destroy();

for (const pageData of result.pages) {
    for (const pageImage of pageData.images) {
        const imgFileName = `page_${pageData.pageNumber}-${pageImage.fileName}.png`;
        await writeFile(imgFileName, pageImage.data, { flag: 'w' });
    }
}

getTable — Extract Tabular Data

// Node / ESM
import { PDFParse } from 'pdf-parse';
import { readFile } from 'node:fs/promises';

const buffer = await readFile('test/test-01/test.pdf');

const parser = new PDFParse({ data: buffer });
const result = await parser.getTable();
await parser.destroy();

for (const pageData of result.pages) {
    for (const table of pageData.tables) {
        console.log(table);
    }
}

Error Handling

const parser = new PDFParse({ data: buffer });
try {
    const result = await parser.getText();
} catch (error) {
    console.error('PDF parsing failed:', error);
} finally {
    // Always call destroy() to free memory
    await parser.destroy();
}

Web / Browser

Use the minified versions (.min.js) for production to reduce file size, or the regular versions for development and debugging.

You can use any of the following browser bundles depending on your module system and requirements:

  • pdf-parse.es.js or pdf-parse.es.min.js for ES modules
  • pdf-parse.umd.js or pdf-parse.umd.min.js for UMD/global usage

You can include the browser bundle directly from a CDN. Use the latest version:

Or specify a particular version:

Worker Note: In browser environments, the package sets pdfjs.GlobalWorkerOptions.workerSrc automatically when imported from the built browser bundle. If you use a custom build or host pdf.worker yourself, configure worker accordingly.