unpdf 1.5.1 → 1.6.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/dist/index.cjs CHANGED
@@ -340,6 +340,32 @@ function parseISODateString(isoDateString) {
340
340
  }
341
341
  }
342
342
 
343
+ async function extractTextItems$1(data) {
344
+ const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
345
+ const items = await Promise.all(
346
+ Array.from({ length: pdf.numPages }, (_, i) => getPageTextItems(pdf, i + 1))
347
+ );
348
+ return { totalPages: pdf.numPages, items };
349
+ }
350
+ async function getPageTextItems(document, pageNumber) {
351
+ const page = await document.getPage(pageNumber);
352
+ const content = await page.getTextContent();
353
+ const styles = content.styles;
354
+ return content.items.filter((item) => item.str != null).map((item) => {
355
+ const [_a, _b, c, d, e, f] = item.transform;
356
+ return {
357
+ str: item.str,
358
+ x: e,
359
+ y: f,
360
+ width: item.width,
361
+ height: item.height,
362
+ fontSize: Math.hypot(c, d),
363
+ fontFamily: styles[item.fontName]?.fontFamily ?? "",
364
+ dir: item.dir,
365
+ hasEOL: item.hasEOL
366
+ };
367
+ });
368
+ }
343
369
  async function extractText$1(data, options = {}) {
344
370
  const { mergePages = false } = options;
345
371
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
@@ -372,6 +398,10 @@ const extractText = async (...args) => {
372
398
  await resolvePDFJSImport();
373
399
  return await extractText$1(...args);
374
400
  };
401
+ const extractTextItems = async (...args) => {
402
+ await resolvePDFJSImport();
403
+ return await extractTextItems$1(...args);
404
+ };
375
405
  const extractImages = async (...args) => {
376
406
  await resolvePDFJSImport();
377
407
  return await extractImages$1(...args);
@@ -391,6 +421,7 @@ exports.definePDFJSModule = definePDFJSModule;
391
421
  exports.extractImages = extractImages;
392
422
  exports.extractLinks = extractLinks;
393
423
  exports.extractText = extractText;
424
+ exports.extractTextItems = extractTextItems;
394
425
  exports.getDocumentProxy = getDocumentProxy;
395
426
  exports.getMeta = getMeta;
396
427
  exports.getResolvedPDFJS = getResolvedPDFJS;
package/dist/index.d.cts CHANGED
@@ -100,6 +100,30 @@ declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentPro
100
100
  metadata: pdfjs_dist_types_src_display_metadata.Metadata;
101
101
  }>;
102
102
 
103
+ interface StructuredTextItem {
104
+ /** Text content. */
105
+ str: string;
106
+ /** X position in PDF coordinate space (origin: bottom-left). */
107
+ x: number;
108
+ /** Y position in PDF coordinate space (origin: bottom-left). */
109
+ y: number;
110
+ /** Width in device space. */
111
+ width: number;
112
+ /** Height in device space. */
113
+ height: number;
114
+ /** Font size derived from the transformation matrix. */
115
+ fontSize: number;
116
+ /** Font family name. */
117
+ fontFamily: string;
118
+ /** Text direction: `"ltr"`, `"rtl"`, or `"ttb"`. */
119
+ dir: string;
120
+ /** Whether the text item is followed by a line break. */
121
+ hasEOL: boolean;
122
+ }
123
+ declare function extractTextItems$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
124
+ totalPages: number;
125
+ items: StructuredTextItem[][];
126
+ }>;
103
127
  declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, options?: {
104
128
  mergePages?: false;
105
129
  }): Promise<{
@@ -149,8 +173,10 @@ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload
149
173
 
150
174
  declare const getMeta: typeof getMeta$1;
151
175
  declare const extractText: typeof extractText$1;
176
+ declare const extractTextItems: typeof extractTextItems$1;
152
177
  declare const extractImages: typeof extractImages$1;
153
178
  declare const renderPageAsImage: typeof renderPageAsImage$1;
154
179
  declare const extractLinks: typeof extractLinks$1;
155
180
 
156
- export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
181
+ export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, extractTextItems, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
182
+ export type { StructuredTextItem };
package/dist/index.d.mts CHANGED
@@ -100,6 +100,30 @@ declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentPro
100
100
  metadata: pdfjs_dist_types_src_display_metadata.Metadata;
101
101
  }>;
102
102
 
