[
https://issues.apache.org/jira/browse/FOP-3062?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17519706#comment-17519706
]
Richard Zowalla edited comment on FOP-3062 at 4/8/22 4:54 PM:
--------------------------------------------------------------
Thanks for updating the documentation as well as your time.
I tested the sample code: If I hard-code the path to SFArabic via <font
embed-url> the font is loaded and used (at least no exception / assertion error
is thrown)
{code:java}
Apr. 08, 2022 6:47:05 PM org.apache.fop.fo.properties.CommonHyphenation
getHyphChar
WARNUNG: Substituted specified hyphenation character (0x2d) with 0x20 because
the font doesn't have the specified hyphenation character: SFArabic,normal,400
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "t" (0x74, t) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "e" (0x65, e) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "s" (0x73, s) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "2" (0x32, two) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
INFORMATION: Rendered page #1.{code}
My issue is, that I do +*not*+ want to use *SFArabic* at all (it is just a
system font, which is available by default on an MacOS 12.3 and cannot be
deleted), which is detected during auto scanning by fop.
So I am not quite sure, if specifying the specific font will help with the
original issue which occurs during auto-scanning.
Is there a configuration option to exclude fonts from being scanned?
*The good news:*
I was able to reproduce it on my Ubuntu 20.04 LTS machine by adjusting your
code snippet (without our complicated EAR / EE setup). Started the code with
*-ea* via JVM params.
Note: I installed the *SFArabic.ttf* system-wide and re-generated the Ubuntu
font cache.
{code:java}
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopConfParser;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FopFactoryBuilder;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
public class ComplexScript {
public static void main(String[] args) throws Exception {
String fo = "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\"\n"
+
"
xmlns:fox=\"http://xmlgraphics.apache.org/fop/extensions\">\n" +
" <fo:layout-master-set>\n" +
" <fo:simple-page-master master-name=\"simple\"
page-height=\"27.9cm\" page-width=\"21.6cm\">\n" +
" <fo:region-body />\n" +
" </fo:simple-page-master>\n" +
" </fo:layout-master-set>\n" +
" <fo:page-sequence master-reference=\"simple\">\n" +
" <fo:flow flow-name=\"xsl-region-body\">\n" +
" <fo:block font-family=\"SFArabic\">test2</fo:block> \n" +
"</fo:flow>\n" +
" </fo:page-sequence>\n" +
"</fo:root>\n";
String fopxconf = """
<fop version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/foschema/fop-configuration.xsd?view=co">
<!-- Renderer -->
<renderers> <!-- PDF Renderer -->
<renderer mime="application/pdf"> <!--
Filter -->
<filterList>
<value>null</value>
</filterList>
<!-- Filter Image Settings-->
<filterList type="image">
<value>flate</value>
<value>ascii-85</value>
</filterList>
<!-- Font Configuration -->
<fonts>
<auto-detect/>
</fonts>
</renderer>
</renderers>
<fonts>
<auto-detect/>
</fonts>
</fop>\s
""";
FopFactoryBuilder builder =
new FopConfParser(new
ByteArrayInputStream(fopxconf.getBytes()), new
File(".").toURI()).getFopFactoryBuilder();
builder.setComplexScriptFeatures(false);
FopFactory fopFactory = builder.build();
//disable the font cache on purpose to reproduce the issue
fopFactory.getFontManager().disableFontCache();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
FileOutputStream fos = new FileOutputStream("/tmp/out.pdf");
Fop fop = fopFactory.newFop("application/pdf", foUserAgent, fos);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source src = new StreamSource(new ByteArrayInputStream(fo.getBytes()));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
fos.close();
}
}
{code}
Meanwhile, I pushed a fix in TomEE to allow users to disable assertions in the
TomEE maven plugin. Nevertheless, I hope, that we can find some sort of
solution in fop to handle such cases :)
was (Author: rzo1):
Thanks for updating the documentation as well as your time.
I tested the sample code: If I hard-code the path to SFArabic via <font
embed-url> the font is loaded and used (at least no exception / assertion error
is thrown)
{code:java}
Apr. 08, 2022 6:47:05 PM org.apache.fop.fo.properties.CommonHyphenation
getHyphChar
WARNUNG: Substituted specified hyphenation character (0x2d) with 0x20 because
the font doesn't have the specified hyphenation character: SFArabic,normal,400
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "t" (0x74, t) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "e" (0x65, e) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "s" (0x73, s) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
WARNUNG: Glyph "2" (0x32, two) not available in font ".SFArabic-Regular".
Apr. 08, 2022 6:47:05 PM org.apache.fop.events.LoggingEventListener processEvent
INFORMATION: Rendered page #1.{code}
My issue is, that I do +*not*+ want to use *SFArabic* at all (it is just a
system font, which is available by default on an MacOS 12.3 and cannot be
deleted), which is detected during auto scanning by fop.
So I am not quite sure, if specifying the specific font will help with the
original issue which occurs during auto-scanning.
Is there a configuration option to exclude fonts from being scanned?
The good news: I was able to reproduce it on my Ubuntu 20.04 LTS machine by
adjusting your code snippet as follows.
Note: I installed the *SFArabic.ttf* system-wide and re-generated the Ubuntu
font cache.
{code:java}
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopConfParser;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FopFactoryBuilder;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
public class ComplexScript {
public static void main(String[] args) throws Exception {
String fo = "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\"\n"
+
"
xmlns:fox=\"http://xmlgraphics.apache.org/fop/extensions\">\n" +
" <fo:layout-master-set>\n" +
" <fo:simple-page-master master-name=\"simple\"
page-height=\"27.9cm\" page-width=\"21.6cm\">\n" +
" <fo:region-body />\n" +
" </fo:simple-page-master>\n" +
" </fo:layout-master-set>\n" +
" <fo:page-sequence master-reference=\"simple\">\n" +
" <fo:flow flow-name=\"xsl-region-body\">\n" +
" <fo:block font-family=\"SFArabic\">test2</fo:block> \n" +
"</fo:flow>\n" +
" </fo:page-sequence>\n" +
"</fo:root>\n";
String fopxconf = """
<fop version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/foschema/fop-configuration.xsd?view=co">
<!-- Renderer -->
<renderers> <!-- PDF Renderer -->
<renderer mime="application/pdf"> <!--
Filter -->
<filterList>
<value>null</value>
</filterList>
<!-- Filter Image Settings-->
<filterList type="image">
<value>flate</value>
<value>ascii-85</value>
</filterList>
<!-- Font Configuration -->
<fonts>
<auto-detect/>
</fonts>
</renderer>
</renderers>
<fonts>
<auto-detect/>
</fonts>
</fop>\s
""";
FopFactoryBuilder builder =
new FopConfParser(new
ByteArrayInputStream(fopxconf.getBytes()), new
File(".").toURI()).getFopFactoryBuilder();
builder.setComplexScriptFeatures(false);
FopFactory fopFactory = builder.build();
//disable the font cache on purpose to reproduce the issue
fopFactory.getFontManager().disableFontCache();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
FileOutputStream fos = new FileOutputStream("/tmp/out.pdf");
Fop fop = fopFactory.newFop("application/pdf", foUserAgent, fos);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source src = new StreamSource(new ByteArrayInputStream(fo.getBytes()));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
fos.close();
}
}
{code}
> AssertionError in GlyphPositioningTable$DeviceTable with SFArabic.ttf
> ---------------------------------------------------------------------
>
> Key: FOP-3062
> URL: https://issues.apache.org/jira/browse/FOP-3062
> Project: FOP
> Issue Type: Bug
> Components: unqualified
> Affects Versions: 2.7
> Reporter: Richard Zowalla
> Priority: Major
> Attachments: SFArabic.ttf, image-2022-04-08-16-09-21-254.png
>
>
> While working on a M1 Mac OS system:
>
> {code:java}
> Java version: 17.0.2, vendor: Oracle Corporation, runtime:
> /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/HomeDefault locale:
> de_DE, platform encoding: UTF-8
> OS name: "mac os x", version: "12.3", arch: "aarch64", family: "mac"{code}
> I get the following AssertionError with a simple FOP config as follows:
> {code:java}
> <fop version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
> xsi:noNamespaceSchemaLocation="http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/foschema/fop-configuration.xsd?view=co">
> <!-- Renderer -->
> <renderers> <!-- PDF Renderer -->
> <renderer mime="application/pdf"> <!-- Filter -->
> <filterList>
> <value>null</value>
> </filterList>
> <!-- Filter Image Settings-->
> <filterList type="image">
> <value>flate</value>
> <value>ascii-85</value>
> </filterList>
> <!-- Font Configuration -->
> <fonts> <!-- <auto-detect/> -->
> <directory>/Users/abc/uploads/fonts</directory>
> </fonts>
> </renderer>
> </renderers>
> <fonts>
> <!-- <auto-detect/> -->
> <directory>/Users/abc/uploads/fonts</directory>
> </fonts>
> </fop> {code}
> The font, which violates the assertion in DeviceTable is:
> *[file:/System/Library/Fonts/SFArabic.ttf*|file:///System/Library/Fonts/SFArabic.ttf*]
>
> *Stacktrace:*
> {code:java}
> java.lang.AssertionError at
> org.apache.fop.complexscripts.fonts.GlyphPositioningTable$DeviceTable.<init>(GlyphPositioningTable.java:1774)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readPosDeviceTable(OTFAdvancedTypographicTableReader.java:1727)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readPosAnchor(OTFAdvancedTypographicTableReader.java:2051)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readMarkToLigaturePosTableFormat1(OTFAdvancedTypographicTableReader.java:2345)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readMarkToLigaturePosTable(OTFAdvancedTypographicTableReader.java:2371)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readGPOSSubtable(OTFAdvancedTypographicTableReader.java:3122)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readLookupTable(OTFAdvancedTypographicTableReader.java:3191)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readLookupList(OTFAdvancedTypographicTableReader.java:3218)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readCommonLayoutTables(OTFAdvancedTypographicTableReader.java:3239)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readGPOS(OTFAdvancedTypographicTableReader.java:3499)
> at
> org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readAll(OTFAdvancedTypographicTableReader.java:84)
> at
> org.apache.fop.fonts.truetype.OpenFont.handleCharacterSpacing(OpenFont.java:889)
> at org.apache.fop.fonts.truetype.OpenFont.readFont(OpenFont.java:861) at
> org.apache.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:119) at
> org.apache.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:103) at
> org.apache.fop.fonts.FontLoader.getFont(FontLoader.java:126) at
> org.apache.fop.fonts.FontLoader.loadFont(FontLoader.java:110) at
> org.apache.fop.fonts.autodetect.FontInfoFinder.find(FontInfoFinder.java:253)
> at org.apache.fop.fonts.FontAdder.add(FontAdder.java:63) at
> org.apache.fop.fonts.FontDetectorFactory$DefaultFontDetector.detect(FontDetectorFactory.java:105)
> at org.apache.fop.fonts.FontManager.autoDetectFonts(FontManager.java:229) at
> org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:82)
> at
> org.apache.fop.render.PrintRendererConfigurator.getCustomFontCollection(PrintRendererConfigurator.java:147)
> at
> org.apache.fop.render.PrintRendererConfigurator.setupFontInfo(PrintRendererConfigurator.java:127)
> at org.apache.fop.render.intermediate.IFUtil.setupFonts(IFUtil.java:170) at
> org.apache.fop.render.intermediate.IFRenderer.setupFontInfo(IFRenderer.java:187)
> at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:75) at
> org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:135) at
> org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:105) at
> org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:363)
> at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:109) at
> org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:104) at
> org.apache.fop.apps.Fop.<init>(Fop.java:78) at
> org.apache.fop.apps.FOUserAgent.newFop(FOUserAgent.java:184) at
> org.apache.fop.apps.FopFactory.newFop(FopFactory.java:234){code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)