]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugzilla #35937:
authorJeremias Maerki <jeremias@apache.org>
Sat, 30 Jul 2005 13:32:02 +0000 (13:32 +0000)
committerJeremias Maerki <jeremias@apache.org>
Sat, 30 Jul 2005 13:32:02 +0000 (13:32 +0000)
FormattingResults mechanism ported from maintenance branch to trunk.
Submitted by: Manuel Mall <mm.at.arcus.com.au>

Patch tweaked slightly to avoid the reference of Fop.java into the area package.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@226511 13f79535-47bb-0310-9956-ffa450edef68

examples/embedding/java/embedding/ExampleFO2PDF.java
src/java/org/apache/fop/apps/Fop.java
src/java/org/apache/fop/apps/FormattingResults.java [new file with mode: 0644]
src/java/org/apache/fop/apps/PageSequenceResults.java [new file with mode: 0644]
src/java/org/apache/fop/area/AreaTreeHandler.java
src/java/org/apache/fop/fo/FOTreeBuilder.java

index 388cdcaf4ba3661357547b8cd2605f5343090c0f..f67652fce592d471e24d57aa3527c74773603122 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,6 +37,8 @@ import javax.xml.transform.sax.SAXResult;
 // FOP
 import org.apache.fop.apps.Fop;
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FormattingResults;
+import org.apache.fop.apps.PageSequenceResults;
 
 /**
  * This class demonstrates the conversion of an FO file to PDF using FOP.
@@ -76,6 +78,18 @@ public class ExampleFO2PDF {
             
             // Start XSLT transformation and FOP processing
             transformer.transform(src, res);
+            
+            // Result processing
+            FormattingResults foResults = fop.getResults();
+            java.util.List pageSequences = foResults.getPageSequences();
+            for (java.util.Iterator it = pageSequences.iterator(); it.hasNext();) {
+                PageSequenceResults pageSequenceResults = (PageSequenceResults)it.next();
+                System.out.println("PageSequence " 
+                        + (String.valueOf(pageSequenceResults.getID()).length() > 0 
+                                ? pageSequenceResults.getID() : "<no id>") 
+                        + " generated " + pageSequenceResults.getPageCount() + " pages.");
+            }
+            System.out.println("Generated " + foResults.getPageCount() + " pages in total.");
 
         } catch (Exception e) {
             e.printStackTrace(System.err);
@@ -102,6 +116,7 @@ public class ExampleFO2PDF {
 
             //Setup input and output files            
             File fofile = new File(baseDir, "xml/fo/helloworld.fo");
+            //File fofile = new File(baseDir, "../fo/pagination/franklin_2pageseqs.fo");
             File pdffile = new File(outDir, "ResultFO2PDF.pdf");
 
             System.out.println("Input: XSL-FO (" + fofile + ")");
index 8e3938686485b135e75b14f8bb37aa8ea1d1bae5..171a6ce2f71b905d4cb51e9ad7b1f83f4f62247b 100644 (file)
@@ -61,6 +61,9 @@ public class Fop implements Constants {
     // FOUserAgent object to set processing options
     private FOUserAgent foUserAgent = null;
 
+    // FOTreeBuilder object to maintain reference for access to results
+    private FOTreeBuilder foTreeBuilder = null;
+
     /**
      * Constructor for use with already-created FOUserAgents
      * @param renderType the type of renderer to use.  Must be one of
@@ -133,7 +136,28 @@ public class Fop implements Constants {
      * @throws FOPException if setting up the DefaultHandler fails
      */
     public DefaultHandler getDefaultHandler() throws FOPException {
-        return new FOTreeBuilder(renderType, foUserAgent, stream);
+        if (foTreeBuilder == null) {
+            this.foTreeBuilder = new FOTreeBuilder(renderType, foUserAgent, stream);
+        }
+        return this.foTreeBuilder;
+    }
+
+    /**
+     * Returns the results of the rendering process. Information includes
+     * the total number of pages generated and the number of pages per
+     * page-sequence. Call this method only after the rendering process is
+     * finished. Note that the results are only available for output formats
+     * which make use of FOP's layout engine (PDF, PS, etc.).
+     * @return the results of the rendering process, or null for flow-oriented 
+     * output formats like RTF and MIF.
+     */
+    public FormattingResults getResults() {
+        if (foTreeBuilder == null) {
+            throw new IllegalStateException(
+                    "Results are only available after calling getDefaultHandler().");
+        } else {
+            return foTreeBuilder.getResults();
+        }
     }
 
     /**
diff --git a/src/java/org/apache/fop/apps/FormattingResults.java b/src/java/org/apache/fop/apps/FormattingResults.java
new file mode 100644 (file)
index 0000000..53c2d81
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright 1999-2003,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.apps;
+
+import java.util.List;
+
+import org.apache.fop.fo.pagination.PageSequence;
+
+/**
+ * Class for reporting back formatting results to the calling application.
+ */
+public class FormattingResults {
+
+    private int pageCount = 0;
+    private List pageSequences = null;
+
+    /**
+     * Constructor for the FormattingResults object
+     */
+    public FormattingResults() {
+    }
+
+    /**
+     * Gets the number of pages rendered
+     *
+     * @return   The number of pages overall
+     */
+    public int getPageCount() {
+        return this.pageCount;
+    }
+
+    /**
+     * Gets the results for the individual page-sequences.
+     *
+     * @return   A List with PageSequenceResults objects
+     */
+    public List getPageSequences() {
+        return this.pageSequences;
+    }
+
+    /**
+     * Resets this object
+     */
+    public void reset() {
+        this.pageCount = 0;
+        if (this.pageSequences != null) {
+            this.pageSequences.clear();
+        }
+    }
+
+    /**
+     * Reports the result of one page sequence rendering
+     * back into this object.
+     *
+     * @param pageSequence  the PageSequence which just completed rendering
+     * @param pageCount     the number of pages rendered for that PageSequence
+     */
+    public void haveFormattedPageSequence(PageSequence pageSequence, int pageCount) {
+        this.pageCount += pageCount;
+        if (this.pageSequences == null) {
+            this.pageSequences = new java.util.ArrayList();
+        }
+        this.pageSequences.add(
+                new PageSequenceResults(pageSequence.getId(),
+                                        pageCount));
+    }
+}
+
diff --git a/src/java/org/apache/fop/apps/PageSequenceResults.java b/src/java/org/apache/fop/apps/PageSequenceResults.java
new file mode 100644 (file)
index 0000000..1819840
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1999-2003,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.apps;
+
+/**
+ * Class for reporting back formatting results to the calling application. This
+ * particular class is used to report the results of a single page-sequence.
+ */
+public class PageSequenceResults {
+
+    private String id;
+    private int pageCount;
+
+    /**
+     * Constructor for the PageSequenceResults object
+     *
+     * @param id         ID of the page-sequence, if available
+     * @param pageCount  The number of resulting pages
+     */
+    public PageSequenceResults(String id, int pageCount) {
+        this.id = id;
+        this.pageCount = pageCount;
+    }
+
+    /**
+     * Gets the ID of the page-sequence if one was specified.
+     *
+     * @return   The ID
+     */
+    public String getID() {
+        return this.id;
+    }
+
+    /**
+     * Gets the number of pages that resulted by processing the page-sequence.
+     *
+     * @return   The number of pages generated
+     */
+    public int getPageCount() {
+        return this.pageCount;
+    }
+}
index 88b19d3c67f9893718612ad7c1130e6fdde52cd5..5619dcbb63765986afc1c68e8c4bd1d837daa9c9 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FormattingResults;
 import org.apache.fop.fo.FOEventHandler;
 import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.fo.pagination.Root;
