unpdf 1.0.6 → 1.2.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.
Files changed (47) hide show
  1. package/README.md +35 -2
  2. package/dist/index.cjs +28 -0
  3. package/dist/index.d.cts +7 -1
  4. package/dist/index.d.mts +7 -1
  5. package/dist/index.d.ts +7 -1
  6. package/dist/index.mjs +28 -1
  7. package/dist/pdfjs.mjs +1 -1
  8. package/dist/types/src/display/annotation_layer.d.ts +5 -2
  9. package/dist/types/src/display/api.d.ts +30 -74
  10. package/dist/types/src/display/api_utils.d.ts +13 -0
  11. package/dist/types/src/display/canvas.d.ts +2 -2
  12. package/dist/types/src/display/display_utils.d.ts +2 -1
  13. package/dist/types/src/display/draw_layer.d.ts +2 -2
  14. package/dist/types/src/display/editor/alt_text.d.ts +1 -1
  15. package/dist/types/src/display/editor/annotation_editor_layer.d.ts +6 -6
  16. package/dist/types/src/display/editor/color_picker.d.ts +20 -1
  17. package/dist/types/src/display/editor/comment.d.ts +32 -0
  18. package/dist/types/src/display/editor/draw.d.ts +8 -8
  19. package/dist/types/src/display/editor/drawers/freedraw.d.ts +3 -3
  20. package/dist/types/src/display/editor/drawers/signaturedraw.d.ts +13 -13
  21. package/dist/types/src/display/editor/editor.d.ts +48 -5
  22. package/dist/types/src/display/editor/freetext.d.ts +9 -7
  23. package/dist/types/src/display/editor/highlight.d.ts +6 -3
  24. package/dist/types/src/display/editor/ink.d.ts +4 -0
  25. package/dist/types/src/display/editor/signature.d.ts +2 -0
  26. package/dist/types/src/display/editor/stamp.d.ts +2 -0
  27. package/dist/types/src/display/editor/toolbar.d.ts +3 -0
  28. package/dist/types/src/display/editor/tools.d.ts +14 -3
  29. package/dist/types/src/display/pdf_objects.d.ts +40 -0
  30. package/dist/types/src/display/text_layer.d.ts +9 -9
  31. package/dist/types/src/display/worker_options.d.ts +2 -2
  32. package/dist/types/src/pdf.d.ts +3 -2
  33. package/dist/types/src/shared/scripting_utils.d.ts +2 -0
  34. package/dist/types/src/shared/util.d.ts +2 -2
  35. package/dist/types/web/app_options.d.ts +1 -1
  36. package/dist/types/web/autolinker.d.ts +2 -2
  37. package/dist/types/web/base_pdf_page_view.d.ts +0 -1
  38. package/dist/types/web/event_utils.d.ts +1 -1
  39. package/dist/types/web/genericl10n.d.ts +5 -5
  40. package/dist/types/web/l10n.d.ts +2 -2
  41. package/dist/types/web/pdf_find_controller.d.ts +1 -1
  42. package/dist/types/web/pdf_page_view.d.ts +9 -7
  43. package/dist/types/web/pdf_thumbnail_view.d.ts +2 -10
  44. package/dist/types/web/pdf_viewer.d.ts +42 -1
  45. package/dist/types/web/text_accessibility.d.ts +1 -1
  46. package/dist/types/web/text_layer_builder.d.ts +4 -4
  47. package/package.json +13 -13
package/README.md CHANGED
@@ -10,7 +10,7 @@ This library is also intended as a modern alternative to the unmaintained but st
10
10
 
11
11
  - 🏗️ Made for Node.js, browser and serverless environments
