@adnsistemas/pdf-lib 2.6.4 → 2.7.1

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 (66) hide show
  1. package/README.md +44 -0
  2. package/cjs/api/PDFDocument.d.ts +22 -0
  3. package/cjs/api/PDFDocument.d.ts.map +1 -1
  4. package/cjs/api/PDFDocument.js +45 -0
  5. package/cjs/api/PDFDocument.js.map +1 -1
  6. package/cjs/api/PDFFont.d.ts +1 -1
  7. package/cjs/api/PDFFont.d.ts.map +1 -1
  8. package/cjs/api/PDFFont.js +3 -5
  9. package/cjs/api/PDFFont.js.map +1 -1
  10. package/cjs/core/PDFContext.d.ts +2 -0
  11. package/cjs/core/PDFContext.d.ts.map +1 -1
  12. package/cjs/core/PDFContext.js +43 -2
  13. package/cjs/core/PDFContext.js.map +1 -1
  14. package/cjs/core/objects/PDFArray.d.ts +1 -0
  15. package/cjs/core/objects/PDFArray.d.ts.map +1 -1
  16. package/cjs/core/objects/PDFArray.js +7 -0
  17. package/cjs/core/objects/PDFArray.js.map +1 -1
  18. package/cjs/core/objects/PDFRawStream.d.ts.map +1 -1
  19. package/cjs/core/objects/PDFRawStream.js +1 -0
  20. package/cjs/core/objects/PDFRawStream.js.map +1 -1
  21. package/cjs/utils/png.js +1 -1
  22. package/cjs/utils/png.js.map +1 -1
  23. package/dist/pdf-lib.esm.js +224 -45
  24. package/dist/pdf-lib.esm.js.map +1 -1
  25. package/dist/pdf-lib.esm.min.js +3 -3
  26. package/dist/pdf-lib.esm.min.js.map +1 -1
  27. package/dist/pdf-lib.js +224 -45
  28. package/dist/pdf-lib.js.map +1 -1
  29. package/dist/pdf-lib.min.js +2 -2
  30. package/dist/pdf-lib.min.js.map +1 -1
  31. package/es/api/PDFDocument.d.ts +22 -0
  32. package/es/api/PDFDocument.d.ts.map +1 -1
  33. package/es/api/PDFDocument.js +45 -0
  34. package/es/api/PDFDocument.js.map +1 -1
  35. package/es/api/PDFFont.d.ts +1 -1
  36. package/es/api/PDFFont.d.ts.map +1 -1
  37. package/es/api/PDFFont.js +3 -5
  38. package/es/api/PDFFont.js.map +1 -1
  39. package/es/core/PDFContext.d.ts +2 -0
  40. package/es/core/PDFContext.d.ts.map +1 -1
  41. package/es/core/PDFContext.js +43 -2
  42. package/es/core/PDFContext.js.map +1 -1
  43. package/es/core/objects/PDFArray.d.ts +1 -0
  44. package/es/core/objects/PDFArray.d.ts.map +1 -1
  45. package/es/core/objects/PDFArray.js +7 -0
  46. package/es/core/objects/PDFArray.js.map +1 -1
  47. package/es/core/objects/PDFRawStream.d.ts.map +1 -1
  48. package/es/core/objects/PDFRawStream.js +1 -0
  49. package/es/core/objects/PDFRawStream.js.map +1 -1
  50. package/es/utils/png.js +1 -1
  51. package/es/utils/png.js.map +1 -1
  52. package/package.json +4 -3
  53. package/src/api/PDFDocument.ts +60 -0
  54. package/src/api/PDFFont.ts +3 -5
  55. package/src/core/PDFContext.ts +42 -1
  56. package/src/core/objects/PDFArray.ts +8 -0
  57. package/src/core/objects/PDFRawStream.ts +1 -0
  58. package/src/utils/png.ts +1 -1
  59. package/ts3.4/cjs/api/PDFDocument.d.ts +22 -0
  60. package/ts3.4/cjs/api/PDFFont.d.ts +1 -1
  61. package/ts3.4/cjs/core/PDFContext.d.ts +2 -0
  62. package/ts3.4/cjs/core/objects/PDFArray.d.ts +1 -0
  63. package/ts3.4/es/api/PDFDocument.d.ts +22 -0
  64. package/ts3.4/es/api/PDFFont.d.ts +1 -1
  65. package/ts3.4/es/core/PDFContext.d.ts +2 -0
  66. package/ts3.4/es/core/objects/PDFArray.d.ts +1 -0