103
+ interface StructuredTextItem {
104
+ /** Text content. */
105
+ str: string;
106
+ /** X position in PDF coordinate space (origin: bottom-left). */
107
+ x: number;
108
+ /** Y position in PDF coordinate space (origin: bottom-left). */
109
+ y: number;
110
+ /** Width in device space. */
111
+ width: number;
112
+ /** Height in device space. */
113
+ height: number;
114
+ /** Font size derived from the transformation matrix. */
115
+ fontSize: number;
116
+ /** Font family name. */
117
+ fontFamily: string;
118
+ /** Text direction: `"ltr"`, `"rtl"`, or `"ttb"`. */
119
+ dir: string;
120
+ /** Whether the text item is followed by a line break. */
121
+ hasEOL: boolean;
122
+ }
123
+ declare function extractTextItems$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
124
+ totalPages: number;
125
+ items: StructuredTextItem[][];
126
+ }>;
103
127
  declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, options?: {
104
128
  mergePages?: false;
105
129
  }): Promise<{
@@ -149,8 +173,10 @@ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload
149
173
 
150
174
  declare const getMeta: typeof getMeta$1;
151
175
  declare const extractText: typeof extractText$1;
176
+ declare const extractTextItems: typeof extractTextItems$1;
152
177
  declare const extractImages: typeof extractImages$1;
153
178
  declare const renderPageAsImage: typeof renderPageAsImage$1;
154
179
  declare const extractLinks: typeof extractLinks$1;
155
180
 
156
- export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
181
+ export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, extractTextItems, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
182
+ export type { StructuredTextItem };
package/dist/index.d.ts CHANGED
@@ -100,6 +100,30 @@ declare function getMeta$1(data: DocumentInitParameters['data'] | PDFDocumentPro
100
100
  metadata: pdfjs_dist_types_src_display_metadata.Metadata;
101
101
  }>;
102
102
 
103
+ interface StructuredTextItem {
104
+ /** Text content. */
105
+ str: string;
106
+ /** X position in PDF coordinate space (origin: bottom-left). */
107
+ x: number;
108
+ /** Y position in PDF coordinate space (origin: bottom-left). */
109
+ y: number;
110
+ /** Width in device space. */
111
+ width: number;
112
+ /** Height in device space. */
113
+ height: number;
114
+ /** Font size derived from the transformation matrix. */
115
+ fontSize: number;
116
+ /** Font family name. */
117
+ fontFamily: string;
118
+ /** Text direction: `"ltr"`, `"rtl"`, or `"ttb"`. */
119
+ dir: string;
120
+ /** Whether the text item is followed by a line break. */
121
+ hasEOL: boolean;
122
+ }
123
+ declare function extractTextItems$1(data: DocumentInitParameters['data'] | PDFDocumentProxy): Promise<{
124
+ totalPages: number;
125
+ items: StructuredTextItem[][];
126
+ }>;
103
127
  declare function extractText$1(data: DocumentInitParameters['data'] | PDFDocumentProxy, options?: {
104
128
  mergePages?: false;
105
129
  }): Promise<{
@@ -149,8 +173,10 @@ declare function resolvePDFJSImport(pdfjsResolver?: () => Promise<any>, { reload
149
173
 
150
174
  declare const getMeta: typeof getMeta$1;
151
175
  declare const extractText: typeof extractText$1;
176
+ declare const extractTextItems: typeof extractTextItems$1;
152
177
  declare const extractImages: typeof extractImages$1;
153
178
  declare const renderPageAsImage: typeof renderPageAsImage$1;
154
179
  declare const extractLinks: typeof extractLinks$1;
155
180
 
156
- export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
181
+ export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, extractTextItems, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
182
+ export type { StructuredTextItem };
package/dist/index.mjs CHANGED
@@ -338,6 +338,32 @@ function parseISODateString(isoDateString) {
338
338
  }
339
339
  }
340
340
 
341
+ async function extractTextItems$1(data) {
342
+ const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
343
+ const items = await Promise.all(
344
+ Array.from({ length: pdf.numPages }, (_, i) => getPageTextItems(pdf, i + 1))
345
+ );
346
+ return { totalPages: pdf.numPages, items };
347
+ }
348
+ async function getPageTextItems(document, pageNumber) {
349
+ const page = await document.getPage(pageNumber);
350
+ const content = await page.getTextContent();
351
+ const styles = content.styles;
352
+ return content.items.filter((item) => item.str != null).map((item) => {
353
+ const [_a, _b, c, d, e, f] = item.transform;
354
+ return {
355
+ str: item.str,
356
+ x: e,
357
+ y: f,
358
+ width: item.width,
359
+ height: item.height,
360
+ fontSize: Math.hypot(c, d),
361
+ fontFamily: styles[item.fontName]?.fontFamily ?? "",
362
+ dir: item.dir,
363
+ hasEOL: item.hasEOL
364
+ };
365
+ });
366
+ }
341
367
  async function extractText$1(data, options = {}) {
342
368
  const { mergePages = false } = options;
343
369
  const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
@@ -370,6 +396,10 @@ const extractText = async (...args) => {
370
396
  await resolvePDFJSImport();
371
397
  return await extractText$1(...args);
372
398
  };
399
+ const extractTextItems = async (...args) => {
400
+ await resolvePDFJSImport();
401
+ return await extractTextItems$1(...args);
402
+ };
373
403
  const extractImages = async (...args) => {
374
404
  await resolvePDFJSImport();
375
405
  return await extractImages$1(...args);
@@ -383,4 +413,4 @@ const extractLinks = async (...args) => {
383
413
  return await extractLinks$1(...args);
384
414
  };
385
415
 
386
- export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
416
+ export { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, extractTextItems, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "unpdf",
3
3
  "type": "module",
4
- "version": "1.5.1",
4
+ "version": "1.6.0",
5
5
  "packageManager": "pnpm@10.33.0",
6
6
  "description": "PDF extraction and rendering across all JavaScript runtimes",
7
7
  "author": "Johann Schopplich <hello@johannschopplich.com>",