PDF to Text in Node.js

Overview

Extract text from PDF documents in server-side Node.js code using the PDFCrowd client. Conversions run on PDFCrowd's servers.

Installation

This guide uses SDK 7 or later, supported on Node.js 18 and later. Install the client with npm, or see other installation options.

npm install pdfcrowd

See upgrading to SDK 7 when updating an existing installation.

Quick Start

You can run the examples below with the displayed API credentials. Update the input URLs and filenames as needed.

Importing the client

Examples use ES modules. For CommonJS, replace the import statements with require() and place awaited operations inside an async function.

CommonJS

const pdfcrowd = require('pdfcrowd');

TypeScript

The package includes TypeScript declarations. TypeScript infers conversion results and callback parameters from the SDK types. Use a namespace import:

import * as pdfcrowd from 'pdfcrowd';

For TypeScript compiled as CommonJS, you can also use:

import pdfcrowd = require('pdfcrowd');

When compiling a default import to CommonJS, enable esModuleInterop.

If your project needs Node.js types, see TypeScript dependency setup.

Convert a PDF URL

Extract text from a PDF URL and save it locally as invoice.txt:

import pdfcrowd from 'pdfcrowd';

try {
    const client = new pdfcrowd.PdfToTextClient("demo", "demo");
    
    const filePath = await client.convertUrlToFile(
        "https://your-server.com/invoice.pdf", "invoice.txt"
    );
    console.log("Saved:", filePath);
} catch (error) {
    // Handle the error in your application.
    console.error(String(error));
}

The URL must return a PDF and be reachable from PDFCrowd's servers. The output file is ready after await completes successfully, or when the file callback runs without an error. Handle failures as shown in Handle Errors.

Convert a PDF File

Extract text from invoice.pdf and save the result locally as invoice.txt:

import pdfcrowd from 'pdfcrowd';

try {
    const client = new pdfcrowd.PdfToTextClient("demo", "demo");
    
    const filePath = await client.convertFileToFile(
        "invoice.pdf", "invoice.txt"
    );
    console.log("Saved:", filePath);
} catch (error) {
    // Handle the error in your application.
    console.error(String(error));
}

Configure a Conversion

Authentication

Pass your PDFCrowd username and API key to PdfToTextClient. Find your credentials on the API Keys page.

Choose an Input

Send a PDF URL, upload a local file, or pass PDF bytes or a readable binary stream.

InputMethod
URLconvertUrlToFile()
Local fileconvertFileToFile()
Bytes in memoryconvertRawDataToFile()
Readable binary streamconvertStreamToFile()

Add Conversion Settings

Set conversion options on the client before calling a conversion method. For example, client.setNoLayout(true); extracts text without preserving the PDF layout.

Common settings are listed below. See the method reference for all available options or browse Node.js examples.

PurposeMethods
Pages to convertsetPrintPageRange()
Password-protected inputsetPdfPassword()
Layout and paragraphssetNoLayout(), setParagraphMode(), setLineSpacingThreshold()
Line endings and page breakssetEol(), setPageBreakMode(), setCustomPageBreak()
Text cleanupsetRemoveHyphenation(), setRemoveEmptyLines()
Extract from a page areasetCropArea()

By default, extraction preserves the PDF's layout with spacing. Enable setNoLayout() to extract text without preserving columns and positioning.

The PDF password unlocks the input document; it is separate from your PDFCrowd API key.

Handle the Result

Choose an Output

The result is UTF-8 plain text. A PDF must contain a text layer for extraction; recognizing text in a scanned document requires a separate OCR step.

The methods below use URL input; local files, bytes, and input streams have corresponding methods.

OutputAsync/awaitCallbacks
Local file convertUrlToFile() convertUrlToFile()
Buffer in memory convertUrl() convertUrl() supplies a stream; collect its chunks into a Buffer.
Readable stream convertUrlToStream() convertUrl() passes the response stream to data(stream).

For large results, file or stream output avoids collecting the entire result in memory. When saving a stream, wait for pipeline to finish and handle any error before using the file. See the stream examples.

For return values and completion rules, see Promise results and Callbacks in the reference.

This example extracts text from a PDF, collects the result in a Buffer, decodes it as UTF-8, and saves it locally as invoice.txt:

import pdfcrowd from 'pdfcrowd';
import fs from 'node:fs';