package/dist/pdf-lib.js CHANGED
@@ -8341,9 +8341,11 @@
8341
8341
  return this.array.length;
8342
8342
  }
8343
8343
  push(object) {
8344
+ this.registerChange();
8344
8345
  this.array.push(object);
8345
8346
  }
8346
8347
  insert(index, object) {
8348
+ this.registerChange();
8347
8349
  this.array.splice(index, 0, object);
8348
8350
  }
8349
8351
  indexOf(object) {
@@ -8351,9 +8353,11 @@
8351
8353
  return index === -1 ? undefined : index;
8352
8354
  }
8353
8355
  remove(index) {
8356
+ this.registerChange();
8354
8357
  this.array.splice(index, 1);
8355
8358
  }
8356
8359
  set(idx, object) {
8360
+ this.registerChange();
8357
8361
  this.array[idx] = object;
8358
8362
  }
8359
8363
  get(index) {
@@ -8428,6 +8432,9 @@
8428
8432
  }
8429
8433
  }
8430
8434
  }
8435
+ registerChange() {
8436
+ this.context.registerObjectChange(this);
8437
+ }
8431
8438
  }
8432
8439
  PDFArray.withContext = (context) => new PDFArray(context);
8433
8440
 
@@ -8917,6 +8924,7 @@
8917
8924
  return this.contents.length;
8918
8925
  }
8919
8926
  updateContents(contents) {
8927
+ this.dict.registerChange();
8920
8928
  this.contents = contents;
8921
8929
  }
8922
8930
  }
@@ -9533,8 +9541,49 @@
9533
9541
  return `${prefix}-${Math.floor(this.rng.nextInt() * Math.pow(10, suffixLength))}`;
9534
9542
  }
9535
9543
  registerObjectChange(obj) {
9536
- if (this.snapshot)
9537
- this.snapshot.markObjForSave(obj);
9544
+ if (!this.snapshot)
9545
+ return;
9546
+ const ref = this.getObjectRef(obj);
9547
+ if (ref) {
9548
+ this.snapshot.markRefForSave(ref);
9549
+ return;
9550
+ }
9551
+ const containingRef = this.findContainingIndirectObject(obj);
9552
+ if (containingRef) {
9553
+ this.snapshot.markRefForSave(containingRef);
9554
+ }
9555
+ }
9556
+ findContainingIndirectObject(target) {
9557
+ const entries = Array.from(this.indirectObjects.entries());
9558
+ for (let idx = 0, len = entries.length; idx < len; idx++) {
9559
+ const [ref, object] = entries[idx];
9560
+ if (this.objectContains(object, target)) {
9561
+ return ref;
9562
+ }
9563
+ }
9564
+ return undefined;
9565
+ }
9566
+ objectContains(container, target) {
9567
+ if (container === target)
9568
+ return true;
9569
+ if (container instanceof PDFDict) {
9570
+ const values = container.values();
9571
+ for (let i = 0, len = values.length; i < len; i++) {
9572
+ if (this.objectContains(values[i], target))
9573
+ return true;
9574
+ }
9575
+ }
9576
+ else if (container instanceof PDFArray) {
9577
+ for (let i = 0, len = container.size(); i < len; i++) {
9578
+ if (this.objectContains(container.get(i), target))
9579
+ return true;
9580
+ }
9581
+ }
9582
+ else if (container instanceof PDFStream) {
9583
+ if (this.objectContains(container.dict, target))
9584
+ return true;
9585
+ }
9586
+ return false;
9538
9587
  }
9539
9588
  getObjectVersions(ref) {
9540
9589
  if (!this.preserveObjectsVersions)
@@ -13331,7 +13380,7 @@ end\
13331
13380
  else if(depth== 2) for(var x=0; x<w; x++) { var gr= 85*((data[off+(x>>>2)]>>>(6 -((x&3)<<1)))& 3), al=(gr==tr* 85)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; }
13332
13381
  else if(depth== 4) for(var x=0; x<w; x++) { var gr= 17*((data[off+(x>>>1)]>>>(4 -((x&1)<<2)))&15), al=(gr==tr* 17)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; }
13333
13382
  else if(depth== 8) for(var x=0; x<w; x++) { var gr=data[off+ x], al=(gr ==tr)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; }
13334
- else if(depth==16) for(var x=0; x<w; x++) { var gr=data[off+(x<<1)], al=(rs(data,off+(x<<i))==tr)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; }
13383
+ else if(depth==16) for(var x=0; x<w; x++) { var gr=data[off+(x<<1)], al=(rs(data,off+(x<<1))==tr)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; }
13335
13384
  }
