You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by Dario Laera <la...@cs.unibo.it> on 2008/09/17 18:16:15 UTC

Caching of pages with forward references

Hi all,

in fop documentation site there are at least two page that talk about  
memory caching on disk for page that contains unresolved forward  
references: http://xmlgraphics.apache.org/fop/dev/design/layout.html#issue-area-recycle 
  and http://xmlgraphics.apache.org/fop/dev/design/ 
areas.html#caching . I was thinking that this was just a nice idea not  
implemented yet: my tests with hundreds of single page page-sequences  
was often ending in OutOfMemory due to the "Page X of Y" block in the  
footer. But looking at the code in FOP trunk I found the class  
CachedRenderPagesModel that seems to do that caching; unfortunately  
this class is never instantiated.
Was this class intended for unresolved forward reference issue? What  
is missing for having this kind of caching working? Is someone working  
on it?

Thanks in advances
Dario

Re: Caching of pages with forward references

Posted by Dario Laera <la...@cs.unibo.it>.
Il giorno 17/set/08, alle ore 22:32, Jeremias Maerki ha scritto:
>
> At any rate, this approach may help in certain situations (such as  
> many
> small page-sequences). But in situation with large page-sequences, it
> won't help as the layout engine can't process the FO tree while it is
> built and because finished FOs are not released before the page- 
> sequence
> is finished. Have fun.

It's nice to see this working! I think that sooner or later I will  
look into it closer, it's an important feature and may become more  
important (and useful) if IPLB would allow to finalize pages before  
the end of the page-sequence.

Dario

Re: Caching of pages with forward references

Posted by Jeremias Maerki <de...@jeremias-maerki.ch>.
Yes, CachedRenderPagesModel lies around unused but it still works.
Here's some (uncleaned) example code that shows how to use it.

public class AreaTreeTests {

    private static class MyAreaTreeHandler extends AreaTreeHandler {

        public MyAreaTreeHandler(FOUserAgent userAgent, String outputFormat,
                OutputStream stream) throws FOPException {
            super(userAgent, outputFormat, stream);
        }

        protected void setupModel(FOUserAgent userAgent, String outputFormat, OutputStream stream) throws FOPException {
            //super.setupModel(userAgent, outputFormat, stream);
            this.model = new CachedRenderPagesModel(userAgent, outputFormat, fontInfo,
                    stream);
        }

    }

    private static void doit() throws Exception {
        FopFactory fopFactory = FopFactory.newInstance();
        fopFactory.setUserConfig(new File("C:/Dev/FOP/main/userconfig.xml"));

        final int maxRepeats = 100;
        for (int repeat = 0; repeat < maxRepeats; repeat++) {
            FOUserAgent ua = fopFactory.newFOUserAgent();
            //String outputFormat = MimeConstants.MIME_FOP_AREA_TREE;
            //outputFormat = MimeConstants.MIME_PDF;
            String outputFormat = MimeConstants.MIME_POSTSCRIPT;

            //File foFile = new File("C:/Dev/FOP/main/xml-fop-temp/examples/fo/basic/readme.fo");
            File foFile = new File("C:/Dev/FOP/temp/tree-model-check.fo");
            //File outFile = new File("D:/out.at.xml");
            File outFile = new File("D:/out.ps");


            OutputStream out = new FileOutputStream(outFile);
            out = new BufferedOutputStream(out);
            try {
                Fop fop = fopFactory.newFop(outputFormat, ua, out);

                AreaTreeHandler atHandler = new MyAreaTreeHandler(ua, outputFormat, out);
                ua.setFOEventHandlerOverride(atHandler);

                TransformerFactory tf = TransformerFactory.newInstance();
                Transformer transformer = tf.newTransformer();
                Source src = new StreamSource(foFile);
                Result res = new SAXResult(fop.getDefaultHandler());
                transformer.transform(src, res);
            } finally {
                IOUtils.closeQuietly(out);
            }
        }

    }

    public static void main(String[] args) {
        try {
            doit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

This should allow you to do a few experiments.

At any rate, this approach may help in certain situations (such as many
small page-sequences). But in situation with large page-sequences, it
won't help as the layout engine can't process the FO tree while it is
built and because finished FOs are not released before the page-sequence
is finished. Have fun.

On 17.09.2008 18:16:15 Dario Laera wrote:
> Hi all,
> 
> in fop documentation site there are at least two page that talk about  
> memory caching on disk for page that contains unresolved forward  
> references: http://xmlgraphics.apache.org/fop/dev/design/layout.html#issue-area-recycle 
>   and http://xmlgraphics.apache.org/fop/dev/design/ 
> areas.html#caching . I was thinking that this was just a nice idea not  
> implemented yet: my tests with hundreds of single page page-sequences  
> was often ending in OutOfMemory due to the "Page X of Y" block in the  
> footer. But looking at the code in FOP trunk I found the class  
> CachedRenderPagesModel that seems to do that caching; unfortunately  
> this class is never instantiated.
> Was this class intended for unresolved forward reference issue? What  
> is missing for having this kind of caching working? Is someone working  
> on it?
> 
> Thanks in advances
> Dario




Jeremias Maerki