unpdf 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/dist/index.node.cjs +10 -62
- package/dist/index.node.d.cts +3 -11
- package/dist/index.node.d.mts +3 -11
- package/dist/index.node.d.ts +3 -11
- package/dist/index.node.mjs +10 -62
- package/dist/index.web.cjs +8 -4
- package/dist/index.web.d.cts +1 -1
- package/dist/index.web.d.mts +1 -1
- package/dist/index.web.d.ts +1 -1
- package/dist/index.web.mjs +8 -4
- package/dist/index.worker.cjs +11 -0
- package/dist/index.worker.d.cts +6 -0
- package/dist/index.worker.d.mts +6 -0
- package/dist/index.worker.d.ts +6 -0
- package/dist/index.worker.mjs +8 -0
- package/dist/shared/unpdf.5c39ffe2.d.cts +14 -0
- package/dist/shared/unpdf.5c39ffe2.d.mts +14 -0
- package/dist/shared/unpdf.5c39ffe2.d.ts +14 -0
- package/dist/shared/unpdf.72a42ec0.mjs +79 -0
- package/dist/shared/unpdf.970262b7.cjs +84 -0
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
# unpdf
|
|
2
2
|
|
|
3
|
-
A collection of utilities to work with PDFs.
|
|
3
|
+
A collection of utilities to work with PDFs. Uses Mozilla's [PDF.js](https://github.com/mozilla/pdf.js) under the hood.
|
|
4
4
|
|
|
5
|
-
`unpdf` takes advantage of [export conditions](https://nodejs.org/api/packages.html#packages_conditional_exports) to
|
|
5
|
+
`unpdf` takes advantage of [export conditions](https://nodejs.org/api/packages.html#packages_conditional_exports) to circumvent build issues in serverless environments. PDF.js depends on the optional `canvas` module, which [doesn't work inside worker threads](https://github.com/Automattic/node-canvas/issues/1394).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
This library is also intended as a modern alternative to the unmaintained [`pdf-parse`](https://www.npmjs.com/package/pdf-parse).
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- 🏗️ Conditional exports for Browser, Node and worker environments
|
|
12
|
+
- 💬 Extract text from PDFs
|
|
11
13
|
|
|
12
14
|
## Installation
|
|
13
15
|
|
package/dist/index.node.cjs
CHANGED
|
@@ -1,67 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
async
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return pdf;
|
|
14
|
-
}
|
|
15
|
-
async function getPDFJSImports() {
|
|
16
|
-
try {
|
|
17
|
-
const { default: mod } = await import('pdfjs-dist/legacy/build/pdf');
|
|
18
|
-
const { getDocument, version } = mod;
|
|
19
|
-
return { getDocument, version };
|
|
20
|
-
} catch (e) {
|
|
21
|
-
console.error(e);
|
|
22
|
-
throw new Error(
|
|
23
|
-
"PDF.js is not available. Please run `pnpm add -D pdfjs-dist` and try again."
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async function decodePDFText(data, { mergePages = false } = {}) {
|
|
29
|
-
const pdf = await getDocumentProxy(data);
|
|
30
|
-
const meta = await pdf.getMetadata().catch(() => null);
|
|
31
|
-
const texts = await Promise.all(
|
|
32
|
-
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
33
|
-
);
|
|
34
|
-
const filteredTexts = texts.filter(Boolean);
|
|
35
|
-
return {
|
|
36
|
-
totalPages: pdf.numPages,
|
|
37
|
-
info: meta?.info,
|
|
38
|
-
metadata: meta?.metadata?.getAll(),
|
|
39
|
-
text: mergePages ? filteredTexts.join("\n\n") : filteredTexts
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
async function getPageText(pdf, pageNumber) {
|
|
43
|
-
const page = await pdf.getPage(pageNumber);
|
|
44
|
-
const content = await page.getTextContent();
|
|
45
|
-
const items = content.items;
|
|
46
|
-
if (items.length === 0)
|
|
47
|
-
return;
|
|
48
|
-
return items.map(({ str }) => str).join("\n");
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function getImagesFromPage(data, pageNumber) {
|
|
52
|
-
const pdf = await getDocumentProxy(data);
|
|
53
|
-
const page = await pdf.getPage(pageNumber);
|
|
54
|
-
const operatorList = await page.getOperatorList();
|
|
55
|
-
const images = [];
|
|
56
|
-
for (const op of operatorList.fnArray) {
|
|
57
|
-
if (op !== pdfjsDist.OPS.paintImageXObject)
|
|
58
|
-
continue;
|
|
59
|
-
const image = await page.objs.get(operatorList.argsArray[op][0]);
|
|
60
|
-
if (image.data)
|
|
61
|
-
images.push(image.data.buffer);
|
|
62
|
-
}
|
|
63
|
-
return images;
|
|
64
|
-
}
|
|
3
|
+
const image = require('./shared/unpdf.970262b7.cjs');
|
|
4
|
+
|
|
5
|
+
const decodePDFText = async (...args) => {
|
|
6
|
+
await image.resolvePDFJSNodeImports();
|
|
7
|
+
return await image.decodePDFText(...args);
|
|
8
|
+
};
|
|
9
|
+
const getImagesFromPage = async (...args) => {
|
|
10
|
+
await image.resolvePDFJSNodeImports();
|
|
11
|
+
return await image.getImagesFromPage(...args);
|
|
12
|
+
};
|
|
65
13
|
|
|
66
14
|
exports.decodePDFText = decodePDFText;
|
|
67
15
|
exports.getImagesFromPage = getImagesFromPage;
|
package/dist/index.node.d.cts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
totalPages: number;
|
|
3
|
-
info?: Record<string, any>;
|
|
4
|
-
metadata?: any;
|
|
5
|
-
text: string | string[];
|
|
6
|
-
}
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.cjs';
|
|
7
2
|
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
}): Promise<PDFContent>;
|
|
11
|
-
|
|
12
|
-
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
3
|
+
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
|
+
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
|
13
5
|
|
|
14
6
|
export { decodePDFText, getImagesFromPage };
|
package/dist/index.node.d.mts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
totalPages: number;
|
|
3
|
-
info?: Record<string, any>;
|
|
4
|
-
metadata?: any;
|
|
5
|
-
text: string | string[];
|
|
6
|
-
}
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.mjs';
|
|
7
2
|
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
}): Promise<PDFContent>;
|
|
11
|
-
|
|
12
|
-
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
3
|
+
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
|
+
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
|
13
5
|
|
|
14
6
|
export { decodePDFText, getImagesFromPage };
|
package/dist/index.node.d.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
totalPages: number;
|
|
3
|
-
info?: Record<string, any>;
|
|
4
|
-
metadata?: any;
|
|
5
|
-
text: string | string[];
|
|
6
|
-
}
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.js';
|
|
7
2
|
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
}): Promise<PDFContent>;
|
|
11
|
-
|
|
12
|
-
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
3
|
+
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
|
+
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
|
13
5
|
|
|
14
6
|
export { decodePDFText, getImagesFromPage };
|
package/dist/index.node.mjs
CHANGED
|
@@ -1,64 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
async
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return pdf;
|
|
12
|
-
}
|
|
13
|
-
async function getPDFJSImports() {
|
|
14
|
-
try {
|
|
15
|
-
const { default: mod } = await import('pdfjs-dist/legacy/build/pdf');
|
|
16
|
-
const { getDocument, version } = mod;
|
|
17
|
-
return { getDocument, version };
|
|
18
|
-
} catch (e) {
|
|
19
|
-
console.error(e);
|
|
20
|
-
throw new Error(
|
|
21
|
-
"PDF.js is not available. Please run `pnpm add -D pdfjs-dist` and try again."
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async function decodePDFText(data, { mergePages = false } = {}) {
|
|
27
|
-
const pdf = await getDocumentProxy(data);
|
|
28
|
-
const meta = await pdf.getMetadata().catch(() => null);
|
|
29
|
-
const texts = await Promise.all(
|
|
30
|
-
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
31
|
-
);
|
|
32
|
-
const filteredTexts = texts.filter(Boolean);
|
|
33
|
-
return {
|
|
34
|
-
totalPages: pdf.numPages,
|
|
35
|
-
info: meta?.info,
|
|
36
|
-
metadata: meta?.metadata?.getAll(),
|
|
37
|
-
text: mergePages ? filteredTexts.join("\n\n") : filteredTexts
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
async function getPageText(pdf, pageNumber) {
|
|
41
|
-
const page = await pdf.getPage(pageNumber);
|
|
42
|
-
const content = await page.getTextContent();
|
|
43
|
-
const items = content.items;
|
|
44
|
-
if (items.length === 0)
|
|
45
|
-
return;
|
|
46
|
-
return items.map(({ str }) => str).join("\n");
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function getImagesFromPage(data, pageNumber) {
|
|
50
|
-
const pdf = await getDocumentProxy(data);
|
|
51
|
-
const page = await pdf.getPage(pageNumber);
|
|
52
|
-
const operatorList = await page.getOperatorList();
|
|
53
|
-
const images = [];
|
|
54
|
-
for (const op of operatorList.fnArray) {
|
|
55
|
-
if (op !== OPS.paintImageXObject)
|
|
56
|
-
continue;
|
|
57
|
-
const image = await page.objs.get(operatorList.argsArray[op][0]);
|
|
58
|
-
if (image.data)
|
|
59
|
-
images.push(image.data.buffer);
|
|
60
|
-
}
|
|
61
|
-
return images;
|
|
62
|
-
}
|
|
1
|
+
import { a as resolvePDFJSNodeImports, d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.72a42ec0.mjs';
|
|
2
|
+
|
|
3
|
+
const decodePDFText = async (...args) => {
|
|
4
|
+
await resolvePDFJSNodeImports();
|
|
5
|
+
return await decodePDFText$1(...args);
|
|
6
|
+
};
|
|
7
|
+
const getImagesFromPage = async (...args) => {
|
|
8
|
+
await resolvePDFJSNodeImports();
|
|
9
|
+
return await getImagesFromPage$1(...args);
|
|
10
|
+
};
|
|
63
11
|
|
|
64
12
|
export { decodePDFText, getImagesFromPage };
|
package/dist/index.web.cjs
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
3
|
+
const image = require('./shared/unpdf.970262b7.cjs');
|
|
4
|
+
|
|
5
|
+
const decodePDFText = async (...args) => {
|
|
6
|
+
await image.resolvePDFJSWebImports();
|
|
7
|
+
return await image.decodePDFText(...args);
|
|
5
8
|
};
|
|
6
|
-
const getImagesFromPage = async () => {
|
|
7
|
-
|
|
9
|
+
const getImagesFromPage = async (...args) => {
|
|
10
|
+
await image.resolvePDFJSWebImports();
|
|
11
|
+
return await image.getImagesFromPage(...args);
|
|
8
12
|
};
|
|
9
13
|
|
|
10
14
|
exports.decodePDFText = decodePDFText;
|
package/dist/index.web.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.cjs';
|
|
2
2
|
|
|
3
3
|
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
4
|
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
package/dist/index.web.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.mjs';
|
|
2
2
|
|
|
3
3
|
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
4
|
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
package/dist/index.web.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.5c39ffe2.js';
|
|
2
2
|
|
|
3
3
|
declare const decodePDFText: typeof decodePDFText$1;
|
|
4
4
|
declare const getImagesFromPage: typeof getImagesFromPage$1;
|
package/dist/index.web.mjs
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { r as resolvePDFJSWebImports, d as decodePDFText$1, g as getImagesFromPage$1 } from './shared/unpdf.72a42ec0.mjs';
|
|
2
|
+
|
|
3
|
+
const decodePDFText = async (...args) => {
|
|
4
|
+
await resolvePDFJSWebImports();
|
|
5
|
+
return await decodePDFText$1(...args);
|
|
3
6
|
};
|
|
4
|
-
const getImagesFromPage = async () => {
|
|
5
|
-
|
|
7
|
+
const getImagesFromPage = async (...args) => {
|
|
8
|
+
await resolvePDFJSWebImports();
|
|
9
|
+
return await getImagesFromPage$1(...args);
|
|
6
10
|
};
|
|
7
11
|
|
|
8
12
|
export { decodePDFText, getImagesFromPage };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const decodePDFText = async () => {
|
|
4
|
+
throw new Error("Not implemented in worker context yet");
|
|
5
|
+
};
|
|
6
|
+
const getImagesFromPage = async () => {
|
|
7
|
+
throw new Error("Not implemented in worker context yet");
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
exports.decodePDFText = decodePDFText;
|
|
11
|
+
exports.getImagesFromPage = getImagesFromPage;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface PDFContent {
|
|
2
|
+
totalPages: number;
|
|
3
|
+
info?: Record<string, any>;
|
|
4
|
+
metadata?: any;
|
|
5
|
+
text: string | string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare function decodePDFText(data: ArrayBuffer, { mergePages }?: {
|
|
9
|
+
mergePages?: boolean;
|
|
10
|
+
}): Promise<PDFContent>;
|
|
11
|
+
|
|
12
|
+
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
13
|
+
|
|
14
|
+
export { decodePDFText as d, getImagesFromPage as g };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface PDFContent {
|
|
2
|
+
totalPages: number;
|
|
3
|
+
info?: Record<string, any>;
|
|
4
|
+
metadata?: any;
|
|
5
|
+
text: string | string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare function decodePDFText(data: ArrayBuffer, { mergePages }?: {
|
|
9
|
+
mergePages?: boolean;
|
|
10
|
+
}): Promise<PDFContent>;
|
|
11
|
+
|
|
12
|
+
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
13
|
+
|
|
14
|
+
export { decodePDFText as d, getImagesFromPage as g };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface PDFContent {
|
|
2
|
+
totalPages: number;
|
|
3
|
+
info?: Record<string, any>;
|
|
4
|
+
metadata?: any;
|
|
5
|
+
text: string | string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare function decodePDFText(data: ArrayBuffer, { mergePages }?: {
|
|
9
|
+
mergePages?: boolean;
|
|
10
|
+
}): Promise<PDFContent>;
|
|
11
|
+
|
|
12
|
+
declare function getImagesFromPage(data: ArrayBuffer, pageNumber: number): Promise<ArrayBuffer[]>;
|
|
13
|
+
|
|
14
|
+
export { decodePDFText as d, getImagesFromPage as g };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
let instance;
|
|
2
|
+
async function getDocumentProxy(data) {
|
|
3
|
+
const { getDocument } = instance;
|
|
4
|
+
const pdf = await getDocument({
|
|
5
|
+
data,
|
|
6
|
+
useWorkerFetch: false,
|
|
7
|
+
useSystemFonts: true,
|
|
8
|
+
isEvalSupported: false
|
|
9
|
+
}).promise;
|
|
10
|
+
return pdf;
|
|
11
|
+
}
|
|
12
|
+
function getResolvedPDFJSInstance() {
|
|
13
|
+
return instance;
|
|
14
|
+
}
|
|
15
|
+
async function resolvePDFJSWebImports() {
|
|
16
|
+
if (instance)
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
const { default: mod } = await import('pdfjs-dist');
|
|
20
|
+
instance = mod;
|
|
21
|
+
} catch (error) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
"PDF.js is not available. Please add the package as a dependency."
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function resolvePDFJSNodeImports() {
|
|
28
|
+
if (instance)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const { default: mod } = await import('pdfjs-dist/legacy/build/pdf');
|
|
32
|
+
instance = mod;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
"PDF.js is not available. Please add the package as a dependency."
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function decodePDFText(data, { mergePages = false } = {}) {
|
|
41
|
+
const pdf = await getDocumentProxy(data);
|
|
42
|
+
const meta = await pdf.getMetadata().catch(() => null);
|
|
43
|
+
const texts = await Promise.all(
|
|
44
|
+
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
45
|
+
);
|
|
46
|
+
const filteredTexts = texts.filter(Boolean);
|
|
47
|
+
return {
|
|
48
|
+
totalPages: pdf.numPages,
|
|
49
|
+
info: meta?.info,
|
|
50
|
+
metadata: meta?.metadata?.getAll(),
|
|
51
|
+
text: mergePages ? filteredTexts.join("\n\n") : filteredTexts
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function getPageText(pdf, pageNumber) {
|
|
55
|
+
const page = await pdf.getPage(pageNumber);
|
|
56
|
+
const content = await page.getTextContent();
|
|
57
|
+
const items = content.items;
|
|
58
|
+
if (items.length === 0)
|
|
59
|
+
return;
|
|
60
|
+
return items.map(({ str }) => str).join("\n");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function getImagesFromPage(data, pageNumber) {
|
|
64
|
+
const pdf = await getDocumentProxy(data);
|
|
65
|
+
const page = await pdf.getPage(pageNumber);
|
|
66
|
+
const operatorList = await page.getOperatorList();
|
|
67
|
+
const { OPS } = getResolvedPDFJSInstance();
|
|
68
|
+
const images = [];
|
|
69
|
+
for (const op of operatorList.fnArray) {
|
|
70
|
+
if (op !== OPS.paintImageXObject)
|
|
71
|
+
continue;
|
|
72
|
+
const image = await page.objs.get(operatorList.argsArray[op][0]);
|
|
73
|
+
if (image.data)
|
|
74
|
+
images.push(image.data.buffer);
|
|
75
|
+
}
|
|
76
|
+
return images;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { resolvePDFJSNodeImports as a, decodePDFText as d, getImagesFromPage as g, resolvePDFJSWebImports as r };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
let instance;
|
|
4
|
+
async function getDocumentProxy(data) {
|
|
5
|
+
const { getDocument } = instance;
|
|
6
|
+
const pdf = await getDocument({
|
|
7
|
+
data,
|
|
8
|
+
useWorkerFetch: false,
|
|
9
|
+
useSystemFonts: true,
|
|
10
|
+
isEvalSupported: false
|
|
11
|
+
}).promise;
|
|
12
|
+
return pdf;
|
|
13
|
+
}
|
|
14
|
+
function getResolvedPDFJSInstance() {
|
|
15
|
+
return instance;
|
|
16
|
+
}
|
|
17
|
+
async function resolvePDFJSWebImports() {
|
|
18
|
+
if (instance)
|
|
19
|
+
return;
|
|
20
|
+
try {
|
|
21
|
+
const { default: mod } = await import('pdfjs-dist');
|
|
22
|
+
instance = mod;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
"PDF.js is not available. Please add the package as a dependency."
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function resolvePDFJSNodeImports() {
|
|
30
|
+
if (instance)
|
|
31
|
+
return;
|
|
32
|
+
try {
|
|
33
|
+
const { default: mod } = await import('pdfjs-dist/legacy/build/pdf');
|
|
34
|
+
instance = mod;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
"PDF.js is not available. Please add the package as a dependency."
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function decodePDFText(data, { mergePages = false } = {}) {
|
|
43
|
+
const pdf = await getDocumentProxy(data);
|
|
44
|
+
const meta = await pdf.getMetadata().catch(() => null);
|
|
45
|
+
const texts = await Promise.all(
|
|
46
|
+
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
47
|
+
);
|
|
48
|
+
const filteredTexts = texts.filter(Boolean);
|
|
49
|
+
return {
|
|
50
|
+
totalPages: pdf.numPages,
|
|
51
|
+
info: meta?.info,
|
|
52
|
+
metadata: meta?.metadata?.getAll(),
|
|
53
|
+
text: mergePages ? filteredTexts.join("\n\n") : filteredTexts
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function getPageText(pdf, pageNumber) {
|
|
57
|
+
const page = await pdf.getPage(pageNumber);
|
|
58
|
+
const content = await page.getTextContent();
|
|
59
|
+
const items = content.items;
|
|
60
|
+
if (items.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
return items.map(({ str }) => str).join("\n");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function getImagesFromPage(data, pageNumber) {
|
|
66
|
+
const pdf = await getDocumentProxy(data);
|
|
67
|
+
const page = await pdf.getPage(pageNumber);
|
|
68
|
+
const operatorList = await page.getOperatorList();
|
|
69
|
+
const { OPS } = getResolvedPDFJSInstance();
|
|
70
|
+
const images = [];
|
|
71
|
+
for (const op of operatorList.fnArray) {
|
|
72
|
+
if (op !== OPS.paintImageXObject)
|
|
73
|
+
continue;
|
|
74
|
+
const image = await page.objs.get(operatorList.argsArray[op][0]);
|
|
75
|
+
if (image.data)
|
|
76
|
+
images.push(image.data.buffer);
|
|
77
|
+
}
|
|
78
|
+
return images;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exports.decodePDFText = decodePDFText;
|
|
82
|
+
exports.getImagesFromPage = getImagesFromPage;
|
|
83
|
+
exports.resolvePDFJSNodeImports = resolvePDFJSNodeImports;
|
|
84
|
+
exports.resolvePDFJSWebImports = resolvePDFJSWebImports;
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unpdf",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"packageManager": "pnpm@8.6.12",
|
|
6
|
-
"description": "Utilities to work with PDFs",
|
|
6
|
+
"description": "Utilities to work with PDFs, like extracting text",
|
|
7
7
|
"author": "Johann Schopplich <pkg@johannschopplich.com>",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"homepage": "https://github.com/johannschopplich/unpdf#readme",
|
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
"sideEffects": false,
|
|
22
22
|
"exports": {
|
|
23
23
|
"browser": "./dist/index.web.mjs",
|
|
24
|
-
"bun": "./dist/index.
|
|
25
|
-
"deno": "./dist/index.
|
|
26
|
-
"edge-light": "./dist/index.
|
|
27
|
-
"edge-routine": "./dist/index.
|
|
28
|
-
"lagon": "./dist/index.
|
|
29
|
-
"netlify": "./dist/index.
|
|
30
|
-
"react-native": "./dist/index.
|
|
31
|
-
"wintercg": "./dist/index.
|
|
32
|
-
"worker": "./dist/index.
|
|
33
|
-
"workerd": "./dist/index.
|
|
24
|
+
"bun": "./dist/index.worker.mjs",
|
|
25
|
+
"deno": "./dist/index.worker.mjs",
|
|
26
|
+
"edge-light": "./dist/index.worker.mjs",
|
|
27
|
+
"edge-routine": "./dist/index.worker.mjs",
|
|
28
|
+
"lagon": "./dist/index.worker.mjs",
|
|
29
|
+
"netlify": "./dist/index.worker.mjs",
|
|
30
|
+
"react-native": "./dist/index.worker.mjs",
|
|
31
|
+
"wintercg": "./dist/index.worker.mjs",
|
|
32
|
+
"worker": "./dist/index.worker.mjs",
|
|
33
|
+
"workerd": "./dist/index.worker.mjs",
|
|
34
34
|
"node": {
|
|
35
35
|
"types": "./dist/index.node.d.ts",
|
|
36
36
|
"import": "./dist/index.node.mjs",
|