13336
13385
  }
13337
13386
  //console.log(Date.now()-time);
@@ -13357,6 +13406,7 @@ end\
13357
13406
  //console.log(type,len);
13358
13407
 
13359
13408
  if (type=="IHDR") { UPNG.decode._IHDR(data, offset, out); }
13409
+ else if(type=="CgBI") { out.tabs[type] = data.slice(offset,offset+4); }
13360
13410
  else if(type=="IDAT") {
13361
13411
  for(var i=0; i<len; i++) dd[doff+i] = data[offset+i];
13362
13412
  doff += len;
@@ -13386,11 +13436,16 @@ end\
13386
13436
  out.tabs[type] = [];
13387
13437
  for(var i=0; i<8; i++) out.tabs[type].push(bin.readUint(data, offset+i*4));
13388
13438
  }
13389
- else if(type=="tEXt") {
13439
+ else if(type=="tEXt" || type=="zTXt") {
13390
13440
  if(out.tabs[type]==null) out.tabs[type] = {};
13391
13441
  var nz = bin.nextZero(data, offset);
13392
13442
  var keyw = bin.readASCII(data, offset, nz-offset);
13393
- var text = bin.readASCII(data, nz+1, offset+len-nz-1);
13443
+ var text, tl=offset+len-nz-1;
13444
+ if(type=="tEXt") text = bin.readASCII(data, nz+1, tl);
13445
+ else {
13446
+ var bfr = UPNG.decode._inflate(data.slice(nz+2,nz+2+tl));
13447
+ text = bin.readUTF8(bfr,0,bfr.length);
13448
+ }
13394
13449
  out.tabs[type][keyw] = text;
13395
13450
  }
13396
13451
  else if(type=="iTXt") {
@@ -13398,12 +13453,17 @@ end\
13398
13453
  var nz = 0, off = offset;
13399
13454
  nz = bin.nextZero(data, off);
13400
13455
  var keyw = bin.readASCII(data, off, nz-off); off = nz + 1;
13401
- data[off]; data[off+1]; off+=2;
13456
+ var cflag = data[off]; data[off+1]; off+=2;
13402
13457
  nz = bin.nextZero(data, off);
13403
13458
  bin.readASCII(data, off, nz-off); off = nz + 1;
13404
13459
  nz = bin.nextZero(data, off);
13405
13460
  bin.readUTF8(data, off, nz-off); off = nz + 1;
13406
- var text = bin.readUTF8(data, off, len-(off-offset));
13461
+ var text, tl=len-(off-offset);
13462
+ if(cflag==0) text = bin.readUTF8(data, off, tl);
13463
+ else {
13464
+ var bfr = UPNG.decode._inflate(data.slice(off,off+tl));
13465
+ text = bin.readUTF8(bfr,0,bfr.length);
13466
+ }
13407
13467
  out.tabs[type][keyw] = text;
13408
13468
  }
13409
13469
  else if(type=="PLTE") {
@@ -13430,12 +13490,12 @@ end\
13430
13490
  else if(type=="IEND") {
13431
13491
  break;
13432
13492
  }
13433
- //else { log("unknown chunk type", type, len); }
13493
+ //else { console.log("unknown chunk type", type, len); out.tabs[type]=data.slice(offset,offset+len); }
13434
13494
  offset += len;
13435
13495
  bin.readUint(data, offset); offset += 4;
13436
13496
  }
13437
13497
  if(foff!=0) { var fr = out.frames[out.frames.length-1];
13438
- fr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height); foff=0;
13498
+ fr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);
13439
13499
  }
13440
13500
  out.data = UPNG.decode._decompress(out, dd, out.width, out.height);
13441
13501
 
@@ -13445,7 +13505,8 @@ end\
13445
13505
 
13446
13506
  UPNG.decode._decompress = function(out, dd, w, h) {
13447
13507
  var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), buff = new Uint8Array((bpl+1+out.interlace)*h);
