@chialab/pdfjs-lib 1.0.0-alpha.17 → 1.0.0-alpha.18

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.
@@ -26199,14 +26199,16 @@ async function createTextLayer(page, {
26199
26199
  };
26200
26200
  const getCanvasContext = async (inputLang = null) => {
26201
26201
  const lang = inputLang || "";
26202
- let canvasContext2 = canvasCache.get(lang);
26203
- if (!canvasContext2) {
26204
- const { context } = await canvasFactory.create(100, 100);
26205
- context.canvas.lang = lang;
26206
- canvasContext2 = context;
26207
- canvasCache.set(lang, context);
26208
- }
26209
- return canvasContext2;
26202
+ let canvasAndContext = canvasCache.get(lang);
26203
+ if (!canvasAndContext) {
26204
+ canvasAndContext = await canvasFactory.create(
26205
+ 100,
26206
+ 100
26207
+ );
26208
+ canvasAndContext.canvas.lang = lang;
26209
+ canvasCache.set(lang, canvasAndContext);
26210
+ }
26211
+ return canvasAndContext.context;
26210
26212
  };
26211
26213
  const getAscent = (fontFamily) => {
26212
26214
  const cachedAscent = ascentCache.get(fontFamily);
@@ -26390,54 +26392,55 @@ async function createTextLayer(page, {
26390
26392
  if (!id) {
26391
26393
  return;
26392
26394
  }
26393
- const imageId = getMarkedObject(id);
26394
- if (!imageId) {
26395
- return;
26396
- }
26397
- const imgData = getObject(imageId);
26398
- if (!imgData?.bitmap && !imgData?.data) {
26399
- return;
26400
- }
26401
- const { context } = await canvasFactory.create(
26402
- imgData.width,
26403
- imgData.height
26404
- );
26405
- if (imgData.bitmap) {
26406
- context.drawImage(imgData.bitmap, 0, 0);
26407
- } else if (imgData.data) {
26408
- if (imgData.kind === ImageKind.RGB_24BPP) {
26409
- const rgbaArray = new Uint8ClampedArray(
26410
- imgData.width * imgData.height * 4
26411
- );
26412
- for (let i = 0, j = 0; i < imgData.data.length; i += 3, j += 4) {
26413
- rgbaArray[j] = imgData.data[i];
26414
- rgbaArray[j + 1] = imgData.data[i + 1];
26415
- rgbaArray[j + 2] = imgData.data[i + 2];
26416
- rgbaArray[j + 3] = 255;
26395
+ await Promise.all(
26396
+ getMarkedObjects(id).map(async (imageId) => {
26397
+ const imgData = getObject(imageId);
26398
+ if (!imgData?.bitmap && !imgData?.data) {
26399
+ return;
26417
26400
  }
26418
- const imageData = new ImageData(
26419
- rgbaArray,
26401
+ const canvasAndContext = await canvasFactory.create(
26420
26402
  imgData.width,
26421
26403
  imgData.height
26422
26404
  );
26423
- context.putImageData(imageData, 0, 0);
26424
- } else {
26425
- const imageData = new ImageData(
26426
- imgData.data,
26427
- imgData.width,
26428
- imgData.height
26405
+ if (imgData.bitmap) {
26406
+ canvasAndContext.context.drawImage(imgData.bitmap, 0, 0);
26407
+ } else if (imgData.data) {
26408
+ if (imgData.kind === ImageKind.RGB_24BPP) {
26409
+ const rgbaArray = new Uint8ClampedArray(
26410
+ imgData.width * imgData.height * 4
26411
+ );
26412
+ for (let i = 0, j = 0; i < imgData.data.length; i += 3, j += 4) {
26413
+ rgbaArray[j] = imgData.data[i];
26414
+ rgbaArray[j + 1] = imgData.data[i + 1];
26415
+ rgbaArray[j + 2] = imgData.data[i + 2];
26416
+ rgbaArray[j + 3] = 255;
26417
+ }
26418
+ const imageData = new ImageData(
26419
+ rgbaArray,
26420
+ imgData.width,
26421
+ imgData.height
26422
+ );
26423
+ canvasAndContext.context.putImageData(imageData, 0, 0);
26424
+ } else {
26425
+ const imageData = new ImageData(
26426
+ imgData.data,
26427
+ imgData.width,
26428
+ imgData.height
26429
+ );
26430
+ canvasAndContext.context.putImageData(imageData, 0, 0);
26431
+ }
26432
+ }
26433
+ const imgSrc = await toDataUrl(
26434
+ await canvasToData(canvasAndContext.canvas)
26429
26435
  );
26430
- context.putImageData(imageData, 0, 0);
26431
- }
26432
- }
26433
- const imgSrc = await toDataUrl(
26434
- await canvasToData(context.canvas)
26436
+ canvasFactory.destroy(canvasAndContext);
26437
+ const img = {
26438
+ role: "img",
26439
+ src: imgSrc
26440
+ };
26441
+ parent.children.push(img);
26442
+ })
26435
26443
  );
26436
- const img = {
26437
- role: "img",
26438
- src: imgSrc
26439
- };
26440
- parent.children.push(img);
26441
26444
  }
26442
26445
  })
26443
26446
  );
@@ -26468,12 +26471,16 @@ async function createTextLayer(page, {
26468
26471
  parent.children.push(span.node);
26469
26472
  }
26470
26473
  };
26471
- const getMarkedObject = (markedContentId) => {
26474
+ const getMarkedObjects = (markedContentId) => {
26475
+ const results = [];
26472
26476
  let currentMarkedContent = null;
26473
26477
  for (let i = 0; i < operatorList.fnArray.length; i++) {
26474
26478
  const fnId = operatorList.fnArray[i];
26475
26479
  const args = operatorList.argsArray[i];
26476
26480
  if (fnId === OPS.endMarkedContent) {
26481
+ if (currentMarkedContent === markedContentId) {
26482
+ return results;
26483
+ }
26477
26484
  currentMarkedContent = null;
26478
26485
  continue;
26479
26486
  }
@@ -26485,10 +26492,10 @@ async function createTextLayer(page, {
26485
26492
  continue;
26486
26493
  }
26487
26494
  if (fnId === OPS.paintImageXObject) {
26488
- return args[0];
26495
+ results.push(args[0]);
26489
26496
  }
26490
26497
  }
26491
- return null;
26498
+ return results;
26492
26499
  };
26493
26500
  await loadDefaultFonts();
26494
26501
  const reader = textContentSource.getReader();
@@ -26505,6 +26512,9 @@ async function createTextLayer(page, {
26505
26512
  root?.children.map((child) => renderStructTreeNode(child, rootContainer)) ?? []
26506
26513
  );
26507
26514
  ascentCache.clear();
26515
+ for (const canvasAndContext of canvasCache.values()) {
26516
+ canvasFactory.destroy(canvasAndContext);
26517
+ }
26508
26518
  canvasCache.clear();
26509
26519
  return rootContainer;
26510
26520
  }
@@ -1,4 +1,8 @@
1
1
  import type { Canvas } from '@napi-rs/canvas';
2
+ export type CanvasAndContext = {
3
+ canvas: HTMLCanvasElement;
4
+ context: CanvasRenderingContext2D;
5
+ };
2
6
  /**
3
7
  * Convert a canvas to a buffer.
4
8
  * @param canvas The canvas to convert.
@@ -11,7 +15,7 @@ export declare function canvasToData(canvas: HTMLCanvasElement | Canvas): Promis
11
15
  * @param type The type of the data url. Defaults to 'image/png'.
12
16
  * @returns A promise that resolves to the data url.
13
17
  */
14
- export declare function toDataUrl(data: Uint8Array, type?: string): Promise<string>;
18
+ export declare function toDataUrl(data: Uint8Array<ArrayBuffer>, type?: string): Promise<string>;
15
19
  /**
16
20
  * Ensure the object can be serialized and unserialized as JSON.
17
21
  * Internally it converts typed arrays to plain arrays.
@@ -26806,14 +26806,16 @@ async function createTextLayer(page, {
26806
26806
  };
26807
26807
  const getCanvasContext = async (inputLang = null) => {
26808
26808
  const lang = inputLang || "";
26809
- let canvasContext2 = canvasCache.get(lang);
26810
- if (!canvasContext2) {
26811
- const { context } = await canvasFactory.create(100, 100);
26812
- context.canvas.lang = lang;
26813
- canvasContext2 = context;
26814
- canvasCache.set(lang, context);
26815
- }
26816
- return canvasContext2;
26809
+ let canvasAndContext = canvasCache.get(lang);
26810
+ if (!canvasAndContext) {
26811
+ canvasAndContext = await canvasFactory.create(
26812
+ 100,
26813
+ 100
26814
+ );
26815
+ canvasAndContext.canvas.lang = lang;
26816
+ canvasCache.set(lang, canvasAndContext);
26817
+ }
26818
+ return canvasAndContext.context;
26817
26819
  };
26818
26820
  const getAscent = (fontFamily) => {
26819
26821
  const cachedAscent = ascentCache.get(fontFamily);
@@ -26997,54 +26999,55 @@ async function createTextLayer(page, {
26997
26999
  if (!id) {
26998
27000
  return;
26999
27001
  }
27000
- const imageId = getMarkedObject(id);
27001
- if (!imageId) {
27002
- return;
27003
- }
27004
- const imgData = getObject(imageId);
27005
- if (!imgData?.bitmap && !imgData?.data) {
27006
- return;
27007
- }
27008
- const { context } = await canvasFactory.create(
27009
- imgData.width,
27010
- imgData.height
27011
- );
27012
- if (imgData.bitmap) {
27013
- context.drawImage(imgData.bitmap, 0, 0);
27014
- } else if (imgData.data) {
27015
- if (imgData.kind === ImageKind.RGB_24BPP) {
27016
- const rgbaArray = new Uint8ClampedArray(
27017
- imgData.width * imgData.height * 4
27018
- );
27019
- for (let i = 0, j = 0; i < imgData.data.length; i += 3, j += 4) {
27020
- rgbaArray[j] = imgData.data[i];
27021
- rgbaArray[j + 1] = imgData.data[i + 1];
27022
- rgbaArray[j + 2] = imgData.data[i + 2];
27023
- rgbaArray[j + 3] = 255;
27002
+ await Promise.all(
27003
+ getMarkedObjects(id).map(async (imageId) => {
27004
+ const imgData = getObject(imageId);
27005
+ if (!imgData?.bitmap && !imgData?.data) {
27006
+ return;
27024
27007
  }
27025
- const imageData = new ImageData(
27026
- rgbaArray,
27008
+ const canvasAndContext = await canvasFactory.create(
27027
27009
  imgData.width,
27028
27010
  imgData.height
27029
27011
  );
27030
- context.putImageData(imageData, 0, 0);
27031
- } else {
27032
- const imageData = new ImageData(
27033
- imgData.data,
27034
- imgData.width,
27035
- imgData.height
27012
+ if (imgData.bitmap) {
27013
+ canvasAndContext.context.drawImage(imgData.bitmap, 0, 0);
27014
+ } else if (imgData.data) {
27015
+ if (imgData.kind === ImageKind.RGB_24BPP) {
27016
+ const rgbaArray = new Uint8ClampedArray(
27017
+ imgData.width * imgData.height * 4
27018
+ );
27019
+ for (let i = 0, j = 0; i < imgData.data.length; i += 3, j += 4) {
27020
+ rgbaArray[j] = imgData.data[i];
27021
+ rgbaArray[j + 1] = imgData.data[i + 1];
27022
+ rgbaArray[j + 2] = imgData.data[i + 2];
27023
+ rgbaArray[j + 3] = 255;
27024
+ }
27025
+ const imageData = new ImageData(
27026
+ rgbaArray,
27027
+ imgData.width,
27028
+ imgData.height
27029
+ );
27030
+ canvasAndContext.context.putImageData(imageData, 0, 0);
27031
+ } else {
27032
+ const imageData = new ImageData(
27033
+ imgData.data,
27034
+ imgData.width,
27035
+ imgData.height
27036
+ );
27037
+ canvasAndContext.context.putImageData(imageData, 0, 0);
27038
+ }
27039
+ }
27040
+ const imgSrc = await toDataUrl(
27041
+ await canvasToData(canvasAndContext.canvas)
27036
27042
  );
27037
- context.putImageData(imageData, 0, 0);
27038
- }
27039
- }
27040
- const imgSrc = await toDataUrl(
27041
- await canvasToData(context.canvas)
27043
+ canvasFactory.destroy(canvasAndContext);
27044
+ const img = {
27045
+ role: "img",
27046
+ src: imgSrc
27047
+ };
27048
+ parent.children.push(img);
27049
+ })
27042
27050
  );
27043
- const img = {
27044
- role: "img",
27045
- src: imgSrc
27046
- };
27047
- parent.children.push(img);
27048
27051
  }
27049
27052
  })
27050
27053
  );
@@ -27075,12 +27078,16 @@ async function createTextLayer(page, {
27075
27078
  parent.children.push(span.node);
27076
27079
  }
27077
27080
  };
27078
- const getMarkedObject = (markedContentId) => {
27081
+ const getMarkedObjects = (markedContentId) => {
27082
+ const results = [];
27079
27083
  let currentMarkedContent = null;
27080
27084
  for (let i = 0; i < operatorList.fnArray.length; i++) {
27081
27085
  const fnId = operatorList.fnArray[i];
27082
27086
  const args = operatorList.argsArray[i];
27083
27087
  if (fnId === OPS.endMarkedContent) {
27088
+ if (currentMarkedContent === markedContentId) {
27089
+ return results;
27090
+ }
27084
27091
  currentMarkedContent = null;
27085
27092
  continue;
27086
27093
  }
@@ -27092,10 +27099,10 @@ async function createTextLayer(page, {
27092
27099
  continue;
27093
27100
  }
27094
27101
  if (fnId === OPS.paintImageXObject) {
27095
- return args[0];
27102
+ results.push(args[0]);
27096
27103
  }
27097
27104
  }
27098
- return null;
27105
+ return results;
27099
27106
  };
27100
27107
  await loadDefaultFonts();
27101
27108
  const reader = textContentSource.getReader();
@@ -27112,6 +27119,9 @@ async function createTextLayer(page, {
27112
27119
  root?.children.map((child) => renderStructTreeNode(child, rootContainer)) ?? []
27113
27120
  );
27114
27121
  ascentCache.clear();
27122
+ for (const canvasAndContext of canvasCache.values()) {
27123
+ canvasFactory.destroy(canvasAndContext);
27124
+ }
27115
27125
  canvasCache.clear();
27116
27126
  return rootContainer;
27117
27127
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chialab/pdfjs-lib",
3
3
  "description": "A custom Mozilla's PDF.js build with better Node support and extras.",
4
- "version": "1.0.0-alpha.17",
4
+ "version": "1.0.0-alpha.18",
5
5
  "type": "module",
6
6
  "author": "Chialab <dev@chialab.it>",
7
7
  "license": "MIT",