[ 
https://issues.apache.org/jira/browse/FOP-3054?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17499518#comment-17499518
 ] 

Simon Steiner edited comment on FOP-3054 at 3/1/22, 12:55 PM:
--------------------------------------------------------------

this is working for me

{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><fo:external-graphic 
src=\"classpath:607008182-eccd5bd3.PNG\"/></fo:block> " +
                "</fo:flow>\n" +
                "  </fo:page-sequence>\n" +
                "</fo:root>";

        FopFactoryBuilder fopFactoryBuilder = new FopFactoryBuilder(new 
File(".").toURI(), new MyResourceResolver());
        FopFactory fopFactory = fopFactoryBuilder.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}


was (Author: ssteiner1):
this is working for me

{code}

{color:#000080}public class {color}MyResolver {
{color:#000080}public static void {color}main(String[] args) 
{color:#000080}throws {color}Exception {
String fo = {color:#008000}"<?xml 
version={color}{color:#000080}\"{color}{color:#008000}1.0{color}{color:#000080}\"{color}{color:#008000}
 
encoding={color}{color:#000080}\"{color}{color:#008000}utf-8{color}{color:#000080}\"{color}{color:#008000}?>{color}{color:#000080}\n{color}{color:#008000}"
 {color}+
{color:#008000}"<fo:root 
xmlns:fo={color}{color:#000080}\"{color}{color:#008000}http://www.w3.org/1999/XSL/Format{color}{color:#000080}\"\n{color}{color:#008000}";
 {color}+
{color:#008000}" 
xmlns:fox={color}{color:#000080}\"{color}{color:#008000}http://xmlgraphics.apache.org/fop/extensions{color}{color:#000080}\"{color}{color:#008000}>{color}{color:#000080}\n{color}{color:#008000}"
 {color}+
{color:#008000}" 
<fo:layout-master-set>{color}{color:#000080}\n{color}{color:#008000}" {color}+
{color:#008000}" <fo:simple-page-master 
master-name={color}{color:#000080}\"{color}{color:#008000}simple{color}{color:#000080}\"{color}{color:#008000}
 
page-height={color}{color:#000080}\"{color}{color:#008000}27.9cm{color}{color:#000080}\"{color}{color:#008000}
 
page-width={color}{color:#000080}\"{color}{color:#008000}21.6cm{color}{color:#000080}\"{color}{color:#008000}>{color}{color:#000080}\n{color}{color:#008000}"
 {color}+
{color:#008000}" <fo:region-body 
/>{color}{color:#000080}\n{color}{color:#008000}" {color}+
{color:#008000}" 
</fo:simple-page-master>{color}{color:#000080}\n{color}{color:#008000}" {color}+
{color:#008000}" 
</fo:layout-master-set>{color}{color:#000080}\n{color}{color:#008000}" {color}+
{color:#008000}" <fo:page-sequence 
master-reference={color}{color:#000080}\"{color}{color:#008000}simple{color}{color:#000080}\"{color}{color:#008000}>{color}{color:#000080}\n{color}{color:#008000}"
 {color}+
{color:#008000}" <fo:flow 
flow-name={color}{color:#000080}\"{color}{color:#008000}xsl-region-body{color}{color:#000080}\"{color}{color:#008000}>{color}{color:#000080}\n{color}{color:#008000}"
 {color}+
{color:#008000}"<fo:block><fo:external-graphic 
src={color}{color:#000080}\"{color}{color:#008000}classpath:607008182-eccd5bd3.PNG{color}{color:#000080}\"{color}{color:#008000}/></fo:block>
 " {color}+
{color:#008000}"</fo:flow>{color}{color:#000080}\n{color}{color:#008000}" 
{color}+
{color:#008000}" 
</fo:page-sequence>{color}{color:#000080}\n{color}{color:#008000}" {color}+
{color:#008000}"</fo:root>"{color};

FopFactoryBuilder fopFactoryBuilder = {color:#000080}new 
{color}FopFactoryBuilder({color:#000080}new 
{color}File({color:#008000}"."{color}).toURI(), {color:#000080}new 
{color}MyResourceResolver());
FopFactory fopFactory = fopFactoryBuilder.build();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
FileOutputStream fos = {color:#000080}new 
{color}FileOutputStream({color:#008000}"/tmp/out.pdf"{color});
Fop fop = fopFactory.newFop({color:#008000}"application/pdf"{color}, 
foUserAgent, fos);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source src = {color:#000080}new {color}StreamSource({color:#000080}new 
{color}ByteArrayInputStream(fo.getBytes()));
Result res = {color:#000080}new {color}SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
fos.close();
}

{color:#000080}static class {color}MyResourceResolver {color:#000080}implements 
{color}ResourceResolver {
{color:#000080}public {color}Resource getResource(URI uri) 
{color:#000080}throws {color}IOException {
{color:#000080}if 
{color}({color:#008000}"classpath"{color}.equals(uri.getScheme())) {
String path = uri.toASCIIString().replace(uri.getScheme() + 
{color:#008000}":"{color}, {color:#008000}""{color});
InputStream is = getClass().getResourceAsStream(path);
{color:#000080}if {color}(is == {color:#000080}null{color}) {
{color:#000080}throw new {color}IOException(uri.toASCIIString());
}
{color:#000080}return new {color}Resource(is);
}
{color:#000080}return new {color}Resource(uri.toURL().openStream());
}

{color:#000080}public {color}OutputStream getOutputStream(URI uri) 
{color:#000080}throws {color}IOException {
{color:#000080}return new {color}FileOutputStream({color:#000080}new 
{color}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
>            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)

Reply via email to