» npm install pdfjs-dist
Videos
What is PDF.js used for?
Is PDF.js free to use?
How to use PDF.js in React?
Here's a super ugly workaround for client-components, until something better is proposed (I hate this too, but it works):
npm i pdfjs-dist
Edit 1: A hook might be better for reusability:
Create Your Hook
"use client";
import {useEffect} from "react";
import * as PDFJS from "pdfjs-dist/types/src/pdf";
export const usePDFJS = (onLoad: (pdfjs: typeof PDFJS) => Promise<void>, deps: (string | number | boolean | undefined | null)[] = []) => {
const [pdfjs, setPDFJS] = useState<typeof PDFJS>(null);
// load the library once on mount (the webpack import automatically sets-up the worker)
useEffect(() => {
import("pdfjs-dist/webpack.mjs").then(setPDFJS)
}, []);
// execute the callback function whenever PDFJS loads (or a custom dependency-array updates)
useEffect(() => {
if(!pdfjs) return;
(async () => await onLoad(pdfjs))();
}, [ pdfjs, ...deps ]);
}
Typescript Fix
Your compiler might complain about a typescript issue; if so, I just added an index.d.ts (note the .d.ts) at the same level as my hook:
declare module 'pdfjs-dist/webpack.mjs' { export * from 'pdfjs-dist' }
Use Your Hook
"use client";
import {usePDFJS} from "...";
export default function Page() {
usePDFJS(async (pdfjs) => {
console.log(pdfjs)
})
}
There's a pretty lengthy discussion over on Github issues where people have managed to get it working either on client:
I decided to follow a simple path, I downloaded the stable version from the official website. I put all the files in the public folder. Then I added this tag to my component:
<script src="/pdfjs/pdf.mjs" type="module" />
then adding code in useEffect:
const pdfjs = window.pdfjsLib as typeof import('pdfjs-dist/types/src/pdf')
const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.min.mjs');
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
const pdfDocument = pdfjs.getDocument('http://localhost:3000/pdf-files/myFile.pdf')
console.log('pdfDocument', pdfDocument);
Or server-side, via appDir (e.g. app/api/pdf/route.js)
import * as pdfjs from 'pdfjs-dist/build/pdf.min.mjs';
await import('pdfjs-dist/build/pdf.worker.min.mjs');
export async function POST(req, res) {
const pdf = await pdfjs.getDocument(
'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
).promise;
const page = await pdf.getPage(1);
const textContent = await page.getTextContent();
return NextResponse.json({ message: textContent }, { status: 200 });
}
I've personally just tested this last API-one on Next.js 14.1.1 and it works just fine after a npm install pdfjs-dist
i am trying to make an view page of the pdf create using jspdf twith the help of pdfjs-dist ini vue 3.
vue - 3.4.21
pdfjs-dist - 4.3.136
jspdf - 2.5.1