try {
    const client = new pdfcrowd.PdfToTextClient("demo", "demo");

    function saveResult(result) {
        const text = result.toString('utf8');
        fs.writeFileSync("invoice.txt", text);
    }

    const result = await client.convertUrl("https://your-server.com/invoice.pdf");
    saveResult(result);
} catch (error) {
    // Handle the error in your application.
    console.error(String(error));
}

When serving the result from a web application, use Content-Type: text/plain; charset=utf-8.

Handle Errors

Use try/catch around awaited conversions. In callback mode, handle errors in the callback and catch synchronous validation errors from the initial call. This example extracts text from a PDF, logging the HTTP status and reason code when available:

import pdfcrowd from 'pdfcrowd';

try {
    const client = new pdfcrowd.PdfToTextClient("demo", "demo");

    const filePath = await client.convertUrlToFile(
        "https://your-server.com/invoice.pdf", "invoice.txt"
    );
    console.log("Saved:", filePath);
} catch (error) {
    // Handle the error in your application.
    if (error instanceof pdfcrowd.Pdfcrowd.Error) {
        console.error("PDFCrowd error:", error.getStatusCode(),
            error.getReasonCode(), error.getMessage());
    } else {
        console.error(String(error));
    }
}

For stream output, handle errors both when obtaining the stream and when consuming it. A pipeline reports failures while reading the response or writing the destination.

Conversion errors use pdfcrowd.Pdfcrowd.Error. Local file and stream operations can also produce native errors; check the error type before using SDK-specific methods.

See the error-object reference for status, reason, and message accessors.

The SDK error's toString() includes available status and reason codes. Use String(error) when logging an error of either type.

Common Status Codes

StatusWhat it meansWhat to do
400Invalid input, settings, or conversion failureRead the reason code and correct the input or settings.
401Missing credentials or an inactive licenseCheck your username, API key, and license status.
403Suspended service or no credits remainingCheck your account and available credits.
413Upload exceeds the 300 MB limitReduce the upload size.
429Request rate limit reachedWait and reduce the rate of new requests.
430Concurrent request limit reachedAllow active requests to finish before starting more.
503Temporary network issueCheck your retry policy before submitting another request.

See all status and reason codes for specific explanations and Limits and Retries for retry behavior.

For job IDs, credit usage, and other conversion details, see the reference.

Limits and Retries

Request rate and concurrency limits depend on your license. Control how quickly your application submits conversions and how many it runs at once. A 429 response concerns request rate; a 430 response concerns requests already in progress. The maximum upload size is 300 MB.

The Node.js client automatically retries a request once when it receives HTTP 502 or 503. Use setRetryCount() to change that count, or set it to 0 to disable automatic retries. Account for these retries when adding an application-level retry policy.

Troubleshooting

Inspect a Conversion

This example extracts text from a PDF with debug logging enabled and logs the debug log URL when available. Use the input and settings from the conversion you are investigating.

import pdfcrowd from 'pdfcrowd';

try {
    const client = new pdfcrowd.PdfToTextClient("demo", "demo");

    try {
        client.setDebugLog(true);
        await client.convertUrlToFile("https://your-server.com/invoice.pdf", "invoice.txt");
    } finally {
        const debugLogUrl = client.getDebugLogUrl();
        if (debugLogUrl) console.info("Debug log:", debugLogUrl);
    }
} catch (error) {
    // Handle the error in your application.
    console.error(String(error));
}

The debug log contains conversion settings and processing details. You can also find logs in your conversion history. A local or connection failure may occur before a conversion log is available.

Common Problems

ProblemCheck
The PDF cannot be loadedCheck that the URL returns a PDF, rather than HTML or a login page, and is reachable from PDFCrowd's servers. For local files, check the path and read permissions.
The PDF requires a passwordSet the input document's password with setPdfPassword().
Text is missingA scanned PDF may contain images without a text layer. Extracting text from scans requires a separate OCR step.
Spacing or reading order is unexpectedTry setNoLayout() and the paragraph settings. PDF text placement does not always encode a natural reading order.

For help, contact support and include any available diagnostics, the client version, and enough detail to reproduce the problem.

Upgrading to SDK 7

The methods below were removed in SDK 7. For changes to Promise and callback usage, see the general upgrade notes.

Removed methodReplacement
setUserAgent() setClientUserAgent(). Use the same user-agent string for SDK requests to the API.
error.getCode() error.getStatusCode() returns the HTTP status code.