Handling PDF Files in Next.js 13 using pdf-loader and react-pdf

Faton Ramadani
3 min readMar 31, 2023

--

In this blog post, we’ll explore how to handle PDF files in a Next.js project using the pdf-loader and react-pdf packages. We will demonstrate how to configure Webpack to load PDF files and display them within your application using the react-pdf package.

Prerequisites:

  • Basic knowledge of React and Next.js
  • A Next.js project set up and running

Step 1: Install pdf-loader and file-loader

First, we need to install pdf-loader and file-loader to handle PDF files in our project. Run the following command in your terminal:

npm install pdf-loader file-loader --save-dev

Step 2: Configure Webpack

Create a next.config.js file in the root of your project (if you don't have one already) and add the following configuration:

// next.config.js
module.exports = {
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
config.module.rules.push({
test: /\.pdf$/,
use: [
{
loader: 'file-loader',
options: {
name: '[path][name].[ext]',
},
},
{
loader: 'pdf-loader',
},
],
});

return config;
},
};

Title: Handling PDF Files in Next.js using pdf-loader and react-pdf

Introduction:

In this blog post, we’ll explore how to handle PDF files in a Next.js project using the pdf-loader and react-pdf packages. We will demonstrate how to configure Webpack to load PDF files and display them within your application using the react-pdf package.

Prerequisites:

  • Basic knowledge of React and Next.js
  • A Next.js project set up and running

Step 1: Install pdf-loader and file-loader

First, we need to install pdf-loader and file-loader to handle PDF files in our project. Run the following command in your terminal:

npm install pdf-loader file-loader --save-dev

Step 2: Configure Webpack

Create a next.config.js file in the root of your project (if you don't have one already) and add the following configuration:javascrip

// next.config.js
module.exports = {
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
config.module.rules.push({
test: /\.pdf$/,
use: [
{
loader: 'file-loader',
options: {
name: '[path][name].[ext]',
},
},
{
loader: 'pdf-loader',
},
],
});
return config;
},
};

Step 3: Import PDF files into your components

Now, you can import PDF files into your Next.js components:

import React from 'react';
import pdfFile from '../path/to/your/file.pdf';

const MyComponent = () => (
<div>
<a href={pdfFile} target="_blank" rel="noopener noreferrer">
Download PDF
</a>
</div>
);

export default MyComponent;

Step 4: Display PDF files using react-pdf

To display the PDF files within your application, you can use the react-pdf package. Install it with:

npm install react-pdf

Then use it in your component:

import React from 'react';
import { Document, Page } from 'react-pdf';
import pdfFile from '../path/to/your/file.pdf';

const MyComponent = () => {
const [numPages, setNumPages] = React.useState(null);

function onDocumentLoadSuccess({ numPages }) {
setNumPages(numPages);
}

return (
<div>
<Document file={pdfFile} onLoadSuccess={onDocumentLoadSuccess}>
{Array.from(new Array(numPages), (_, index) => (
<Page key={`page_${index + 1}`} pageNumber={index + 1} />
))}
</Document>
</div>
);
};

export default MyComponent;

Step 5: Handling the ‘canvas’ dependency

Since react-pdf has a peer dependency on the canvas package, you might encounter an error related to it. To resolve this, install the required system dependencies and the canvas package itself.

For Ubuntu/Debian:

sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev

For macOS:

brew install pkg-config cairo pango libpng jpeg giflib librsvg

Then, install the canvas package:

npm install canvas

Step 6: Ignoring the canvas.node file

Webpack might try to parse the canvas.node binary file and throw an error. To fix this, update your next.config.js with the following configuration:

// next.config.js
module.exports = {
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
// Add the PDF loader configuration
config.module.rules.push({
test: /\.pdf$/,
use: [
{
loader: 'file-loader',
options: {
name: '[path][name].[ext]',
},
},
{
loader: 'pdf-loader',
},
],
});

// Ignore the canvas.node file
config.module.rules.push({
test: /\.node$/,
loader: 'ignore-loader',
});

return config;
},
};

If you haven’t installed the ignore-loader package yet, do so by running the following command:

npm install ignore-loader --save-dev

After updating the Webpack configuration and installing the ignore-loader package, the error should be resolved, and you should be able to use react-pdf in your Next.js project without any issues.

Conclusion:

In this blog post, we learned how to handle PDF files in a Next.js project using the pdf-loader and react-pdf packages. By configuring Webpack to handle PDF files and using react-pdf to display them within the application, we can seamlessly work with PDF files in a Next.js project.

--

--