!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())

[Skip to main content](#__docusaurus_skipToContent_fallback)

You are viewing the **preview** v0.2 docs. View the **stable** v0.1 docs [here](/v0.1/docs/get_started/introduction/). Leave feedback on the v0.2 docs [here](https://github.com/langchain-ai/langchainjs/discussions/5386).

[

![🦜️🔗 Langchain](/v0.2/img/brand/wordmark.png)![🦜️🔗 Langchain](/v0.2/img/brand/wordmark-dark.png)

](/v0.2/)[Integrations](/v0.2/docs/integrations/platforms/)[API Reference](https://v02.api.js.langchain.com)

[More](#)

*   [People](/v0.2/docs/people/)
*   [Community](/v0.2/docs/community)
*   [Tutorials](/v0.2/docs/additional_resources/tutorials)
*   [Contributing](/v0.2/docs/contributing)

[v0.2](#)

*   [v0.2](/v0.2/docs/introduction)
*   [v0.1](https://js.langchain.com/v0.1/docs/get_started/introduction)

[🦜🔗](#)

*   [LangSmith](https://smith.langchain.com)
*   [LangSmith Docs](https://docs.smith.langchain.com)
*   [LangChain Hub](https://smith.langchain.com/hub)
*   [LangServe](https://github.com/langchain-ai/langserve)
*   [Python Docs](https://python.langchain.com/)

[Chat](https://chatjs.langchain.com)[](https://github.com/langchain-ai/langchainjs)

Search

*   [Providers](/v0.2/docs/integrations/platforms/)
    
    *   [Providers](/v0.2/docs/integrations/platforms/)
    *   [Anthropic](/v0.2/docs/integrations/platforms/anthropic)
    *   [AWS](/v0.2/docs/integrations/platforms/aws)
    *   [Google](/v0.2/docs/integrations/platforms/google)
    *   [Microsoft](/v0.2/docs/integrations/platforms/microsoft)
    *   [OpenAI](/v0.2/docs/integrations/platforms/openai)
*   [Components](/v0.2/docs/integrations/components)
    
    *   [Chat models](/v0.2/docs/integrations/chat/)
        
    *   [LLMs](/v0.2/docs/integrations/llms/)
        
    *   [Embedding models](/v0.2/docs/integrations/text_embedding)
        
    *   [Document loaders](/v0.2/docs/integrations/document_loaders)
        
        *   [File Loaders](/v0.2/docs/integrations/document_loaders/file_loaders/)
            
            *   [Folders with multiple files](/v0.2/docs/integrations/document_loaders/file_loaders/directory)
            *   [ChatGPT files](/v0.2/docs/integrations/document_loaders/file_loaders/chatgpt)
            *   [CSV files](/v0.2/docs/integrations/document_loaders/file_loaders/csv)
            *   [Docx files](/v0.2/docs/integrations/document_loaders/file_loaders/docx)
            *   [EPUB files](/v0.2/docs/integrations/document_loaders/file_loaders/epub)
            *   [JSON files](/v0.2/docs/integrations/document_loaders/file_loaders/json)
            *   [JSONLines files](/v0.2/docs/integrations/document_loaders/file_loaders/jsonlines)
            *   [Notion markdown export](/v0.2/docs/integrations/document_loaders/file_loaders/notion_markdown)
            *   [Open AI Whisper Audio](/v0.2/docs/integrations/document_loaders/file_loaders/openai_whisper_audio)
            *   [PDF files](/v0.2/docs/integrations/document_loaders/file_loaders/pdf)
            *   [PPTX files](/v0.2/docs/integrations/document_loaders/file_loaders/pptx)
            *   [Subtitles](/v0.2/docs/integrations/document_loaders/file_loaders/subtitles)
            *   [Text files](/v0.2/docs/integrations/document_loaders/file_loaders/text)
            *   [Unstructured](/v0.2/docs/integrations/document_loaders/file_loaders/unstructured)
        *   [Web Loaders](/v0.2/docs/integrations/document_loaders/web_loaders/)
            
    *   [Document transformers](/v0.2/docs/integrations/document_transformers)
        
    *   [Vector stores](/v0.2/docs/integrations/vectorstores)
        
    *   [Retrievers](/v0.2/docs/integrations/retrievers)
        
    *   [Tools](/v0.2/docs/integrations/tools)
        
    *   [Toolkits](/v0.2/docs/integrations/toolkits)
        
    *   [Stores](/v0.2/docs/integrations/stores/)
        

*   [](/v0.2/)
*   [Components](/v0.2/docs/integrations/components)
*   [Document loaders](/v0.2/docs/integrations/document_loaders)
*   [File Loaders](/v0.2/docs/integrations/document_loaders/file_loaders/)
*   PDF files

On this page

PDF files
=========

This example goes over how to load data from PDF files. By default, one document will be created for each page in the PDF file, you can change this behavior by setting the `splitPages` option to `false`.

Setup[​](#setup "Direct link to Setup")
---------------------------------------

*   npm
*   Yarn
*   pnpm

    npm install pdf-parse

    yarn add pdf-parse

    pnpm add pdf-parse

Usage, one document per page[​](#usage-one-document-per-page "Direct link to Usage, one document per page")
-----------------------------------------------------------------------------------------------------------

    import { PDFLoader } from "langchain/document_loaders/fs/pdf";const loader = new PDFLoader("src/document_loaders/example_data/example.pdf");const docs = await loader.load();

Usage, one document per file[​](#usage-one-document-per-file "Direct link to Usage, one document per file")
-----------------------------------------------------------------------------------------------------------

    import { PDFLoader } from "langchain/document_loaders/fs/pdf";const loader = new PDFLoader("src/document_loaders/example_data/example.pdf", {  splitPages: false,});const docs = await loader.load();

Usage, custom `pdfjs` build[​](#usage-custom-pdfjs-build "Direct link to usage-custom-pdfjs-build")
---------------------------------------------------------------------------------------------------

By default we use the `pdfjs` build bundled with `pdf-parse`, which is compatible with most environments, including Node.js and modern browsers. If you want to use a more recent version of `pdfjs-dist` or if you want to use a custom build of `pdfjs-dist`, you can do so by providing a custom `pdfjs` function that returns a promise that resolves to the `PDFJS` object.

In the following example we use the "legacy" (see [pdfjs docs](https://github.com/mozilla/pdf.js/wiki/Frequently-Asked-Questions#which-browsersenvironments-are-supported)) build of `pdfjs-dist`, which includes several polyfills not included in the default build.

*   npm
*   Yarn
*   pnpm

    npm install pdfjs-dist

    yarn add pdfjs-dist

    pnpm add pdfjs-dist

    import { PDFLoader } from "langchain/document_loaders/fs/pdf";const loader = new PDFLoader("src/document_loaders/example_data/example.pdf", {  // you may need to add `.then(m => m.default)` to the end of the import  pdfjs: () => import("pdfjs-dist/legacy/build/pdf.js"),});

Eliminating extra spaces[​](#eliminating-extra-spaces "Direct link to Eliminating extra spaces")
------------------------------------------------------------------------------------------------

PDFs come in many varieties, which makes reading them a challenge. The loader parses individual text elements and joins them together with a space by default, but if you are seeing excessive spaces, this may not be the desired behavior. In that case, you can override the separator with an empty string like this:

    import { PDFLoader } from "langchain/document_loaders/fs/pdf";const loader = new PDFLoader("src/document_loaders/example_data/example.pdf", {  parsedItemSeparator: "",});const docs = await loader.load();

Loading directories[​](#loading-directories "Direct link to Loading directories")
---------------------------------------------------------------------------------

    import { DirectoryLoader } from "langchain/document_loaders/fs/directory";import { PDFLoader } from "langchain/document_loaders/fs/pdf";import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";/* Load all PDFs within the specified directory */const directoryLoader = new DirectoryLoader(  "src/document_loaders/example_data/",  {    ".pdf": (path: string) => new PDFLoader(path),  });const docs = await directoryLoader.load();console.log({ docs });/* Additional steps : Split text into chunks with any TextSplitter. You can then use it as context or save it to memory afterwards. */const textSplitter = new RecursiveCharacterTextSplitter({  chunkSize: 1000,  chunkOverlap: 200,});const splitDocs = await textSplitter.splitDocuments(docs);console.log({ splitDocs });

#### API Reference:

*   [DirectoryLoader](https://v02.api.js.langchain.com/classes/langchain_document_loaders_fs_directory.DirectoryLoader.html) from `langchain/document_loaders/fs/directory`
*   [PDFLoader](https://v02.api.js.langchain.com/classes/langchain_document_loaders_fs_pdf.PDFLoader.html) from `langchain/document_loaders/fs/pdf`
*   [RecursiveCharacterTextSplitter](https://v02.api.js.langchain.com/classes/langchain_textsplitters.RecursiveCharacterTextSplitter.html) from `@langchain/textsplitters`

* * *

#### Was this page helpful?

  

#### You can leave detailed feedback [on GitHub](https://github.com/langchain-ai/langchainjs/issues/new?assignees=&labels=03+-+Documentation&projects=&template=documentation.yml&title=DOC%3A+%3CPlease+write+a+comprehensive+title+after+the+%27DOC%3A+%27+prefix%3E).

[

Previous

Open AI Whisper Audio

](/v0.2/docs/integrations/document_loaders/file_loaders/openai_whisper_audio)[

Next

PPTX files

](/v0.2/docs/integrations/document_loaders/file_loaders/pptx)

*   [Setup](#setup)
*   [Usage, one document per page](#usage-one-document-per-page)
*   [Usage, one document per file](#usage-one-document-per-file)
*   [Usage, custom `pdfjs` build](#usage-custom-pdfjs-build)
*   [Eliminating extra spaces](#eliminating-extra-spaces)
*   [Loading directories](#loading-directories)

Community

*   [Discord](https://discord.gg/cU2adEyC7w)
*   [Twitter](https://twitter.com/LangChainAI)

GitHub

*   [Python](https://github.com/langchain-ai/langchain)
*   [JS/TS](https://github.com/langchain-ai/langchainjs)

More

*   [Homepage](https://langchain.com)
*   [Blog](https://blog.langchain.dev)

Copyright © 2024 LangChain, Inc.