13448
- dd = UPNG.decode._inflate(dd,buff);
13508
+ if(out.tabs["CgBI"]) dd = UPNG.inflateRaw(dd,buff);
13509
+ else dd = UPNG.decode._inflate(dd,buff);
13449
13510
  if (out.interlace==0) dd = UPNG.decode._filterZero(dd, out, 0, w, h);
13450
13511
  else if(out.interlace==1) dd = UPNG.decode._readInterlace(dd, out);
13451
13512
  //console.log(Date.now()-time);
@@ -13455,7 +13516,7 @@ end\
13455
13516
  UPNG.decode._inflate = function(data, buff) { var out=UPNG["inflateRaw"](new Uint8Array(data.buffer, 2,data.length-6),buff); return out; };
13456
13517
  UPNG.inflateRaw=function(){var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;
13457
13518
  if(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;
13458
- if(Z)W=new R(N.length>>>2<<3);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);
13519
+ if(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);
13459
13520
  var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;
13460
13521
  w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1;}if(m==2){J=A(N,d,5)+257;
13461
13522
  h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0;}for(var c=0;
@@ -13552,7 +13613,7 @@ end\
13552
13613
  var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), paeth = UPNG.decode._paeth;
13553
13614
  bpp = Math.ceil(bpp/8);
13554
13615
 
13555
- var i=0, di=1, type=data[off], x=0;
13616
+ var i,di, type=data[off], x=0;
13556
13617
 
13557
13618
  if(type>1) data[off]=[0,0,1][type-2];
13558
13619
  if(type==3) for(x=bpp; x<bpl; x++) data[x+1] = (data[x+1] + (data[x+1-bpp]>>>1) )&255;
@@ -13652,12 +13713,13 @@ end\
13652
13713
 
13653
13714
 
13654
13715
 
13716
+
13655
13717
  UPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte)
13656
13718
  {
13657
13719
  if(ps==null) ps=0;
13658
13720
  if(forbidPlte==null) forbidPlte = false;
13659
13721
 
13660
- var nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]);
13722
+ var nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte,false]);
13661
13723
  UPNG.encode.compressPNG(nimg, -1);
13662
13724
 
13663
13725
  return UPNG.encode._main(nimg, w, h, dels, tabs);
@@ -13805,7 +13867,7 @@ end\
13805
13867
  UPNG.encode.compress = function(bufs, w, h, ps, prms) // prms: onlyBlend, minBits, forbidPlte
13806
13868
  {
13807
13869
  //var time = Date.now();
13808
- var onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4];
13870
+ var onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4], dither=prms[5];
13809
13871
 
13810
13872
  var ctype = 6, depth = 8, alphaAnd=255;
13811
13873
 
@@ -13821,17 +13883,27 @@ end\
13821
13883
  var frms = UPNG.encode.framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);
13822
13884
  //console.log("framize", Date.now()-time); time = Date.now();
13823
13885
 
13824
- var cmap={}, plte=[], inds=[];
13886
+ var cmap={}, plte=[], inds=[];
13825
13887
 
13826
13888
  if(ps!=0) {
13827
13889
  var nbufs = []; for(var i=0; i<frms.length; i++) nbufs.push(frms[i].img.buffer);
13828
13890
 
13829
- var abuf = UPNG.encode.concatRGBA(nbufs), qres = UPNG.quantize(abuf, ps);
13830
- var cof = 0, bb = new Uint8Array(qres.abuf);
13831
- for(var i=0; i<frms.length; i++) { var ti=frms[i].img, bln=ti.length; inds.push(new Uint8Array(qres.inds.buffer, cof>>2, bln>>2));
13832
- for(var j=0; j<bln; j+=4) { ti[j]=bb[cof+j]; ti[j+1]=bb[cof+j+1]; ti[j+2]=bb[cof+j+2]; ti[j+3]=bb[cof+j+3]; } cof+=bln; }
13891
+ var abuf = UPNG.encode.concatRGBA(nbufs), qres = UPNG.quantize(abuf, ps);
13833
13892
 
13834
13893
  for(var i=0; i<qres.plte.length; i++) plte.push(qres.plte[i].est.rgba);
13894
+
13895
+ var cof = 0;
13896
+ for(var i=0; i<frms.length; i++) {
13897
+ var frm=frms[i], bln=frm.img.length, ind = new Uint8Array(qres.inds.buffer, cof>>2, bln>>2); inds.push(ind);
13898
+ var bb = new Uint8Array(qres.abuf,cof,bln);
13899
+
13900
+ //console.log(frm.img, frm.width, frm.height);
13901
+ //var time = Date.now();
13902
+ if(dither) UPNG.encode.dither(frm.img, frm.rect.width, frm.rect.height, plte, bb, ind);
13903
+ //console.log(Date.now()-time);
13904
+ frm.img.set(bb); cof+=bln;
13905
+ }
13906
+
13835
13907
  //console.log("quantize", Date.now()-time); time = Date.now();
13836
13908
  }