@@ -92,6 +93,9 @@ public class AreaTreeHandler extends FOEventHandler {
     // Each idref has a HashSet of Resolvable objects containing that idref
     private Map unresolvedIDRefs = new HashMap();
 
+     // The formatting results to be handed back to the caller.
+    private FormattingResults results = new FormattingResults();
+
     private static Log log = LogFactory.getLog(AreaTreeHandler.class);
 
     /**
@@ -208,6 +212,15 @@ public class AreaTreeHandler extends FOEventHandler {
         return (List) idLocations.get(id);
     }
 
+    /**
+     * Get information about the rendered output, like
+     * number of pages created.
+     * @return the results structure
+     */
+    public FormattingResults getResults() {
+        return this.results;
+    }
+
     /**
      * Add an Resolvable object with an unresolved idref
      * @param idref the idref whose target id has not yet been located
@@ -256,10 +269,17 @@ public class AreaTreeHandler extends FOEventHandler {
         // If no main flow, nothing to layout!
         if (pageSequence.getMainFlow() != null) {
             PageSequenceLayoutManager pageSLM;
-            pageSLM =
-                getLayoutManagerMaker().makePageSequenceLayoutManager(this,
-                    pageSequence);
+            pageSLM = getLayoutManagerMaker().makePageSequenceLayoutManager(
+                    this, pageSequence);
             pageSLM.activateLayout();
+            this.results.haveFormattedPageSequence(pageSequence, 
+                    getAreaTreeModel().getPageCount(getAreaTreeModel().getPageSequenceCount()));
+            if (log.isDebugEnabled()) {
+                log.debug("Last page-sequence produced " 
+                        + getAreaTreeModel().getPageCount(
+                                getAreaTreeModel().getPageSequenceCount())
+                        + " pages.");
+            }
         }
     }
 
index 02f94dd7123ac1e141ceb3ee868dfdd4f2e0dbeb..ae0ee8a8f24bd83eb589116ffb0d2e00c229764f 100644 (file)
@@ -28,6 +28,8 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FormattingResults;
+import org.apache.fop.area.AreaTreeHandler;
 import org.apache.fop.render.RendererFactory;
 import org.apache.fop.util.Service;
 import org.apache.fop.fo.ElementMapping.Maker;
@@ -129,8 +131,7 @@ public class FOTreeBuilder extends DefaultHandler {
         addElementMapping("org.apache.fop.fo.extensions.ExtensionElementMapping");
 
         // add mappings from available services
-        Iterator providers =
-            Service.providers(ElementMapping.class);
+        Iterator providers = Service.providers(ElementMapping.class);
         if (providers != null) {
             while (providers.hasNext()) {
                 String str = (String)providers.next();
@@ -191,7 +192,8 @@ public class FOTreeBuilder extends DefaultHandler {
     public void characters(char[] data, int start, int length) 
         throws FOPException {
             if (currentFObj != null) {
-                currentFObj.addCharacters(data, start, start + length, currentPropertyList, locator);
+                currentFObj.addCharacters(data, start, start + length, 
+                        currentPropertyList, locator);
             }
     }
 
@@ -342,6 +344,30 @@ public class FOTreeBuilder extends DefaultHandler {
         throw e;
     }
 
+    /**
+     * Provides access to the underlying FOEventHandler object.
+     * @return the FOEventHandler object
+     */
+    public FOEventHandler getEventHandler() {
+        return foEventHandler;
+    }
+
+    /**
+     * Returns the results of the rendering process. Information includes
+     * the total number of pages generated and the number of pages per
+     * page-sequence.
+     * @return the results of the rendering process.
+     */
+    public FormattingResults getResults() {
+        if (getEventHandler() instanceof AreaTreeHandler) {
+            return ((AreaTreeHandler)getEventHandler()).getResults();
+        } else {
+            //No formatting results available for output formats no 
+            //involving the layout engine.
+            return null;   
+        }
+    }
+    
     /**
      * Resets this object for another run.
      */