[
https://issues.apache.org/jira/browse/FOP-3054?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17499576#comment-17499576
]
Simon Steiner commented on FOP-3054:
------------------------------------
or:
{code}
public class MyResolver {
public static void main(String[] args) throws Exception {
String fo = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<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=\"DejaVuSans\">test</fo:block> " +
"</fo:flow>\n" +
" </fo:page-sequence>\n" +
"</fo:root>";
String fopxconf = "<fop>\n" +
" <renderers>\n" +
" <renderer mime=\"application/pdf\">\n" +
" <fonts>\n" +
" <font kerning=\"yes\"
embed-url=\"classpath:ARIAL.TTF\">\n" +
" <font-triplet name=\"DejaVuSans\" style=\"normal\"
weight=\"normal\"/>\n" +
" </font>\n" +
" </fonts>\n" +
" </renderer>\n" +
" </renderers>\n" +
"</fop>";
ResourceResolver rr = new MyResourceResolver();
FopFactoryBuilder confBuilder = new FopConfParser(new
ByteArrayInputStream(fopxconf.getBytes()),
EnvironmentalProfileFactory.createRestrictedIO(new URI("."),
rr)).getFopFactoryBuilder();
FopFactory fopFactory = confBuilder.build();
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();
}
static class MyResourceResolver implements ResourceResolver {
public Resource getResource(URI uri) throws IOException {
if ("classpath".equals(uri.getScheme())) {
String path = uri.toASCIIString().replace(uri.getScheme() +
":", "");
InputStream is = getClass().getResourceAsStream(path);
if (is == null) {
throw new IOException(uri.toASCIIString());
}
return new Resource(is);
}
return new Resource(uri.toURL().openStream());
}
public OutputStream getOutputStream(URI uri) throws IOException {
return new FileOutputStream(new File(uri));
}
}
}
{code}
> FOP Customer Resolver not invoked in version 2.7
> ------------------------------------------------
>
> Key: FOP-3054
> URL: https://issues.apache.org/jira/browse/FOP-3054
> Project: FOP
> Issue Type: Bug
> Affects Versions: 2.7
> Reporter: tntim96
> Assignee: Simon Steiner
> Priority: Major
>
> The following FOP config and customer resolver works with FOP 2.6
> {code:java}
> ResourceResolver rr = ResourceResolverFactory
> .createTempAwareResourceResolver(new InMemoryTempResourceResolver(), new
> CustomResolver());
> {code}
> {code:java}
> class CustomResolver implements ResourceResolver {
> public org.apache.xmlgraphics.io.Resource getResource(URI uri) throws
> IOException {
> if (uri.toString().startsWith("classpath:")) {
> String actualPath = uri.toString().substring("classpath:".length());
> try {
> ClassPathResource resource = new ClassPathResource(actualPath);
> InputStream resourceAsStream = resource.getInputStream();
> {code}
> {code:java}
> <?xml version="1.0" encoding="utf-8" ?>
> <fop>
> <renderers>
> <renderer mime="application/pdf">
> <fonts>
> <font kerning="yes"
> embed-url="classpath:/somepath/DejaVuSans-Regular.ttf">
> <font-triplet name="DejaVuSans" style="normal" weight="normal"/>
> </font>
> </fonts>
> </renderer>
> </renderers>
> </fop> {code}
> ...but with 2.7 we get the error:
> {noformat}
> 16:04:03.006 [main] ERROR org.apache.fop.fonts.LazyFont - Failed to read font
> file classpath:/somepath/DejaVuSans-Regular.ttf unknown protocol: classpath
> java.net.MalformedURLException: unknown protocol: classpath
> at java.net.URL.<init>(URL.java:600)
> at java.net.URL.<init>(URL.java:490)
> at java.net.URL.<init>(URL.java:439)
> at java.net.URI.toURL(URI.java:1089)
> at
> org.apache.fop.apps.io.ResourceResolverFactory$NormalResourceResolver.getResource(ResourceResolverFactory.java:224)
> at
> org.apache.fop.apps.io.ResourceResolverFactory$TempAwareResourceResolver.getResource(ResourceResolverFactory.java:152)
> at
> org.apache.fop.apps.io.ResourceResolverFactory$DefaultResourceResolver.getResource(ResourceResolverFactory.java:121)
> at
> org.apache.fop.apps.io.InternalResourceResolver.getResource(InternalResourceResolver.java:92)
> at org.apache.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:113)
> 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.LazyFont.load(LazyFont.java:121)
> at org.apache.fop.fonts.LazyFont.getAscender(LazyFont.java:237)
> at org.apache.fop.fonts.Font.getAscender(Font.java:120)
> at
> org.apache.fop.layoutmgr.BlockLayoutManager.initialize(BlockLayoutManager.java:82)
> at
> org.apache.fop.layoutmgr.AbstractLayoutManager.getChildLM(AbstractLayoutManager.java:118)
> at
> org.apache.fop.layoutmgr.FlowLayoutManager.getNextKnuthElements(FlowLayoutManager.java:128)
> at
> org.apache.fop.layoutmgr.FlowLayoutManager.getNextKnuthElements(FlowLayoutManager.java:69)
> at
> org.apache.fop.layoutmgr.PageBreaker.getNextKnuthElements(PageBreaker.java:252)
> at
> org.apache.fop.layoutmgr.AbstractBreaker.getNextBlockList(AbstractBreaker.java:675)
> {noformat}
> It seems like our custom resolver is no longer invoked.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)