13837
13909
  else {
@@ -14023,8 +14095,8 @@ end\
14023
14095
  else if(h*bpl>500000 || bpp==1) ftry=[0];
14024
14096
  var opts; if(levelZero) opts={level:0};
14025
14097
 
14026
- var CMPR = (levelZero && UZIP!=null) ? UZIP : pako$1;
14027
14098
 
14099
+ var CMPR = (data.length>10e6 && UZIP!=null) ? UZIP : pako$1;
14028
14100
  for(var i=0; i<ftry.length; i++) {
14029
14101
  for(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);
14030
14102
  //var nimg = new Uint8Array(data.length);
@@ -14034,6 +14106,7 @@ end\
14034
14106
  //console.log(crc, UZIP.adler(data,2,data.length-6));
14035
14107
  fls.push(CMPR["deflate"](data,opts));
14036
14108
  }
14109
+
14037
14110
  var ti, tsize=1e9;
14038
14111
  for(var i=0; i<fls.length; i++) if(fls[i].length<tsize) { ti=i; tsize=fls[i].length; }
14039
14112
  return fls[ti];
@@ -14088,27 +14161,30 @@ end\
14088
14161
 
14089
14162
  UPNG.quantize = function(abuf, ps)
14090
14163
  {
14091
- var oimg = new Uint8Array(abuf), nimg = oimg.slice(0), nimg32 = new Uint32Array(nimg.buffer);
14164
+ var sb = new Uint8Array(abuf), tb = sb.slice(0), tb32 = new Uint32Array(tb.buffer);
14092
14165
 
14093
- var KD = UPNG.quantize.getKDtree(nimg, ps);
14166
+ var KD = UPNG.quantize.getKDtree(tb, ps);
14094
14167
  var root = KD[0], leafs = KD[1];
14095
14168
 
14096
- UPNG.quantize.planeDst;
14097
- var sb = oimg, tb = nimg32, len=sb.length;
14098
-
14099
- var inds = new Uint8Array(oimg.length>>2);
14100
- for(var i=0; i<len; i+=4) {
14101
- var r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);
14102
-
14103
- // exact, but too slow :(
14104
- var nd = UPNG.quantize.getNearest(root, r, g, b, a);
14105
- //var nd = root;
14106
- //while(nd.left) nd = (planeDst(nd.est,r,g,b,a)<=0) ? nd.left : nd.right;
14169
+ var planeDst = UPNG.quantize.planeDst;
14170
+ var len=sb.length;
14107
14171
 
14108
- inds[i>>2] = nd.ind;
14109
- tb[i>>2] = nd.est.rgba;
14110
- }
14111
- return { abuf:nimg.buffer, inds:inds, plte:leafs };
14172
+ var inds = new Uint8Array(len>>2), nd;
14173
+ if(sb.length<20e6) // precise, but slow :(
14174
+ for(var i=0; i<len; i+=4) {
14175
+ var r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);
14176
+
14177
+ nd = UPNG.quantize.getNearest(root, r, g, b, a);
14178
+ inds[i>>2] = nd.ind; tb32[i>>2] = nd.est.rgba;
14179
+ }
14180
+ else
14181
+ for(var i=0; i<len; i+=4) {
14182
+ var r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);
14183
+
14184
+ nd = root; while(nd.left) nd = (planeDst(nd.est,r,g,b,a)<=0) ? nd.left : nd.right;
14185
+ inds[i>>2] = nd.ind; tb32[i>>2] = nd.est.rgba;
14186
+ }
14187
+ return { abuf:tb.buffer, inds:inds, plte:leafs };
14112
14188
  };
14113
14189
 
14114
14190
  UPNG.quantize.getKDtree = function(nimg, ps, err) {
@@ -14216,12 +14292,12 @@ end\
14216
14292
  ];