12
12
  - 🪭 Includes serverless build of PDF.js ([`unpdf/pdfjs`](./package.json#L34))
13
- - 💬 Extract [text](#extract-text-from-pdf) and [images](#extractimages) from PDF files
13
+ - 💬 Extract [text](#extract-text-from-pdf), [links](#extractlinks), and [images](#extractimages) from PDF files
14
14
  - 🧠 Perfect for AI applications and PDF summarization
15
15
  - 🧱 Opt-in to legacy PDF.js build
16
16
  - 💨 Zero dependencies
@@ -18,7 +18,7 @@ This library is also intended as a modern alternative to the unmaintained but st
18
18
  ## PDF.js Compatibility
19
19
 
20
20
  > [!Tip]
21
- > The serverless PDF.js bundle provided by `unpdf` is built from PDF.js v5.2.133.
21
+ > The serverless PDF.js bundle provided by `unpdf` is built from PDF.js v5.4.54.
22
22
 
23
23
  You can use an [official PDF.js build](#official-or-legacy-pdfjs-build) by using the [`definePDFJSModule`](#definepdfjsmodule) method. This is useful if you want to use a specific version or a custom build of PDF.js.
24
24
 
@@ -169,6 +169,39 @@ function extractText(
169
169
  }>
170
170
  ```
171
171
 
172
+ ### `extractLinks`
173
+
174
+ Extracts all links from a PDF document, including hyperlinks and external URLs.
175
+
176
+ **Type Declaration**
177
+
178
+ ```ts
179
+ function extractLinks(
180
+ data: DocumentInitParameters['data'] | PDFDocumentProxy,
181
+ ): Promise<{
182
+ totalPages: number
183
+ links: string[]
184
+ }>
185
+ ```
186
+
187
+ **Example**
188
+
189
+ ```ts
190
+ import { readFile } from 'node:fs/promises'
191
+ import { extractLinks, getDocumentProxy } from 'unpdf'
192
+
193
+ // Load a PDF file
194
+ const buffer = await readFile('./document.pdf')
195
+ const pdf = await getDocumentProxy(new Uint8Array(buffer))
196
+
197
+ // Extract all links from the PDF
198
+ const { totalPages, links } = await extractLinks(pdf)
199
+
200
+ console.log(`Total pages: ${totalPages}`)
201
+ console.log(`Found ${links.length} links:`)
202
+ for (const link of links) console.log(link)
203
+ ```
204
+
172
205
  ### `extractImages`
173
206
 
174
207
  Extracts images from a specific page of a PDF document, including necessary metadata such as width, height, and calculated color channels.
package/dist/index.cjs CHANGED
@@ -182,6 +182,7 @@ async function renderPageAsImage$1(data, pageNumber, options = {}) {
182
182
  const viewport = page.getViewport({ scale: Math.max(0, scale) });
183
183
  const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);
184
184
  await page.render({
185
+ canvas: drawingContext.canvas,
185
186
  canvasContext: drawingContext.context,
186
187
  viewport
187
188
  }).promise;
@@ -203,6 +204,28 @@ async function createIsomorphicCanvasFactory(canvasImport) {
203
204
  throw new Error("Unsupported environment for canvas creation.");
204
205
  }
205
206
 
207
+ async function extractLinks$1(data) {
208
+ const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
209
+ const pageLinks = await Promise.all(
210
+ Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))
211
+ );
212
+ return {
213
+ totalPages: pdf.numPages,
214
+ links: pageLinks.flat()
215
+ };
216
+ }
217
+ async function getPageLinks(document, pageNumber) {
218
+ const page = await document.getPage(pageNumber);
219
+ const annotations = await page.getAnnotations();
220
+ const links = [];
221
+ for (const annotation of annotations) {
222
+ if (annotation.subtype === "Link" && annotation.url) {
223
+ links.push(annotation.url);
224
+ }
225
+ }
226
+ return links;
227
+ }
228
+
206
229
  async function getMeta$1(data) {
207
230
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
208
231
  const meta = await pdf.getMetadata();
@@ -252,10 +275,15 @@ const renderPageAsImage = async (...args) => {
252
275
  await resolvePDFJSImport();
253
276
  return await renderPageAsImage$1(...args);
254
277
  };
278
+ const extractLinks = async (...args) => {
279
+ await resolvePDFJSImport();
280
+ return await extractLinks$1(...args);
281
+ };
255
282
 
256
283
  exports.configureUnPDF = configureUnPDF;
257
284
  exports.definePDFJSModule = definePDFJSModule;
258
285
  exports.extractImages = extractImages;
286
+ exports.extractLinks = extractLinks;
259
287
  exports.extractText = extractText;
260
288
  exports.getDocumentProxy = getDocumentProxy;
261
289
  exports.getMeta = getMeta;
package/dist/index.d.cts CHANGED
@@ -34,6 +34,11 @@ declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFD
34
34
  height?: number;
35
35
  }): Promise<ArrayBuffer>;
36
36
 
37
+ declare function extractLinks$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
+ totalPages: number;
39
+ links: string[];
40
+ }>;
41
+
37
42
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
43
  info: Record<string, any>;
39
44
  metadata: Record<string, any>;
@@ -86,5 +91,6 @@ declare const getMeta: typeof getMeta$1;
86
91
  declare const extractText: typeof extractText$1;
87
92
  declare const extractImages: typeof extractImages$1;
88
93
  declare const renderPageAsImage: typeof renderPageAsImage$1;
94
+ declare const extractLinks: typeof extractLinks$1;
89
95
 
90
- export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
96
+ export { configureUnPDF, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.d.mts CHANGED
@@ -34,6 +34,11 @@ declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFD
34
34
  height?: number;
35
35
  }): Promise<ArrayBuffer>;
36
36
 
37
+ declare function extractLinks$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
+ totalPages: number;
39
+ links: string[];
40
+ }>;
41
+
37
42
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
43
  info: Record<string, any>;
39
44
  metadata: Record<string, any>;
@@ -86,5 +91,6 @@ declare const getMeta: typeof getMeta$1;
86
91
  declare const extractText: typeof extractText$1;
87
92
  declare const extractImages: typeof extractImages$1;
88
93
  declare const renderPageAsImage: typeof renderPageAsImage$1;
94
+ declare const extractLinks: typeof extractLinks$1;
89
95
 
90
- export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
96
+ export { configureUnPDF, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.d.ts CHANGED
@@ -34,6 +34,11 @@ declare function renderPageAsImage$1(data: DocumentInitParameters['data'] | PDFD
34
34
  height?: number;
35
35
  }): Promise<ArrayBuffer>;
36
36
 
37
+ declare function extractLinks$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
+ totalPages: number;
39
+ links: string[];
40
+ }>;
41
+
37
42
  declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
38
43
  info: Record<string, any>;
39
44
  metadata: Record<string, any>;
@@ -86,5 +91,6 @@ declare const getMeta: typeof getMeta$1;
86
91
  declare const extractText: typeof extractText$1;
87
92
  declare const extractImages: typeof extractImages$1;
88
93
  declare const renderPageAsImage: typeof renderPageAsImage$1;
94
+ declare const extractLinks: typeof extractLinks$1;
89
95
 
90
- export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
96
+ export { configureUnPDF, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/dist/index.mjs CHANGED
@@ -180,6 +180,7 @@ async function renderPageAsImage$1(data, pageNumber, options = {}) {
180
180
  const viewport = page.getViewport({ scale: Math.max(0, scale) });
181
181
  const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);
182
182
  await page.render({
183
+ canvas: drawingContext.canvas,
183
184
  canvasContext: drawingContext.context,
184
185
  viewport
185
186
  }).promise;
@@ -201,6 +202,28 @@ async function createIsomorphicCanvasFactory(canvasImport) {
201
202
  throw new Error("Unsupported environment for canvas creation.");
202
203
  }
203
204
 
205
+ async function extractLinks$1(data) {
206
+ const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
207
+ const pageLinks = await Promise.all(
208
+ Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))
209
+ );
210
+ return {
211
+ totalPages: pdf.numPages,
212
+ links: pageLinks.flat()
213
+ };
214
+ }
215
+ async function getPageLinks(document, pageNumber) {
216
+ const page = await document.getPage(pageNumber);
217
+ const annotations = await page.getAnnotations();
218
+ const links = [];
219
+ for (const annotation of annotations) {
220
+ if (annotation.subtype === "Link" && annotation.url) {
221
+ links.push(annotation.url);
222
+ }
223
+ }
224
+ return links;
225
+ }
226
+
204
227
  async function getMeta$1(data) {
205
228
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
206
229
  const meta = await pdf.getMetadata();
@@ -250,5 +273,9 @@ const renderPageAsImage = async (...args) => {
250
273
  await resolvePDFJSImport();
251
274
  return await renderPageAsImage$1(...args);
252
275
  };
276
+ const extractLinks = async (...args) => {
277
+ await resolvePDFJSImport();
278
+ return await extractLinks$1(...args);
279
+ };
253
280
 
254
- export { configureUnPDF, definePDFJSModule, extractImages, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
281
+ export { configureUnPDF, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };