diff --git a/src/core/fonts.js b/src/core/fonts.js index 0538c5e5c..c1a213fed 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -3159,6 +3159,23 @@ class Font { } } } + + // The char code 0 isn't associated with any glyph name in the standard + // encodings, hence it can only refer to glyph 0 (i.e. the ".notdef" + // glyph). Some embedded fonts use a non-empty glyph 0 (e.g. a checkbox + // in a symbol font) and the page content draws it with the char code 0, + // so map it explicitly when it would otherwise be left unmapped, but + // only when the glyph is non-empty to avoid displaying a ".notdef" box + // for fonts that don't (issue 17333). This is restricted to embedded + // fonts since the ".notdef" glyph of a standard substitution font must + // never be rendered. + if ( + !properties.isInternalFont && + charCodeToGlyphId[0] === undefined && + hasGlyph(0) + ) { + charCodeToGlyphId[0] = 0; + } } if (charCodeToGlyphId.length === 0) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index b617ab60b..fdec2ee06 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -939,3 +939,4 @@ !bug1873345.pdf !cff_bluescale_small_zones.pdf !multimedia_annotations.pdf +!issue17333.pdf diff --git a/test/pdfs/issue17333.pdf b/test/pdfs/issue17333.pdf new file mode 100644 index 000000000..b853ec15b --- /dev/null +++ b/test/pdfs/issue17333.pdf @@ -0,0 +1,140 @@ +%PDF-1.7 +% ò¤ô +1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +endobj +2 0 obj << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +3 0 obj << + /Type /Page + /Contents 4 0 R + /Resources << + /Font << + /TT3 5 0 R + >> + >> + /Parent 2 0 R + /MediaBox [0 0 100 100] +>> +endobj +4 0 obj << + /Length 48 +>> +stream +q +BT +1 0 0 1 50 50 Tm +/TT3 20 Tf +(\000) Tj +ET +Q +endstream +endobj +5 0 obj << + /Type /Font + /Subtype /TrueType + /BaseFont /BQGUTS+SymbolMT + /Encoding /MacRomanEncoding + /FirstChar 0 + /FontDescriptor 6 0 R + /LastChar 165 + /Widths [600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 460] +>> +endobj +6 0 obj << + /Type /FontDescriptor + /Ascent 1005 + /AvgWidth 600 + /CapHeight 669 + /Descent -220 + /Flags 32 + /FontBBox [0 -220 1113 1005] + /FontFile2 7 0 R + /FontName /BQGUTS+SymbolMT + /ItalicAngle 0 + /MaxWidth 1042 + /StemV 0 + /XHeight 577 +>> +endobj +7 0 obj << + /Filter [/ASCII85Decode /FlateDecode] + /Length 3706 + /Length1 4260 +>> +stream +GhS,n%9-;,qRcL92t-8a"!RfAnYR\<0Hb,-#Qt7RTK.keJBjh<$j2)._CC_E[@B>pNCgJT`ePZ8m&.Q(UGafp7>f&\.%2fb@bXF@`XhALk<*usVY3YRG +jb^S\);;cnU\ +i9VD3:Lk>dP_FGeq=_bT+2mEKN3O:P4USh9gf&^M8fUna\ +')R6M3LP;lF#(450>u_,[&01r5<#nnVk^rc^5i*$q2h&&^*G(_ee%Z:eV9jPJh]#TqjRYf0r;$?!,WfENk-'mA8GEt:VIBaX"q:GDOYATPbN8"0F(`t2t5[`m2Of(<=e +@_X7md4G!,(AftI2:`]%U4&#EJ@2PQ#aOhXi9r`5E2 +hZB4uVm0N8!`2Z^qrt=h4icF\Ed4^44=:_6oTa*N1bWCUD30YZq\G]W6R31W@736c5&en2T`Fm!_=(e8 +4pN#`@u4i[XWXT=^k7^XgL)Zci%ie*\-:08M3&'#TU9hO!N+eek=K\6D?^@6;$%-a!SDq4%f&>P,*WXp +Kj2t$/pJ?G_4T\)OH)EJKM`qT+4WS@'faTr/MIU*o9K4`Qjg`akM\jS'E1a=P'uCAp5M,/*`;rgX)_W, +b_)2-K^^ZXKmM(_T;]u*;)?]Rl3lnS0Fb][J5O&fn"?cj6mBg2O$:U1_Z*ZgWs:+nEaM)d]lM7QNs +J2ZE'N8C^f4('kIHl*oUh73#)[.QqBo.WYrOV1P]DC3QJ6f^H%/GU*icsu\q2Mi`cI-,#^[[!Cm(I`dh +Bm:bJ<39.Z@kR:oK_`j/XP'6f<^A*LKKETmIbjjn+!H0f4+Nu34qAmN%A1HQ#\W'HHqc$J0ud=YLG0+0 +KNQ?*dQh[tX^iXo+Kpq>3CM^I?]jgA>WRouTM+N)g.FG@(Ca2p#3fQBRf3u6/7s(6Oo:.X?uN=EfgkC- +XSTo+QWq@Eic];KpBc&8qjn2e^rm!>GqZpVm-1`!]Md!T9@P;2V]%f[M`JK]UWJ61N2IFeeH`.[E]Oe] +M9pmcgPum5L*n^">4u9V&A4$'qA,[k]5SHJ`V;WL;t)#:`8kV%9d++H5\=MTD^#Q$)Y'?/a]?h_qT367 +k9(X/(a6pSatQ;pS@[s%[$ts046Z`nS.=![3f5;Y1'=+9)I(9&C^"%bDIZsg2g^efL-7=$sou+se8M`?:!P$(_ +%:7me#8uY%ClDVp#G;P&koF7eWbsQuS7E^i%P-[Z."tnY"%MMVDO=t^>^BLsM1hNq0X(_^=A2+t+8Z,q +FGbq9/+BiCq#$Z#B58B5%c7S*aDkW;H8iiM7\./bN9gp"_2GsqHH7qSO5)M!D2(DP-/EUF9WB$Vrs +=cdRDbPak)G1I)tHF&i]h=PEYN:aKVWDc\A-RTcF-RH^O`Q!^cJ`djrODgJd4d(uq;7LFfd@p]%QG(B/ +?GZ+Z'!eMbl6qfc=-FtG>#BA6-auOma7%\PR3g"rG +fo.F,HWln5;M[iK/(NHmI_3XTqZZ"hX5p:HfReJV`l?so%VNp`\MHdRQ4\O3VqR&]'Z:.H9$*03FsUG& +BeCebbO04JC?o,JS&oJi(Z[*BasT+sTRF0u\dDF$Ae[Ut,3WX72-MuD6OMt:p`Bn^Tugf$DjHm+X'?#' +\htEu(:7jUVVZGVm:R%ja)Bo7=%Z32DbjR^Br'X9^SL4uF'U4PCY8$o4`E!tWqQ4gdI`'Y7>Ff.CNR2C +V3((X;UQc:U5Hl*qUd/Xf6Zq&1AhJ1lS/o^A6=W;'9HXhr:M\qXH]2b\(laRU3S$AN"r$W4paAlaV[s=L0BJMmjg^^Ci4j*P\*%? +2+gQ-a)RK(*tV0.hSH^cP1dYe*.eZo".8r +6LH[&3+2TU(3Aea(DgQWc"??nGD*'EKS7cXkDIV!1mnQa>)<2iW(3&1>aA&tcm6;k-0*03103rrqDD`> +,%co9&rilSm;9fL8c9ajQAF>TPT=n+0$3PU7!%[mT0Pj+7H:];9UT/I@O<"a;%qET=Hol+Pr6DnYAdY> +1[%9`*"kZ@8tA>FC;oC>'Z'3>ZhaW+'N37mX7YB6APkCO@`q0NA-+p1]m)b/LUh6dW,M>*@jf@e!NupS +UouCa-%4'.f.^N2UqV0,+=4D;;s=e;5acC)0=k2T9?4R]-#"&Q#SubL'm5XQfS[.2?-;C?SbD"o7H]Mo +Gm&L<)W;QV*ju..5(H]-'!0V:8Wd4e4T9,Qa77i&%_s''8+3Ur[GhpdiI?CklZEEJLMpjto.c%Yn34j* +7Z>.Y#c*Bh7;8&+j7fBC`_($*(J:#2a%E&A93**_!f7kQgjq\ea3^_D +0Fn71Y?30k#`t0V8<6RAeuW_(WB"fX"6E2$c(7@%%.a)E2pRt<_jj\PCinU_dEtGh7VP;%*7]JgRqd[i +\5q)HLt'eYC#-@dY04<=jCmr= +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000068 00000 n +0000000131 00000 n +0000000284 00000 n +0000000384 00000 n +0000000946 00000 n +0000001206 00000 n +trailer << + /Root 1 0 R + /Size 8 +>> +startxref +5021 +%%EOF diff --git a/test/test_manifest.json b/test/test_manifest.json index 08b6dfdbf..e98d104d7 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -14439,5 +14439,13 @@ "firstPage": 1, "lastPage": 1, "type": "eq" + }, + { + "id": "issue17333", + "file": "pdfs/issue17333.pdf", + "md5": "3af896c003dea994c58ab4a875d59829", + "rounds": 1, + "lastPage": 1, + "type": "eq" } ]