14217
14293
 
14218
14294
  var A = Rj, M = UPNG.M4;
14219
- var b = [0.5,0.5,0.5,0.5], mi = 0, tmi = 0;
14295
+ var b = [Math.random(),Math.random(),Math.random(),Math.random()], mi = 0, tmi = 0;
14220
14296
 
14221
14297
  if(N!=0)
14222
- for(var i=0; i<10; i++) {
14298
+ for(var i=0; i<16; i++) {
14223
14299
  b = M.multVec(A, b); tmi = Math.sqrt(M.dot(b,b)); b = M.sml(1/tmi, b);
14224
- if(Math.abs(tmi-mi)<1e-9) break; mi = tmi;
14300
+ if(i!=0 && Math.abs(tmi-mi)<1e-9) break; mi = tmi;
14225
14301
  }
14226
14302
  //b = [0,0,1,0]; mi=N;
14227
14303
  var q = [m0*iN, m1*iN, m2*iN, m3*iN];
@@ -14258,6 +14334,66 @@ end\
14258
14334
  return nimg.buffer;
14259
14335
  };
14260
14336
 
14337
+ UPNG.encode.dither = function(sb, w, h, plte, tb, oind) {
14338
+
14339
+ function addErr(er, tg, ti, f) {
14340
+ tg[ti]+=(er[0]*f)>>4; tg[ti+1]+=(er[1]*f)>>4; tg[ti+2]+=(er[2]*f)>>4; tg[ti+3]+=(er[3]*f)>>4;
14341
+ }
14342
+ function N(x) { return Math.max(0, Math.min(255, x)); }
14343
+ function D(a,b) { var dr=a[0]-b[0], dg=a[1]-b[1], db=a[2]-b[2], da=a[3]-b[3]; return (dr*dr + dg*dg + db*db + da*da); }
14344
+
14345
+
14346
+ var pc=plte.length, nplt = [];
14347
+ for(var i=0; i<pc; i++) {
14348
+ var c = plte[i];
14349
+ nplt.push([((c>>>0)&255), ((c>>>8)&255), ((c>>>16)&255), ((c>>>24)&255)]);
14350
+ }
14351
+ for(var i=0; i<pc; i++) {
14352
+ var ne=0xffffffff, ni=0;
14353
+ for(var j=0; j<pc; j++) { var ce=D(nplt[i],nplt[j]); if(j!=i && ce<ne) { ne=ce; ni=j; } }
14354
+ }
14355
+
14356
+ var tb32 = new Uint32Array(tb.buffer);
14357
+ var err = new Int16Array(w*h*4);
14358
+
14359
+ for(var y=0; y<h; y++) {
14360
+ for(var x=0; x<w; x++) {
14361
+ var i = (y*w+x)*4;
14362
+
14363
+ var cc = [N(sb[i]+err[i]), N(sb[i+1]+err[i+1]), N(sb[i+2]+err[i+2]), N(sb[i+3]+err[i+3])];
14364
+
14365
+ var ni=0, nd = 0xffffff;
14366
+ for(var j=0; j<pc; j++) {
14367
+ var cd = D(cc,nplt[j]);
14368
+ if(cd<nd) { nd=cd; ni=j; }
14369
+ }
14370
+
14371
+ //ni = oind[i>>2];
14372
+ var nc = nplt[ni];
14373
+ var er = [cc[0]-nc[0], cc[1]-nc[1], cc[2]-nc[2], cc[3]-nc[3]];
14374
+
14375
+ //addErr(er, err, i+4, 16);
14376
+
14377
+ //*
14378
+ if(x!=w-1) addErr(er, err, i+4 , 7);
14379
+ if(y!=h-1) {
14380
+ if(x!= 0) addErr(er, err, i+4*w-4, 3);
14381
+ addErr(er, err, i+4*w , 5);
14382
+ if(x!=w-1) addErr(er, err, i+4*w+4, 1); //*/
14383
+ }
14384
+
14385
+ oind[i>>2] = ni; tb32[i>>2] = plte[ni];
14386
+ }
14387
+ }
14388
+ };
14389
+ if (typeof module !== 'undefined') {
14390
+ if (exports && exports.default) {
14391
+ module.exports = exports.default;
14392
+ } else if (exports) {
14393
+ module.exports = exports;
14394
+ }
14395
+ }
14396
+
14261
14397
  const getImageType = (ctype) => {
14262
14398
  if (ctype === 0)
14263
14399
  return PngType.Greyscale;
@@ -30170,7 +30306,7 @@ end\
30170
30306
  */
30171
30307
  class PDFFont {
30172
30308
  constructor(ref, doc, embedder) {
30173
- this.modified = true;
30309
+ this.alreadyEmbedded = false;
30174
30310
  assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]);
30175
30311
  assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]);
