From 7ffa9a283d52019b4d857318c96533cc9dc1904a Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 9 Jul 2024 09:12:09 +0200 Subject: [PATCH 1/3] Extend test-coverage for non-embedded Type1 fonts where .notdef glyphs are replaced with spaces --- test/test_manifest.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_manifest.json b/test/test_manifest.json index 78c4d8f59..b7d1190f6 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2983,6 +2983,13 @@ "rounds": 1, "type": "eq" }, + { + "id": "issue11403-text", + "file": "pdfs/issue11403_reduced.pdf", + "md5": "08287b64f442cb7c329b97c4774aa1cd", + "rounds": 1, + "type": "text" + }, { "id": "issue11139", "file": "pdfs/issue11139.pdf", @@ -6479,6 +6486,14 @@ "type": "eq", "about": "Has a 4 bit per component image with mask and decode." }, + { + "id": "issue2770-text", + "file": "pdfs/issue2770.pdf", + "md5": "36070d756d06eaa35c2227efb069fb1b", + "rounds": 1, + "link": true, + "type": "text" + }, { "id": "issue2984", "file": "pdfs/issue2984.pdf", From f9d63201eb25d4b804082ebd60bba6bc85346fd0 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 9 Jul 2024 09:28:10 +0200 Subject: [PATCH 2/3] Revert "Remove the unused `Font.prototype.spaceWidth` getter (PR 13424 follow-up)" This reverts commit 4aee67227e3c5b28f1bb4d8fa6b2ad882bc23b5a. --- src/core/fonts.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/core/fonts.js b/src/core/fonts.js index 0301d49ad..c562ce12a 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -3293,6 +3293,44 @@ class Font { return builder.toArray(); } + get spaceWidth() { + // trying to estimate space character width + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + // if possible, getting width by glyph name + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + // finding the charcode via unicodeToCID map + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + // ... via toUnicode map + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + // setting it to unicode if negative or undefined + if (charcode <= 0) { + charcode = glyphUnicode; + } + // trying to get width via charcode + width = this.widths[charcode]; + if (width) { + break; // the non-zero width found + } + } + return shadow(this, "spaceWidth", width || this.defaultWidth); + } + /** * @private */ From 56653e57709719ca0fd6a44d25be790a0d36a5b4 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 9 Jul 2024 09:34:38 +0200 Subject: [PATCH 3/3] Also update the width/unicode data when replacing missing glyphs in non-embedded Type1 fonts (issue 18059) *Please note:* This causes a little bit of movement in the `issue2770` test-case, however this matches the rendering in both Adobe Reader and PDFium. --- src/core/fonts.js | 14 ++++++++++++-- test/pdfs/.gitignore | 1 + test/pdfs/issue18059.pdf | Bin 0 -> 15002 bytes test/test_manifest.json | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/issue18059.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index c562ce12a..29f186fa3 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -3293,7 +3293,10 @@ class Font { return builder.toArray(); } - get spaceWidth() { + /** + * @private + */ + get _spaceWidth() { // trying to estimate space character width const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; let width; @@ -3328,7 +3331,7 @@ class Font { break; // the non-zero width found } } - return shadow(this, "spaceWidth", width || this.defaultWidth); + return shadow(this, "_spaceWidth", width || this.defaultWidth); } /** @@ -3376,6 +3379,13 @@ class Font { // .notdef glyphs should be invisible in non-embedded Type1 fonts, so // replace them with spaces. fontCharCode = 0x20; + + if (glyphName === "") { + // Ensure that other relevant glyph properties are also updated + // (fixes issue18059.pdf). + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } } fontCharCode = mapSpecialUnicodeValues(fontCharCode); } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 13450e37c..7eedf8be6 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -56,6 +56,7 @@ !issue17679_2.pdf !issue18030.pdf !issue18042.pdf +!issue18059.pdf !issue14953.pdf !issue15367.pdf !issue15372.pdf diff --git a/test/pdfs/issue18059.pdf b/test/pdfs/issue18059.pdf new file mode 100644 index 0000000000000000000000000000000000000000..82416e26666310cd87f4fb87ea3858d5b825aad1 GIT binary patch literal 15002 zcma)@b8u%(x9?*c6HRQ}ww+9D+qP}nHYRo^wr$(VFTV4fbML8h>bzC=-T!>LS9h(w zx@)hluHOA6RS*%QWu#+=Ar1KZz`(E*Fc8=oTEg(~z|f0XSUa0I63~lT8#tSYm>Ag^ zo50Y^nAn;*n-efHa>DTO!8kcPni$x?xM$-|bi#lL!inwi$tSE2PjdBQ#DlNsG}KSR zhF2Gw6YoEG{UXy#nmn5yD0}Hy`{3Z~Jvi~@^n#wLVqJPLKJuflO()Z9i77`PK%uT~ z=tsbPK4siR>R(Y13<5tLQhF@J=sp#t_nfP;5h#VgUI%OQ_w#KQ+-2jRG7@(@RoI z%aT`9$F62eRqIBpYWb;p#d68B?y2%g+pqTN`uaT8?#u2tOQF2uou4m{pCRM5=O!zI z{ifUF;dlxu7+DC}92O;iczk^MO`3{so=C-uTHv5^oSI4zh6{LxdyliAfON3s53*Je z(sQ4a*Nx>(+w&VaA^}OYn1ubi)Xibr3?yyAI_)i=`_brIK;eBPadjS@ zg@emrCn5nSBrpLTdb6;XqdOaXZLa1^|MefQ-B(@noAZPQ-J8on19@R(e&EaBOWQ67 zs}Z%qjtILKV%=5m_#7YWa6+VINGLjNd~BRYfZ^YG1?SR0C)^?V@J+X;d{u<@|k*Oli z+hV-!i;t)Af}e2CB0_k_@|sIu$;nQ=IB$=w%=r-jHo;wR z=Ov6-p!h&5Fx~=zO8n8|RcMFeE)nM)dmq zf@ZU%XG|_09gf}o1fT48Q-Px3R{pjEZo)Yzo6%nR)0_$?9*!#H3qz;-&RoC9SM(s? zFZ$x_Lip`O!o9qDfVsC_yRO}z9X`b`;&do~nk28!vJlSD-oeb3R)HmHuOcgCj)KH_g6C# z5Hl5sBnMAYU@d2;Bty7T<7y~EjEiUp#NnC{Lpl;+j0?6?ARZC3QwfBWLseTtQ-RB+ z27%X#sOs}tDbQ*LpZ8(Yi@}#8vlf^x25KteSc*%>L%QV4Erz5Pnv~--_dt5g!7N6- z%_3n7uonulfGVwph|RK|{&1#S5BmzY6?4m7|2dB)K^pUpa@@WlB}shaa@ zhLO#ZXu{s3P0^Bs*9tjN>+XitdJ76AaBvuN(C`p3QE3vTjG;@ZMr)$tVC3a5oxzJK z8zypclCn-E+D?s5Hm)_{%BjiO>h^Tz*O#{yJ7af+R-R|Bi@H2T;b3QFYH4n)r@3=+ zb*9o?=x!f~zHGkq1&ri+U*A&GcYmBGtmyh(#IW!1y{))y``iq^@N>9+EX46=tgdXZ zx4BNKwr;kYJ-~IG8peZRx1}n!ULc;%Q%`F+z-va#j)umZZoebyI38(W)N1Pe@C1GP z2=Q(9bhh?(Jim0wy7s-T4a4IDjOO9{d_X@gGSBe&t)-a^(Qs*UErwuqdJeH76}deu-7N+zvjvm~&zS&S`z zFWQcJV~UK5jcO5H5q%Mn7rBY;VSWoaJxG)qBO3!xtRiid)=m1EWIwN9kvCXtu)U2L1?CZR3~Uj>Xh61^spZwNf{9epHaY~1n4|6b|{b(}qU zr^30?rBX{(ugW)~B31+0NoUfGac3x739{(*=91ir0TI{G^=wKJlQ-`?Iy`4WvBLI cupiDE?It#v8 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index b7d1190f6..90ad056ec 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2990,6 +2990,20 @@ "rounds": 1, "type": "text" }, + { + "id": "issue18059", + "file": "pdfs/issue18059.pdf", + "md5": "b70373894edfcd571a41caa1a0776b6f", + "rounds": 1, + "type": "eq" + }, + { + "id": "issue18059-text", + "file": "pdfs/issue18059.pdf", + "md5": "b70373894edfcd571a41caa1a0776b6f", + "rounds": 1, + "type": "text" + }, { "id": "issue11139", "file": "pdfs/issue11139.pdf",