From 4091fbf01e915e49c12e7a807608810f2271ab4a Mon Sep 17 00:00:00 2001 From: Antony Date: Sun, 1 Oct 2023 21:31:36 +0800 Subject: [PATCH 1/2] Fix invalid string length when saving large PDF Fixes #1724 --- src/jspdf.js | 58 ++++++++++++++---- test/reference/autoPaging10Pages.pdf | Bin 5841 -> 5841 bytes test/reference/closed.pdf | Bin 3357 -> 3357 bytes test/reference/encrypted_printable.pdf | Bin 3314 -> 3314 bytes test/reference/encrypted_standard.pdf | Bin 3314 -> 3314 bytes test/reference/encrypted_withAcroForm.pdf | Bin 9198 -> 9197 bytes test/reference/encrypted_withImage.pdf | Bin 4152 -> 4152 bytes test/reference/html-basic.pdf | Bin 3390 -> 3390 bytes test/reference/html-font-faces.pdf | Bin 105746 -> 105144 bytes .../html-margin-page-break-slice.pdf | Bin 24788 -> 24935 bytes .../reference/html-margin-page-break-text.pdf | Bin 24395 -> 24395 bytes test/reference/html-margin-page-break.pdf | Bin 4847 -> 4847 bytes test/reference/html-margin-x-y-text.pdf | Bin 3438 -> 3438 bytes .../html-width-100-windowWidth-500.pdf | Bin 6298 -> 6320 bytes .../html-width-210-windowWidth-1000.pdf | Bin 6389 -> 6389 bytes .../html-width-210-windowWidth-250.pdf | Bin 6400 -> 6403 bytes .../html-width-210-windowWidth-500.pdf | Bin 6414 -> 6404 bytes ...html-width-300-windowWidth-500-scale-2.pdf | Bin 6379 -> 6380 bytes .../html-width-300-windowWidth-500.pdf | Bin 6318 -> 6327 bytes ...html-width-default-windowWidth-default.pdf | Bin 6704 -> 6627 bytes test/reference/multiLineLinkWithText.pdf | Bin 3266 -> 3266 bytes test/reference/open.pdf | Bin 3366 -> 3366 bytes test/reference/table-autoSize-headerNames.pdf | Bin 58220 -> 58220 bytes test/reference/table-autoSize.pdf | Bin 58220 -> 58220 bytes test/reference/table-formatted.pdf | Bin 59518 -> 59518 bytes test/reference/table.pdf | Bin 58762 -> 58762 bytes test/reference/textfieldMultiline.pdf | Bin 3650 -> 3650 bytes .../reference/textfieldMultilineSmallForm.pdf | Bin 3746 -> 3746 bytes test/reference/webp-multiple.pdf | Bin 63753 -> 63753 bytes test/specs/jspdf.unit.spec.js | 18 ++++-- 30 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/jspdf.js b/src/jspdf.js index dc009f313..9401128de 100644 --- a/src/jspdf.js +++ b/src/jspdf.js @@ -784,15 +784,6 @@ function jsPDF(options) { ); }); - var getArrayBuffer = (API.__private__.getArrayBuffer = function(data) { - var len = data.length, - ab = new ArrayBuffer(len), - u8 = new Uint8Array(ab); - - while (len--) u8[len] = data.charCodeAt(len); - return ab; - }); - var standardFonts = [ ["Helvetica", "helvetica", "normal", "WinAnsiEncoding"], ["Helvetica-Bold", "helvetica", "bold", "WinAnsiEncoding"], @@ -2998,11 +2989,52 @@ function jsPDF(options) { setOutputDestination(pages[currentPage]); + return content; + }); + + var getString = (API.__private__.getString = function(content) { return content.join("\n"); }); - var getBlob = (API.__private__.getBlob = function(data) { - return new Blob([getArrayBuffer(data)], { + var getArrayBuffer = (API.__private__.getArrayBuffer = function(content) { + let length = 0; + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + length += contentLine.length + 1; // +1 for newline + } + + let arrayBuffer = new ArrayBuffer(length); + let uint8Array = new Uint8Array(arrayBuffer); + let index = 0; + + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + for (let j = 0; j < contentLine.length; j++) { + uint8Array[index++] = contentLine.charCodeAt(j); + } + uint8Array[index++] = 0x0a; // newline + } + + return arrayBuffer; + }); + + var getBlob = (API.__private__.getBlob = function(content) { + let blobs = []; + + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + let arrayBuffer = new ArrayBuffer(contentLine.length + 1); // +1 for newline + let uint8Array = new Uint8Array(arrayBuffer); + + for (let j = 0; j < contentLine.length; j++) { + uint8Array[j] = contentLine.charCodeAt(j); + } + + uint8Array[contentLine.length] = 0x0a; // newline + blobs.push(new Blob([arrayBuffer])); + } + + return new Blob(blobs, { type: "application/pdf" }); }); @@ -3047,7 +3079,7 @@ function jsPDF(options) { switch (type) { case undefined: - return buildDocument(); + return getString(buildDocument()); case "save": API.save(options.filename); break; @@ -3076,7 +3108,7 @@ function jsPDF(options) { case "datauristring": case "dataurlstring": var dataURI = ""; - var pdfDocument = buildDocument(); + var pdfDocument = getString(buildDocument()); try { dataURI = btoa(pdfDocument); } catch (e) { diff --git a/test/reference/autoPaging10Pages.pdf b/test/reference/autoPaging10Pages.pdf index 432b1f549403e1161ae7212e8b2a3233bbb2ffff..44f09f1711b1d63f1768b5474aa17125b66e3480 100644 GIT binary patch delta 149 zcmcbpdr@~oyO5@V9uR7B={pytCYEI8=eZ=7q$+5*SQ%Pcm>U`y8bE-yfx+etLWh~- qpnRN^oq`QcIjDr4LM)e^9anKlVo^y&QED2OiKT%Fm#V6(zZ(E7Gb88# delta 149 zcmcbpdr@~oyO5@lo{64;CYQc*QEFmIW`3SaVo9okhKrSvfsvu1k%6g!k%@_^v95vX z<_$uJnd4ks9NjEjTun^P&5TWqU5p$}49yIk9bJu`oD9uf&7AENYzQlf<+8KmDlSPZ VDyb++P2)1LG%(>(Rdw}u0|4N7CdmK* diff --git a/test/reference/closed.pdf b/test/reference/closed.pdf index 33483607ea8dbf950949fd026cbdc1f1c6a52a9d..4bb4dad89f0248fe79c76e0226a4f34f86119402 100644 GIT binary patch delta 149 zcmbO$HCJkbFqfu*9uR7B={pytCYEI8=eZ=7q$+5*SQ%Pcm>U`y8bE-yfx%`Qu4bk< qC?6+fr(lCq4k}@%5X)s}$5mXCSX5F`l$yq6WNu=>rK;-c?*;%%%px5C delta 149 zcmbO$HCJkbFqfv0o}r$hCYQc*QEFmIW`3SaVo9okhKrSvfsuisfsvt+p^2fXp|*j= zW*e?%rZ^LGLsMr*b0-sH7jtKGH)8{5H#b)UOEUvwLql^jXEQqm8^TIrx$Nw?ic1oU UN-By{)3}VxO$@kHRbBnv0N|1&ga7~l diff --git a/test/reference/encrypted_printable.pdf b/test/reference/encrypted_printable.pdf index 0e7a971624b228afcc19799a6de0cbc0a7ac4a89..654e08a32e70556c78bbf2cbd0d54c12989819f2 100644 GIT binary patch delta 133 zcmew)`AKraGftzd;s6&n1p_@G)a254E=o--$;{7lNi0cK&~ULbw6ricG%_@R0Br*U xbpwOV5?oW6T%kgC3N}y{PRdRpmdnnLtGFbwsHCDOHI2*2+`y1aRn^ts4FFsRAs_$% delta 116 zcmew)`AKraGft!BsS=j^=5BcxRi>lKrSDvnnpl#VpXZWTlB%H5sZ-^9s(1T`$V?s4 zE_r5m)%SZELtk!|;F`+B<>ct%=IHEdr(iSrAdi@;fq?;BB$mt0j;pvNv8be?C^e1C O$lSn?OI6j?-wgmRG$*kD diff --git a/test/reference/encrypted_standard.pdf b/test/reference/encrypted_standard.pdf index cdc5d3188880c1b9a70871b918d2754b247e82b8..ddf191b515046544c49dc1bf723d056bbd82fa0f 100644 GIT binary patch delta 134 zcmew)`AKraGfv~I;s6&n1p_@G)a254E=o--$;{7lNi0cK&~ULbw6ricG%_@R0Br*U wbs*X-$u)(^6)I+@U;}00r0f)8x$Nw?ic1oUN-By{)3}Vx4Gg(dRbBnv0C;gBNB{r; delta 117 zcmew)`AKraGfv~>N1870Utw|lRM8YoE`8^s)Wnj^{5+S$l2iqa&fW*hPw%k4c`|p( zysxpvErJ(WMV}tsv00L93KN%;ql=rPv#Xtg&E$hTVyXrP25^yBE;~D};*!Lol8U0# QG%h1^14AxVRabvE0NX_@mH+?% diff --git a/test/reference/encrypted_withAcroForm.pdf b/test/reference/encrypted_withAcroForm.pdf index 536d36f91fef348262278e1577240c1f01d7a864..27818f2dd79dd8371c829ffbc4f310ac85a269c3 100644 GIT binary patch delta 104 zcmaFo{?>iN2RY-c;s6&n1p_@G)a254E=o--$;{7lNi0cK&~ULbw6ricG%_@R0Br*U ybs*ZTBHzj~d4V$fn0MnN!B>(^b diff --git a/test/reference/encrypted_withImage.pdf b/test/reference/encrypted_withImage.pdf index bd7865e7e94a8f0a3e04d14ee9be53cecbdecdb8..c21d3f46a21cda8b560a58e442cdb042c4d5a1d2 100644 GIT binary patch delta 89 zcmdm?utQ-33$Jljae#}Pf`J|oYI5m27o{eaWaj6&B$lKqXt-DzT3VPJ8W|cufVP2w hIuLC(=iS3JSwMh|#lTL%W-_CID2M~ZtdnI0qyaBg6?y;w delta 91 zcmdm?utQ-33$O86$xAGS=Zb5*{q;1t^qq@R6H7Al^IQ^3QWZ2F2W%){y;qRr5ulft ra?;y%U83=~(iM+4oAd5r;&O6yadUKbwNtQ}{E%Og9m<_7Dcz5=Bisn%}c4rKE`fL6xRdTBmVh=0J_UBS$pAH2jPK;ftTpSoL4sSW$ZoZAY!E{PYY&2@a(zcs> z)m(tN8Tb6Gblv?gl{W%rh)}kDYQa7)$2A$73|y*Tz)&F*k{rXsI>v~aoC=btp7ifv z*GE~YYz2Z7!R%3E$;S1_j#kT_oXmBr*TPg0u40{uv1|}Gxkv~TJ-Sl+Bup5gvIo!s z$VMoMRia6%?6VRsoD3x=Nz#K$-4#ROJbD0I=O70o^Jcm?(A0I=-${Zuq86# z(b!!tI+(Z$qR9R?5!6I)dh`4T2%AD{?6F_eZDrDzt!l-i)w#oY+d6jZX}5JZ$P%MTSdT}UNw?3= zD5S}ZdWc3b%@6aCCexu&+RBW26m_mS)nZf&GSTDCS-Txw_apSQ*^X-Ny@8_+w&Cn1 z_*9rex1eogZZi>@1%_t*GVCxC=x`NY4;Kn80}FkFGkB`~m0yC6VH%5oLkN41h5AwiclPomD({^@b&i<4!qXErc=Q%QJxj)U#a zzW?9_dGdk`t=&4y;G&2r{^Hwl9sd~>T9`*4eK(YLB~1q>DNPmJKBzlhKp9gkuVYM0 zS-Hz%@Odf-d0HrjOF;`d1=m2XXs**jF+71w{zM1)VLy1P3IPR8 zM4!;<1cQ&;$>NOhq(2}sAz6|yM#$9Ua|p${D(_Ax4cEzF68JV5o@3w_zCeRIWhBdQ zwKAIKi&hEsM!F|GRLpxpxw17h)TYDY8jlG*H3Xhhm`x3@^qK z!*i3$O>Ck`%O7B1eJ~m$e}NB;&ph-mXo8QvdCuHB3p*?Oz}(;YosZu+=g$28Yj*#S z?DOaSB%wiJVDp{zc3Msc{JC}K{@waMtrLDPtH=FLkx3j7G~oZlneh1eRDBRUS@>*3L+cs zU+$)jF_&F+SmX=+Br~tu1Jyk7y$}JZ!Q`4JQ~PLv|Uv@yCWmP6xi0P*j16d2L3~uLWVm}%D>g=#E zwBwp|r&sPI!5K&kg`OE+%L&gO4u`i~11~n>oMpxsE|j&m#>VxZ@2)@@7C3@p-(DJZ zrGk#cV$PkqY$)RGB`bm&K8jerT({mUgDqsh%!nUS&vH%%jUUXcgDnghrclts4tjcJ z!{x*eBxs6#N^p-u;ZXw~4&Q-fHQjuFz|v47CbSwYuQm3mDI=u5V2Ss9^&9JTRQt{m zxFR^Z%7|wV35q%^Bd9YAD}p>!2?&nLa6NB3ON|ZHA$!zK5Yz@p(Q1n$;M5?KdmS!R z1nS21=18Mx)EVq>coH#v6T}&0u@SRMR-6G_WAGLnX_UCpX29dADE3_#A8-)ShqYOK zIIbNQa-wh5KhRG{sySF$1@8!4n7Cw{-eA~Ul!)mKg1rSKNpHZ`*tgbvJasR2fSeY= zO=@3@FM@=N9pKf7ZzewV*j`>;gC(@Y%ES&{VIblPL6BsHtR0&SC|-M-_+XonY1?d> z*yyAP*g|g9wy%xC6_Ex&sX#%gSqm*THe6%G-NC4~zt(hYQX@zkCrAJsnGdp7;s zv+2y;wf7halt=K-+wcnbpAx}%^y1$iGSMyzWw()#h{G!gc^wBr8T@)MCVF}Q=NrH~ zJsmF;ao*joBvSS!iGY!E=7h5zjKT*s&0|qdfgGft<3WDt2M>bYfT0S`5e-kObhjv1 z@MY~z%!O3xVjzV~=iq_d4b$p)$V4y3rAQ@#a6DaLpa@O3I#7(Hiw;z1h3uZqI8dr* z#xhbgomi0|N~=>us&uOrg*SPsXo%K5PUt@+EDTaDq=XBesv58mz877shE1lV7YllQ gMRUv^$Gei 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 ulk2H!CXrRUc7jF^6tMez?S*| diff --git a/test/reference/html-margin-page-break-text.pdf b/test/reference/html-margin-page-break-text.pdf index 0ed26c68a8fc95f71b1ae0159a6cffa5bb011013..16603398f22df41e9394b158d9286ff466e2f50a 100644 GIT binary patch delta 2563 zcmZXVTWl0%6vwkOvl<$^mqMY?vTV7uw58kmZu89)q+1IVq(XPfgSs=bHX$KIln~<$ z6Wu177!wtGLU@t#x&^F8hz0C01YNSXo!ig5^v}GX16;+pE_sG?EJs~ z@BGhPznZ#!HFfHg$vKBVIyz5(a6IQaZi$fMu{LIxio?`}{?uVplq9^B3Q`hor$S4* zcsXSRDH}dCB9q`%n;E1S95Ex4J<+iZreKk&;-mK@H37q$>oX*#HwVt zmuT`-sU2V2>VjMepCdHU1t&^=R(LGYMPPQKk`q!S+6cp6o6ZU0BpZ2LWNxxksA5(S zFWCv-n-xRY@bmq(tV@%3T(~$~$v8au6L4YJ&v0~U`Fs@esFTV>7bW^h8{JE^%})4P z&rY^6NKI6-5^Zg@aa|KE*(b2(x1-;!Hl;el$p5Y9evW!c?-8o1rE65pmtJHP)QwqyH zRf9=5*Hg0uN}OMh3M549QGpV;h}X6ag+iF7uF7q_5Eu@Fr2-0263ZJw7`6D(ix=Nn&T}>* zyjIMB&_F{wMWeii*3w6HPN8QqV^AH>nBk`^R16I?9T!N9@p+E3?81*6XIc6033Qsk zS%FR~jDKR{rsZd*APV7`EVpTi^CmtH7u{#!uv2N!yW#{oN*iTK$4kTO_5xEPy^~%e zP&d6$1!~7=)Cko1(ZF;tQU9ol<~O??-N7}oy_Qp%Y8{R1g|E^yx1*NV@k-p(J08CV z$&E+2I&E6$ouJU6Kc-PJ;-=o| zdJw+ZAEl+vu|1_H;q9p?uUBiU-Bp}@Ohn}oyr*U&aZd@YWbwGIPY!XBvL7$t=MG@B zaRL8upc!`eU>x?d2eG0D;m$!^$rK))Mr+l6`+Pbcgzidn5MHjtgK$$-^dyvhJqhRi zD6iLWOA%Ui+FE<5f9CRvR~%{=ZS_}ty4a@wvAIN{chx*9oO^1_5qH%HzKP#m<2Jje U<~p{ndV>um}rwty`f><`(dy)tAeE6HurYw8vB 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 F@L!1>M;HJA diff --git a/test/reference/html-margin-page-break.pdf b/test/reference/html-margin-page-break.pdf index 21cd55b9891b9efb57e5aab44d4f3c3df07c9598..ab986c7c29d4827fa7fcee1f0be34a6f1057a7f5 100644 GIT binary patch delta 133 zcmaE_`d)RzUVdf+J%h;y_(cT`EiKFqjSLMSK-<7z^E3X{OmR>?PRdTf2B#cU!cHNU c%g&CgxFoTtq@pM_jmyN)(tt}<)z#k(0JK3LhX4Qo delta 133 zcmaE_`d)RzUVdgHJ(I}?_(cVc42%p7jSS2UO^u9n E09frJHvj+t diff --git a/test/reference/html-margin-x-y-text.pdf b/test/reference/html-margin-x-y-text.pdf index 6d041a183e37c5b31b1dcae69f7f40c5366ee128..11c488b0471b870fcf4fb84262bf9ae8afc91c73 100644 GIT binary patch delta 41 xcmaDS^-gMo4kMq5o`t1C4wtcko`Sih$z&_W9A;BJ^T{h2V;Rjivooc00|4-I3XuQ+ delta 41 xcmaDS^-gMo4kMqbo`t1C4wtcko`Sih>0~R$9A!(8STv4`3qg6(zk+zxUq%|Ni%SkEUoe(lBzzqEqxZcQ~xv zkDqiOu(`XG>CDD%RorBbi`-^zSVU=k|7vh4Qr4c>$O5U^$u=cSv!@bPavkf>;RltO zz9v3$vHmOP103%ZHQ*a$o*-U;UnJgQUb`#fjM+b72ss`TcScu_;M-_RI5L|OUd=$l zYCZ^mmo$v?^`&ZDL`R$qI%1mMFCb3CyJA`0Y63DZ-mHd(9QV0WI50|#*)aU7}ud4~&cB7_oUA>~Ri@sM&4Vd^1- id&)kFpqI>m)P+3Rq?9VJrd7K`69@`}J+`04x+<0>{DP?Xp_nhhMt8_bM(qOvf;^cc5=L ziaRmVihD7#R>h_LY#c~%7w+qp0{_$#E1EbiH+pi$;G*$kR>Zy_vQaUPl5q|Lx%I^? zVlen_9;oxL`AeOjtX{K%lg?)q<<%;pFnF^Pi8qU8ez#;nvB@ z!gABH7`O*AKaN$BbTmqpJ8C+myw>c@%1?&>A;bK*TOik7!{!qKTHeovs!>M6JnQ76 zE+pn&i_j>bv_hY~eS-w?@AcMKXE6+YR6PEX@2UcEA}HJ~uAUJ(Ezyt(Z5BoPEXH`6 zV@Tg+IMO*P!xTx*{>#J|C7K}*wToF8YwyG4Z`O8WuK95!_%w$&7SZ&ObE>80A&y{v O>Bc75U0K=K-h2luGqTqJ diff --git a/test/reference/html-width-210-windowWidth-1000.pdf b/test/reference/html-width-210-windowWidth-1000.pdf index 5ae9c69c5d2429f0a95cdee8eab807f8818d955c..c9b29ab54f424f753a1bd9509700b8c3e6b7217a 100644 GIT binary patch delta 400 zcmexr_|+G8bb3vyqTu@#H|BkjVnf>|g_=m{Y-Y6LSVTO!-IV9I#jdOB$Fy z$&vx4O<425^io!c9$q$xd>LCZJJb=AAFySE)%dYzf$81s3BpFm4$MhR$}a*tk;l}~ zK+hazX)i|#hp7eB!9O`t1Pu+5wWVeP^>7Dsf@+r=27BIt-E1eg_fcQTr z2W?@W+s&ur%Y~O3*j*`vD5=P8e)$eZyH$N J<__LmZU7pTW-tH% delta 400 zcmexr_|+G8bb3v$3AxTu@#H|BkjVnf>|g_=m{Y-Y6LSW;F;w|S<{YqC0!td0 zKFN{+rcGG$!1Pj9h#p=xhVyOpoiV@g&Io>p| KzRexHx!eHyduA;F diff --git a/test/reference/html-width-210-windowWidth-250.pdf b/test/reference/html-width-210-windowWidth-250.pdf index bbe80422ca8b7431e33cae2d5d5b11f4e4e76fa3..9f8f6b2cf0eeed185b9445bc3011f163431c5b7e 100644 GIT binary patch delta 780 zcmZWmyG|T26xD{E-FfWtXn+bi1rkWe_;qcMs3=H_6iAC;W@p*uEtJp#qN4&V6L-YX~BLH}JT1uUpp^7cK4etC&6k#c0JkqzYYMp~zsOY_v&b>LgG zJ02sc3e|SrN*0Qp&5Z9m$Go3RO+_jpX)y+ezH$e04)MxpZ6!v@5 z{u)dwib!$L0SYZ3z_m92CYMh2@C{eME1K37O%N)FeS%hN1yfa@AmD0G-&PWkhcvXN zkg7UZlge{M%qkB70+oJ1WAb6fVm=U9%sz;PCi9;kS_TwjCY}D-l;P~`%IcT@+d{7s delta 829 zcmZWnKX21O992l2ICk79OVxql7%CwF$NB!BI)@bjk=PKilVC%dR8hj(BE-T(`xD*y z08H%t9DD@C#LR#=pVLxuUi{wsz4v^-li$-*`sutu&!Fh@6l;ZM5y40}4Bf`@j>1I4 zX(J0I(!`OUjp=R$&~O~x9WQ2!CERHZyM$qR?YX>_C)b|Q(PU*U&pNhQNscLnkIf=f zSLAo|bx_OY&ZO^<>mIzF%*z{5nqns5FgOZo^fk!(0x3saU_M%{;Y&D7m`<@tHzRo0 z%9|Ps_|baf-p||9oo@U_)JWx_(u<3+>u9xiz^FTy~3~M)#7uy-~kiBu_hgQX^75XpSNWh+ta4 zpS{Bqu{~i*5Kq(E(>O`lwvVTNmQ&^XIH7g+HbBVMF$6i$B+I3J{-IT diff --git a/test/reference/html-width-210-windowWidth-500.pdf b/test/reference/html-width-210-windowWidth-500.pdf index 9afd79b56fcb3351fba32927de08a4b0a9dfb4a9..c8ab6926f85994110106cded72b5e08dfe3a8255 100644 GIT binary patch delta 788 zcmZWlze~h080GF-`|GMAh~kt*aEfV~G%1dvn>eVWV9)FM<9;Zff}1C}Dr&${{1X&6 zL2wqFog5rp1Xn?@&GqVGvgGA`?|t9n z=oBJ@0FG1qQK-4e4VJ6+RCTAZvnP(NC2?ESbH!tE-R>!(rg+y@M5koQMyI7sgJ+F? zN)5?1wVJ$NwW{G~wOM^zLoi_CPLIqGa3miS1MyG_1l_d99VZ|lMP9E)9ug$2;LdcUC-HDD>aR}sjfaWZOMs})g*i5Jgv0+8pHZT4oGTnb9{aB&p6Vr-sXBrJ={@R; zM3PKO!+@!SIa1akp}Gh~ROv^((CeQuo&E;Jq2EtRF7TDqlwq+ueq~~2PfpG)&i?{) CW42ZR delta 764 zcmZWlJ5L)y7?kmA?|epOUj^G1<(tC{)co1NWra!IbP78t(1IcW$KO4#=?f|5_M4hq8( zLoCvhLJTNW#E@TwgIxW(&|S1DY$g8YcO3`qAe0OVYhEj+x%r}a1f*4e7yFCTEVGsN zkH<*A1g(H#gd^*DE+v3i5|vL%6k(x%lw+Wv!iF>|X|A4C4s-BU>E)nVJ*ZmSV>QXe z&maNJs<$9sRT%N?4wGiO><>nx)8Y77zZaTy&N$*(pZv0c*D0$I394Vc-VAN|M>F)` zr!(}amNbmd1`Y=!eGl4oN(5pQ$~@$~*6~PW*AmS7{+zI=DzYlQwc<+s`3(vp)%*QU*B2GFfgQoGNT;1YjV{!Rh4E<78bUG zCC2^*Z0t;I4EzBwv(TYc#ZJz5Y0}u!>&L(6d0*Rq$rZWyWCS1OaXSbwS8~gA6|ifT;Cpjui^_a!=B;^1 zX-MaS2I@n96oYvZ;2 zX*so$_-$oX_0mq-G^m^^HGa2Wj_kMQJWh-DEfP?+LY>wVM=UJA>b>p7Mx`H3 z2Gv7fHZ12Z`b#674_@`zY4&OqaKyh(n}_bh2>HcABjl;V2g>Ik`RLgU)=y|ieNBtF zt_eZcIYx9Z3qa>+6qMfCawGoDPK7XhDYc|dr0ugBB*b3nkwJ+aU@ U(WVA2gzP^4Y*Vk(d4BNXKM~%*?f?J) delta 779 zcmZWlJud`N6wU4$GdsJB2qFr3jYRd#d-Fb{rjo3$A7Jb(JF=FB%!BH3W1FQ zrwM*9G*fQ17}!X2_r*ra&6cv>X{lus-TNxFM`9lWo1r`3Y)4(F`o%T%IOL|5=b`X7 zMp&&;%AjPawiC6Yw(8sKRUx3HfTb-}8*YsKiS~otPOzUO*0?VqV!7;fII=RsiXE0Q z&-n*?Tl2taI4GyjoS+ihMP7e9!GwSw(RH?bbbORdD#!mrDS;BJr}CbaA>!_6bnS*3 zIhBS+hn3Kwx#^{{HBNMq2Jam2M&0C6byKyRyrpid&3HjQX{NSiQ49sY>(w^OlN@-- z10CR|z@t7R>TPPVM+Q4S$I{>gH90BqppGEZOE5KczCf9`_qP(E$TtERF$NRPjdO^M p|9zOu19H@8$@{sDU(o93H14_$5`F!t*nSk{OJ4K2y%yz;*(S_(a{BKOFGF&9usqy>ye`uW66p zOL9YY!xDBQ*SYs4*JUU2T1vG@4f5~R{o{Ur*z-Mhmf6;A#~?U@OKK&B3`*IpdK3y> zJIGC(@PFFv=zrccHO#+j^-!$nb%g?(^71>qtONsuK{ivF27^ph$CK@%kBIeT)rvoL2cdC}b2$?-{L4W%pDhDji2A^VW6Ov`HFUiG{`Xa(VD$~opSheuc9ELQ{A@%r6WzTvpMB#!R2-F5KBERQ(c4;VoE_Ov+Iiq-t`+CeLIL=X|=ThwJ94R7|JN(xZ yrL3qKGEXZ^Io94oJ^dln=b9hGh{bClRzy4=WQ=KDGna5NKX+?U3<`zS(%KIQ+pxp{ diff --git a/test/reference/html-width-default-windowWidth-default.pdf b/test/reference/html-width-default-windowWidth-default.pdf index 8f1fc94d7ac135edc2097141af3314b588c6752f..461cf0d20b44729f38d30de349ab80d95f490971 100644 GIT binary patch delta 799 zcmZWnJ#Q2-5Y=&O-(@d3K2i`0q-`Q06b9R4d+Z+4(j*cRoc8v}ksO3b;gXu4z(pgV z;YT3RQ&3PL6lxkIegO^XBAmS{x2~R_M{nM|@hAHSXR|huKjGmjp$4?Yey*UnH@~oK zJrxu^7~X3QGX(PdJ%Lnc`2Ll01p|aoZ0+QCrjsMS*4yp}57yR9^=e#G0uf^5$L+BQ z8l2;=37H65^F~$*^5BVQStX1GgZwYsy-FG=)*=U!y~#eGiY;k$1a$mOl)`(6n(xY? z&=xH5Tlq|Q0}A;}juC_d$PRF%l zq+~_&hvktl1d8~4c_0m0@P@0E@`f>>=iwb5Pe#Ynor(`z+fw@oWO<{XawfpfC;cZ& zH_5s}U7X^e$ZMdSBgO5t@LWe{79WlBdXdARLW7Hli=0)y$!Y$(w)zIs2U)OTt!t!ng?tJsj_tPBHeBKC_-f{ne3ju=8CaHpKdvRfz zJd!~vAj_kq-;6+pzbE}h0OIRs_B!OjglzXodUZOU@yld)%|-{tRVaTxteCW9!5F^Z z7>Y<>kiQib8PJipntLK@(2nQLTo8gL{@om{MFkowm4orq@uZaQY7+tD0_HRRn%hl7Qq2({v!uXV*$ChqIlle65D7Y@<#hIzghW^AYWkc}Q}@15RxNJs{NN(swROO)SaG&vQvENmbBru`;x@FgG+ZG=KnY0|Rw~&D>m( sOmR>VoRpn{4Nf_zgq=bxmz^C~aYn00dzpI{*Lx delta 151 zcmX>kc}Q}@15RxtJrg|xO)h=sqSVBa%=|o;#FA764HqjT10zF210!=o3qx~LLu~_7 zb>q$4T#-z1Ca%UN29~alMi%AM$@ XBo>ua6s4wd8JSsFa;d7i`nv%DmS-i5 diff --git a/test/reference/open.pdf b/test/reference/open.pdf index f5348a299c62dd0a86c2ac4577a229cc043dd99d..e7e7d2ad1d07be674fc0462a507a6979a68f8074 100644 GIT binary patch delta 112 zcmZ1`wM=S*3>T|`9uQ7eT}Bo}r%MWJNAvK_der149ENLn9z%XrXOjvDuZYnaSDM%-O`))X~`7 kz{u3p#njc%*u~k%%-P7o#LdXi#mLf5!G@5M$=tls0EoyKvj6}9 diff --git a/test/reference/table-autoSize-headerNames.pdf b/test/reference/table-autoSize-headerNames.pdf index ac9fc892b81a1e8cf104cf9cc4886084a6e67362..cd2a525b056b6a1af35db0896a6819e395959402 100644 GIT binary patch delta 130 zcmaEJjQPzm<_#MkXdCDOp(dBUb5UwyNoIbYOJYf?f`*Hgp{0enp^>2h1ZW!=s2gm) Y^T3eF87hL4vQx0ZDF>C99Pn5M0J3-?o&W#< delta 130 zcmaEJjQPzm<_#MkXdCGn>ltct={pytCYEI8=eZ=7q$+5*SQ!}@85&p`m>L+E7@1gV z82h1ZW!=s2gm) Y^T3eF87hL4vQx0ZDF>C99Pn5M0J3-?o&W#< delta 130 zcmaEJjQPzm<_#MkXdCGn>ltct={pytCYEI8=eZ=7q$+5*SQ!}@85&p`m>L+E7#W&q z8(8<`*&C$tD!G@5M$pMdL E02uHjOaK4? diff --git a/test/reference/table-formatted.pdf b/test/reference/table-formatted.pdf index 81e098aa38d7fbbf2fa32fdbe02f7935cfb54b50..50b4d640a272c8a74ba6b6e4171b75242d0f0e8a 100644 GIT binary patch delta 154 zcmex&f%)GB<_(9RY8&VQp(dBUb5UwyNoIbYOJYf?f`*Hgp{0enp^>2h1ZW!=s2gm4 w_tcOn9x8&9vQx0ZDF>CXQ;6lVv*Ri*Nh~Ultct={pytCYEI8=eZ=7q$+5*SQ!}@85&p`m>L)uTN;^b z8%@me>VUE*(zQD diff --git a/test/reference/table.pdf b/test/reference/table.pdf index d0b19ec8a5898c447837cd350446fe2b962b7a19..ba5f6c5e7fb6336a76ad27df6ac3f03d745f083b 100644 GIT binary patch delta 129 zcmeA=&D?dGdBgcf+6H<+sL7@8T$Gwvl9`|9l30?epy6U=XlY??Xk=&r0on!z>IR#C YJu+f)f{Ngx>=bNpNx{S?=RK7H08UjQ6aWAK delta 129 zcmeA=&D?dGdBgcf+D3ZDdWM=@`p!kEi6xo&c`k`1sR|k{Rz?O!h6a`frUnKkhK82f z1}5spn}0nrVsbKevvjpIbu~A4bTl_Gws0|WbTKzIb#ZpJFfed(akW#hF(9C1a^6!J E0K6F^^Z)<= diff --git a/test/reference/textfieldMultiline.pdf b/test/reference/textfieldMultiline.pdf index a78ceb310e7c7770280583cb73567d58e0409b84..efaa3a5371b0d9e287e1beed019ba6b7ece6f352 100644 GIT binary patch delta 149 zcmX>kb4X@`2)Cwz9uR7B={pytCYEI8=eZ=7q$+5*SQ%Pcm>U`y8bE-yfx%{5?&VBz qP(Dt|PQeDJ98|(iA(qR|j;pvNv8be?C^e1C*uc=3OI6j?-wgnWFd~fr delta 149 zcmX>kb4X@`2)Cw@o{64;CYQc*QEFmIW`3SaVo9okhKrSvfsvu1fuX6Pp`nSPxwe7v zW?Sy%OmR+TZsr!oZWeAX7G{nv#-?uO28K??mX4;*u8yWAP9}B=HiVVLa@pB&6_+Fy Vl~fd^rg0e?7#ee_s=E5S0RTG*C2jx! diff --git a/test/reference/textfieldMultilineSmallForm.pdf b/test/reference/textfieldMultilineSmallForm.pdf index e589d69905cc2e7becee0653ef4a4e6bce8c1633..fd2901d48c86467845034d0cd51e9d9665307c3e 100644 GIT binary patch delta 148 zcmZ1^yGV9J3Ad(!9uR7B={pytCYEI8=eZ=7q$+5*SQ%Pcm>U`y8bE-yfx+gv+$)%3 qp?qAFoq`Q6DVVsOLM)e^9anKlVo^y&QED2Ov7vz_m#V6(zZ(FayCUTP delta 148 zcmZ1^yGV9J3Ad(^o{64;CYQc*QEFmIW`3SaVo9okhKrSvfsvu1fsuisk%@_^rM7|b z=DFM}m|`8>99^7UObpzN94(AZ%?-_*3|vi|O$-f8%*|a)TWB}?9AhQ4f delta 128 zcmeDD#N7Fbd4te5O(Q*HJwr_{ednUo#FEVXJeS0hR0RzeD { }); }); + it("jsPDF private function getString", () => { + const doc = jsPDF({ floatPrecision: 2 }); + expect(doc.__private__.getString(["A"]).length).toEqual(1); + expect(typeof doc.__private__.getString(["A"]) === "string").toEqual( + true + ); + }); + it("jsPDF private function getArrayBuffer", () => { const doc = jsPDF({ floatPrecision: 2 }); - expect(doc.__private__.getArrayBuffer("A").byteLength).toEqual(1); - expect(doc.__private__.getArrayBuffer("A") instanceof ArrayBuffer).toEqual( + expect(doc.__private__.getArrayBuffer(["A"]).byteLength).toEqual(2); // +1 for newline + expect(doc.__private__.getArrayBuffer(["A"]) instanceof ArrayBuffer).toEqual( true ); }); @@ -557,9 +565,9 @@ describe("Core: Unit Tests", () => { if (global.isNode !== true) { it("jsPDF private function getBlob", () => { const doc = new jsPDF({ floatPrecision: 2 }); - expect(typeof doc.__private__.getBlob("A")).toEqual("object"); - expect(doc.__private__.getBlob("A") instanceof Blob).toEqual(true); - expect(doc.__private__.getBlob("A").type).toEqual("application/pdf"); + expect(typeof doc.__private__.getBlob(["A"])).toEqual("object"); + expect(doc.__private__.getBlob(["A"]) instanceof Blob).toEqual(true); + expect(doc.__private__.getBlob(["A"]).type).toEqual("application/pdf"); }); } From 1e0452491deb251ffd6af7e2cff79ecb9bf15a91 Mon Sep 17 00:00:00 2001 From: Antony Date: Sun, 1 Oct 2023 23:56:10 +0800 Subject: [PATCH 2/2] Optimize getBlob --- src/jspdf.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/jspdf.js b/src/jspdf.js index 9401128de..04bb7b33e 100644 --- a/src/jspdf.js +++ b/src/jspdf.js @@ -3019,7 +3019,7 @@ function jsPDF(options) { }); var getBlob = (API.__private__.getBlob = function(content) { - let blobs = []; + const parts = []; for (let i = 0; i < content.length; i++) { let contentLine = content[i]; @@ -3029,12 +3029,11 @@ function jsPDF(options) { for (let j = 0; j < contentLine.length; j++) { uint8Array[j] = contentLine.charCodeAt(j); } - uint8Array[contentLine.length] = 0x0a; // newline - blobs.push(new Blob([arrayBuffer])); + parts.push(arrayBuffer); } - return new Blob(blobs, { + return new Blob(parts, { type: "application/pdf" }); });