30176
30312
  assertIs(embedder, 'embedder', [
@@ -30194,7 +30330,6 @@ end\
30194
30330
  */
30195
30331
  encodeText(text) {
30196
30332
  assertIs(text, 'text', ['string']);
30197
- this.modified = true;
30198
30333
  return this.embedder.encodeText(text);
30199
30334
  }
30200
30335
  /**
@@ -30269,10 +30404,9 @@ end\
30269
30404
  */
30270
30405
  embed() {
30271
30406
  return __awaiter(this, void 0, void 0, function* () {
30272
- // TODO: Cleanup orphan embedded objects if a font is embedded multiple times...
30273
- if (this.modified) {
30407
+ if (!this.alreadyEmbedded) {
30274
30408
  yield this.embedder.embedIntoContext(this.doc.context, this.ref);
30275
- this.modified = false;
30409
+ this.alreadyEmbedded = true;
30276
30410
  }
30277
30411
  });
30278
30412
  }
@@ -37194,6 +37328,51 @@ end\
37194
37328
  .map((value) => value[1])
37195
37329
  .filter((ov) => ov.actual || ov.previous.length);
37196
37330
  }
37331
+ /**
37332
+ * Saves the current changes to the document as an incremental update, returns the full document,
37333
+ * like save method, and modifies the internal state to be able to continue editing the document
37334
+ * for another incremental update.
37335
+ * This allows you to save multiple incremental updates without reloading the PDF.
37336
+ *
37337
+ * For example:
37338
+ * ```js
37339
+ * const pdfDoc = await PDFDocument.load(pdfBytes, { forIncrementalUpdate: true })
37340
+ *
37341
+ * const page = pdfDoc.getPage(0)
37342
+ * page.drawText('First update')
37343
+ * const firstsave = await pdfDoc.saveAndContinue()
37344
+ *
37345
+ * page.drawText('Second update', { y: 100 })
37346
+ * const secondsave = await pdfDoc.saveAndContinue()
37347
+ * ```
37348
+ *
37349
+ * @param options The options to be used when saving changes.
37350
+ * @returns Resolves with the complete PDF bytes including all updates.
37351
+ */
37352
+ saveAndContinue(options = {}) {
37353
+ return __awaiter(this, void 0, void 0, function* () {
37354
+ if (!this.context.pdfFileDetails.originalBytes || !this.context.snapshot) {
37355
+ throw new Error('saveAndContinue() requires the document to be loaded with forIncrementalUpdate: true');
37356
+ }
37357
+ const originalBytes = this.context.pdfFileDetails.originalBytes;
37358
+ const incrementalBytes = yield this.saveIncremental(this.context.snapshot, options);
37359
+ const newPdfBytes = new Uint8Array(originalBytes.byteLength + incrementalBytes.byteLength);
37360
+ newPdfBytes.set(originalBytes);
37361
+ newPdfBytes.set(incrementalBytes, originalBytes.byteLength);
37362
+ this.context.pdfFileDetails.originalBytes = newPdfBytes;
37363
+ this.context.pdfFileDetails.pdfSize = newPdfBytes.byteLength;
37364
+ const incrementalStr = new TextDecoder('latin1').decode(incrementalBytes);
37365
+ const startxrefMatch = incrementalStr.match(/startxref\s+(\d+)/);
37366
+ if (startxrefMatch) {
37367
+ this.context.pdfFileDetails.prevStartXRef = parseInt(startxrefMatch[1], 10);
37368
+ }
37369
+ else {
37370
+ this.context.pdfFileDetails.prevStartXRef = originalBytes.byteLength;
37371
+ }
37372
+ this.context.snapshot = this.takeSnapshot();
37373
+ return newPdfBytes;
37374
+ });
37375
+ }
37197
37376
  prepareForSave(options) {
37198
37377
  return __awaiter(this, void 0, void 0, function* () {
37199
37378
  const { addDefaultPage = true, updateFieldAppearances = true } = options;