StackOverFlowError with arabic characters - FOP issue or font issue?
<[email protected]> Thu, 21 Aug 2025 08:17:02 +0000
| Newsgroups | gmane.text.xml.fop.user |
|---|---|
| Message-ID | <BEVP281MB37423D8486389CA8F78F6AA0C132A@BEVP281MB3742.DEUP281.PROD.OUTLOOK.COM> |
--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_
Content-Type: text/plain; charset="windows-1256"
Content-Transfer-Encoding: quoted-printable
Hi,
I am having a problem when using FOP with an Arabic font (Hasubi, https://g=
ithub.com/eliheuer/hasubi-mono) and the following string: =E1=C3
Input XML:
<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<string>=E1=C3</string>
Stylesheet:
<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<xsl:stylesheet xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"
xmlns:fo=3D"http://www.w3.org/1999/XSL/Format" version=3D"1.0">
<xsl:output method=3D"xml" indent=3D"yes" encoding=3D"UTF-8"/>
<xsl:template match=3D"/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name=3D"A4" page-height=3D"29.7cm" pa=
ge-width=3D"21cm" margin=3D"1cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference=3D"A4">
<fo:flow flow-name=3D"xsl-region-body">
<xsl:apply-templates select=3D"string"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match=3D"string">
<fo:block font-family=3D"CustomFont" font-size=3D"10pt">
<xsl:value-of select=3D"."/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
Custom font Hasubi is defined in my fop.xconf:
<?xml version=3D"1.0"?>
<fop version=3D"1.0">
<strict-configuration>true</strict-configuration>
<strict-validation>false</strict-validation>
<base>.</base>
<renderers>
<renderer mime=3D"application/pdf">
<fonts>
<font kerning=3D"yes" embed-url=3D"file:///C:/Temp/Hasubi-M=
ono.ttf">
<font-triplet name=3D"CustomFont" style=3D"normal" weight=
=3D"normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
I have tested with OpenJDK 17 and FOP 2.11 on windows starting via commandl=
ine:
fop-2.11\fop\fop.bat -c fop.xconf -xml input.xml -xsl stylesheet.xsl -pdf o=
ut.pdf
Resulting in the following stacktrace:
Aug. 21, 2025 10:11:31 AM org.apache.fop.apps.FOUserAgent processEvent
INFORMATION: Rendered page #1.
Exception in thread "main" java.lang.StackOverflowError
at java.base/java.util.HashMap.putVal(HashMap.java:627)
at java.base/java.util.HashMap.put(HashMap.java:610)
at java.base/java.util.HashSet.add(HashSet.java:221)
at org.apache.fop.fonts.truetype.GlyfTable.retrieveComposedGlyphs(G=
lyfTable.java:225)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:158)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
(and so on)
So, the question: Is this a FOP issue (stack overflow should be detected/av=
oided) or is the font simply broken in some way? =96 Testing with other fon=
ts (e.g. Cascadia Mono or Noto Sans Arabic) works without issues.
Thanks,
Tim Weller
--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_
Content-Type: text/html; charset="windows-1256"
Content-Transfer-Encoding: quoted-printable
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dwindows-1=
256">
<meta name=3D"Generator" content=3D"Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Aptos",sans-serif;
mso-ligatures:standardcontextual;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=3D"DE" link=3D"#467886" vlink=3D"#96607D" style=3D"word-wrap:bre=
ak-word">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">Hi,<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I am having a problem when usin=
g FOP with an Arabic font (Hasubi,
<a href=3D"https://github.com/eliheuer/hasubi-mono">https://github.com/elih=
euer/hasubi-mono</a>) and the following string:
</span><span style=3D"font-family:"Arial",sans-serif">=E1=C3</spa=
n><span lang=3D"EN-US"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Input XML:<o:p></o:p></span></p=
>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><?xml version=3D"1.0&qu=
ot; encoding=3D"UTF-8"?><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><string></span><span styl=
e=3D"font-family:"Arial",sans-serif">=E1=C3</span><span lang=3D"E=
N-US"></string><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Stylesheet:<o:p></o:p></span></=
p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><?xml version=3D"1.0&qu=
ot; encoding=3D"UTF-8"?><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><xsl:stylesheet xmlns:xsl=3D=
"http://www.w3.org/1999/XSL/Transform"<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </span>xmlns:fo=3D"=
http://www.w3.org/1999/XSL/Format" version=3D"1.0"><o:p><=
/o:p></p>
<p class=3D"MsoNormal"> <span lang=3D"EN-US"><xsl:output method=3D=
"xml" indent=3D"yes" encoding=3D"UTF-8"/><=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <xsl:template match=
=3D"/"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <fo:root><o=
:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <fo:lay=
out-master-set><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <=
;fo:simple-page-master master-name=3D"A4" page-height=3D"29.=
7cm" page-width=3D"21cm" margin=3D"1cm"><o:p></=
o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; <fo:region-body/><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <=
;/fo:simple-page-master><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </fo:la=
yout-master-set><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <fo:pag=
e-sequence master-reference=3D"A4"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <=
;fo:flow flow-name=3D"xsl-region-body"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; <xsl:apply-templates select=3D"string"/><o:p></o:p></sp=
an></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <=
;/fo:flow><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </fo:pa=
ge-sequence><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </fo:root><=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </xsl:template><o:=
p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <xsl:template match=
=3D"string"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <fo:block font=
-family=3D"CustomFont" font-size=3D"10pt"><o:p></o:p=
></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <xsl:va=
lue-of select=3D"."/><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </fo:block>=
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> </span></xsl:template=
><o:p></o:p></p>
<p class=3D"MsoNormal"></xsl:stylesheet><o:p></o:p></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Custom font Hasubi is defined i=
n my fop.xconf:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><?xml version=3D"1.0&qu=
ot;?><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><fop version=3D"1.0&quo=
t;><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <strict-config=
uration>true</strict-configuration><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <strict-valida=
tion>false</strict-validation><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <base>.<=
/base><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <renderers>=
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> <=
;renderer mime=3D"application/pdf"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; <fonts><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; <font kerning=3D"yes" embed-url=3D&qu=
ot;file:///C:/Temp/Hasubi-Mono.ttf"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; <font-triplet name=3D"CustomFont&qu=
ot; style=3D"normal" weight=3D"normal"/><o:p></o:p><=
/span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &nb=
sp; </span></font><o:p></o:p></p>
<p class=3D"MsoNormal"> </fonts=
><o:p></o:p></p>
<p class=3D"MsoNormal"> </renderer><o:p></=
o:p></p>
<p class=3D"MsoNormal"> </renderers><o:p></o:p></p>
<p class=3D"MsoNormal"></fop><o:p></o:p></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I have tested with OpenJDK 17 a=
nd FOP 2.11 on windows starting via commandline:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">fop-2.11\fop\fop.bat -c fop.xco=
nf -xml input.xml -xsl stylesheet.xsl -pdf out.pdf<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Resulting in the following stac=
ktrace:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Aug. 21, 2025 10:11:31 AM org.a=
pache.fop.apps.FOUserAgent processEvent<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">INFORMATION: Rendered page #1.<=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Exception in thread "main&=
quot; java.lang.StackOverflowError<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at java.base/java.util.HashMap.putVal(HashMap.java:627)<o:p></o=
:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at java.base/java.util.HashMap.put(HashMap.java:610)<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at java.base/java.util.HashSet.add(HashSet.java:221)<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.retrieveComposedGlyp=
hs(GlyfTable.java:225)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:158)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"> &=
nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">(and so on)<o:p></o:p></span></=
p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">So, the question: Is this a FOP=
issue (stack overflow should be detected/avoided) or is the font simply br=
oken in some way? =96 Testing with other fonts (e.g. Cascadia Mono or Noto =
Sans Arabic) works without issues.<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Thanks,<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Tim Weller<o:p></o:p></span></p=
>
</div>
</body>
</html>
--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_--