Merge pull request #21487 from calixteman/issue17333

Render non-empty glyph 0 for char code 0
This commit is contained in:
Tim van der Meij 2026-06-26 20:08:51 +02:00 committed by GitHub
commit d8526132f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 166 additions and 0 deletions

View File

@ -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) {

View File

@ -939,3 +939,4 @@
!bug1873345.pdf
!cff_bluescale_small_zones.pdf
!multimedia_annotations.pdf
!issue17333.pdf

140
test/pdfs/issue17333.pdf Normal file
View File

@ -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>pNCgJ<Og`uNZ9LKV
D_Tn=/Z%0Mc<8maFlMbb[;)jig+6$([Vdj=^\;=cEBS[BIWN8N^RokfTDQ=rk&tUoe,o0e$Oj,NG&Jbl
/TES@$t"4F'VW&^!'Ia%ZaDq_`uINo:[>T`ePZ8m&.Q(UGafp7>f&\.%2fb@bXF@`XhALk<*usVY3YRG
jb^S\);;cnU\<Y+G%nY!]d5u`HaWO;*?2VbF=j4iSJtb,qSWQQ2EjT2Z2e;F<ps<p+?384"^^@g0L?p>
i9VD3:Lk>dP_FGeq=_bT+2mE<c@0BQlQt9[@JI$cWZ!K'^D,^iN77Hplbp;P)<0c:".*VW?]Ic32]Abn
Y"56H#h_$R3_1a#gof\63\K$(Tn[:??t!YZLs@!qWt"lWdrTMr@?!@:OZ>KN3O:P4USh9gf&^M8fUna\
')R6M3LP;lF#(450>u_,[&01r5<#nnVk^rc^5i*$q2h&&^*G(_ee%Z:eV9<UPaM8t&34Q4+9^O4!XFEE
Wt8q[!\8ph[1J]Q"D.uAM\*rB!],KD0j->jPJh]#<YRuTaGEk!0dWWeYZeCBU_o'E@,Nlcl#S*"0T@?6
&s:%?:aRt'FZ:n.6Q,EFUIe?939:^.X_Um\\WSA_%WKp!VC=qL7n?IC.J#,$7AsMV$51eU7]o)T63QRZ
+ei_Qm3X-iau'T\W7uNbU8-HPWSQZMjiM(*$`\'q5b9C4r7o^O=#NQccg-Za2M$Cgl_'@8LnJaYa:7@g
JAr&^gpH=gDMQ];m%<]Hk%GEN\sj\@(p\%a\&``RCi@/X;0I&jV(')POqb85B`^k7fq'NtRl5RsPTdTV
VH@E!'Wfr-%Ik3.>TqjRYf0r;$?!,WfENk-'mA8GEt:VIBaX"q:GDOYATPbN8"0F(`t2t5[`m2Of(<=e
@_X7md4G!,(AftI2:`]%U4&#EJ@2PQ#aOhX<KZeoNJkc^n<hGfb#Dk`R=6h9k-TJ/YAlg6J2iHkM3f`X
"RMSUTVA)G'4J^jU.NF$N/H'O.5@;u,;2GR7V!mgQ!i9U\Z0Mr)Pl'<fX-[1%'(V[G;)$uNl>i9r`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:<hn`VcTO&1DTe3Fg4
MjgF1'8]#bQV+WTqSGhh<:*6X#qY:I"15s/cj)WeMT9*8]F8FE3GB][ODee6mA5U6>+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-<ZPYRha^mrFXC
k%_F9gbpe#4jC[a]uPQF*Tq)*-+k<ciJ71epbRY8K?5h!i&$)iK@kf`g+XM"pE0`/=+*qsoFW;S_XGR4
N+9Qn#^+NS3_Ji%4sW.5!i6%pITR-<Tnh+=7s$pt_0i$jo62ij9if,LfeiCZ>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!D<rqBEHMd`Vl'O7P/\tb
'inRl\t:$qDdac9OZNT!kV6bd[t[\.Ek]G(mnS8Z/;HkT!M:_e^.15df)"sCRn?>2(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<LVKpVKH.-(o:+Y/]a:FZD;kUPGJh)XE3?JVbM>-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*q<DU<ek/Pn>Ud/Xf6Zq&1AhJ1lS/o^A6=W;'9HXhr:M\qXH]2b\(<MiQid7u4U9H<
;YidQ6%71J'M3+[;IX_\T5`nfAR)+YFEMH_=>laRU3S$AN"r$W4paAlaV[s=L0BJMmjg^^Ci4j*P\*%?
2+gQ-a)<N[ptC%JcSEY+rs-=HOO&><OlMFA$sCRl5auM211"`E^H>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&<FKAI-ZY/*UA5:9&-^e1!\0S>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<=jCm<Q^jkL3FUK/RSJGj6HW.tr-2#?>r=<q87AB~>
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

View File

@ -14439,5 +14439,13 @@
"firstPage": 1,
"lastPage": 1,
"type": "eq"
},
{
"id": "issue17333",
"file": "pdfs/issue17333.pdf",
"md5": "3af896c003dea994c58ab4a875d59829",
"rounds": 1,
"lastPage": 1,
"type": "eq"
}
]