aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop
diff options
context:
space:
mode:
authorKelly Campbell <kellyc@apache.org>2001-02-06 07:34:48 +0000
committerKelly Campbell <kellyc@apache.org>2001-02-06 07:34:48 +0000
commit4e96b8b7a7647e183a5a916a1c42deddbd91c6af (patch)
tree0cdbe16d0b2ebe56d997d912d8672a7cbf2477b6 /src/org/apache/fop
parent1a3636171f599e31d9964fbcf6e32cfc3e6fbbf3 (diff)
downloadxmlgraphics-fop-4e96b8b7a7647e183a5a916a1c42deddbd91c6af.tar.gz
xmlgraphics-fop-4e96b8b7a7647e183a5a916a1c42deddbd91c6af.zip
Added support for PDF outlines (aka bookmarks). See the example in
docs/examples/fo/pdfoutline.fo for an example. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194025 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop')
-rw-r--r--src/org/apache/fop/apps/CommandLine.java2
-rw-r--r--src/org/apache/fop/apps/XalanCommandLine.java3
-rw-r--r--src/org/apache/fop/datatypes/IDReferences.java2
-rw-r--r--src/org/apache/fop/extensions/ExtensionElementMapping.java64
-rw-r--r--src/org/apache/fop/extensions/ExtensionObj.java98
-rw-r--r--src/org/apache/fop/extensions/ExtensionPropertyListMapping.java77
-rw-r--r--src/org/apache/fop/extensions/Label.java86
-rw-r--r--src/org/apache/fop/extensions/Outline.java156
-rw-r--r--src/org/apache/fop/fo/pagination/Root.java106
-rw-r--r--src/org/apache/fop/layout/AreaTree.java17
-rw-r--r--src/org/apache/fop/layout/ExtensionArea.java79
-rw-r--r--src/org/apache/fop/pdf/PDFDocument.java76
-rw-r--r--src/org/apache/fop/pdf/PDFGoTo.java7
-rw-r--r--src/org/apache/fop/pdf/PDFOutline.java218
-rw-r--r--src/org/apache/fop/pdf/PDFRoot.java21
-rw-r--r--src/org/apache/fop/render/pdf/PDFRenderer.java55
-rw-r--r--src/org/apache/fop/tools/anttasks/Fop.java3
17 files changed, 997 insertions, 73 deletions
diff --git a/src/org/apache/fop/apps/CommandLine.java b/src/org/apache/fop/apps/CommandLine.java
index e8b0889d8..f26ff7b9b 100644
--- a/src/org/apache/fop/apps/CommandLine.java
+++ b/src/org/apache/fop/apps/CommandLine.java
@@ -166,8 +166,10 @@ public class CommandLine {
Version.getVersion());
driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+ driver.addElementMapping("org.apache.fop.extensions.ExtensionElementMapping");
driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
+ driver.addPropertyList("org.apache.fop.extensions.ExtensionPropertyListMapping");
driver.buildFOTree(parser, fileInputSource(foFile));
driver.format();
driver.setOutputStream(new FileOutputStream(pdfFile));
diff --git a/src/org/apache/fop/apps/XalanCommandLine.java b/src/org/apache/fop/apps/XalanCommandLine.java
index e413a9229..09ef2ccc7 100644
--- a/src/org/apache/fop/apps/XalanCommandLine.java
+++ b/src/org/apache/fop/apps/XalanCommandLine.java
@@ -300,8 +300,11 @@ public class XalanCommandLine {
version);
driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+ driver.addElementMapping("org.apache.fop.extensions.ExtensionElementMapping");
driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
+ driver.addPropertyList("org.apache.fop.extensions.ExtensionPropertyListMapping");
+
OutputStream stream = new BufferedOutputStream(new FileOutputStream(pdfFile));
driver.setOutputStream(stream);
driver.buildFOTree(parser, new InputSource(reader));
diff --git a/src/org/apache/fop/datatypes/IDReferences.java b/src/org/apache/fop/datatypes/IDReferences.java
index edeeba2ca..7dcc02b70 100644
--- a/src/org/apache/fop/datatypes/IDReferences.java
+++ b/src/org/apache/fop/datatypes/IDReferences.java
@@ -229,7 +229,7 @@ public class IDReferences {
* @param id the id whose reference to use
* @return reference to GoTo object
*/
- public String getInternalLinkGotToReference(String id)
+ public String getInternalLinkGoToReference(String id)
{
IDNode node = (IDNode)idReferences.get(id);
return node.getInternalLinkGoToReference();
diff --git a/src/org/apache/fop/extensions/ExtensionElementMapping.java b/src/org/apache/fop/extensions/ExtensionElementMapping.java
new file mode 100644
index 000000000..c3f1e5f4a
--- /dev/null
+++ b/src/org/apache/fop/extensions/ExtensionElementMapping.java
@@ -0,0 +1,64 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.extensions;
+
+import org.apache.fop.fo.*;
+
+public class ExtensionElementMapping implements ElementMapping {
+
+ public static final String URI = "http://xml.apache.org/fop/extensions";
+
+ public void addToBuilder(TreeBuilder builder) {
+ builder.addMapping(URI, "outline", Outline.maker());
+ builder.addMapping(URI, "label", Label.maker());
+ }
+}
diff --git a/src/org/apache/fop/extensions/ExtensionObj.java b/src/org/apache/fop/extensions/ExtensionObj.java
new file mode 100644
index 000000000..b508cf64b
--- /dev/null
+++ b/src/org/apache/fop/extensions/ExtensionObj.java
@@ -0,0 +1,98 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.extensions;
+
+import org.apache.fop.fo.*;
+import org.apache.fop.layout.*;
+import org.apache.fop.apps.FOPException;
+
+/**
+ * base class for extension objects
+ */
+public abstract class ExtensionObj extends FObj
+{
+ /**
+ *
+ * @param parent the parent formatting object
+ * @param propertyList the explicit properties of this object
+ */
+ public ExtensionObj(FObj parent, PropertyList propertyList) {
+ super(parent, propertyList);
+ }
+
+ /**
+ * Called for extensions within a page sequence or flow. These extensions
+ * are allowed to generate visible areas within the layout.
+ *
+ *
+ * @param area
+ */
+ public Status layout(Area area) throws FOPException {
+ ExtensionArea extArea = new ExtensionArea(this);
+ area.addChild(extArea);
+ return new Status(Status.OK);
+ }
+
+
+ /**
+ * Called for root extensions. Root extensions aren't allowed to generate
+ * any visible areas. They are used for extra items that don't show up in
+ * the page layout itself. For example: pdf outlines
+ *
+ * @param areaTree
+ */
+ public void format(AreaTree areaTree) throws FOPException {
+ ExtensionArea extArea = new ExtensionArea(this);
+ areaTree.addExtension(this);
+ }
+
+}
diff --git a/src/org/apache/fop/extensions/ExtensionPropertyListMapping.java b/src/org/apache/fop/extensions/ExtensionPropertyListMapping.java
new file mode 100644
index 000000000..029ea9996
--- /dev/null
+++ b/src/org/apache/fop/extensions/ExtensionPropertyListMapping.java
@@ -0,0 +1,77 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.extensions;
+
+
+import org.apache.fop.fo.properties.ExtensionPropertyMapping;
+import org.apache.fop.fo.PropertyListMapping;
+import org.apache.fop.fo.TreeBuilder;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+public class ExtensionPropertyListMapping implements PropertyListMapping {
+
+ public void addToBuilder(TreeBuilder builder) {
+
+ builder.addPropertyList(ExtensionElementMapping.URI,
+ ExtensionPropertyMapping.getGenericMappings());
+ /* Add any element mappings */
+ for (Enumeration e = ExtensionPropertyMapping.getElementMappings();
+ e.hasMoreElements();) {
+ String elem = (String)e.nextElement();
+ builder.addElementPropertyList(ExtensionElementMapping.URI, elem,
+ ExtensionPropertyMapping.getElementMapping(elem));
+ }
+
+ }
+}
diff --git a/src/org/apache/fop/extensions/Label.java b/src/org/apache/fop/extensions/Label.java
new file mode 100644
index 000000000..9849193a1
--- /dev/null
+++ b/src/org/apache/fop/extensions/Label.java
@@ -0,0 +1,86 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.extensions;
+
+import org.apache.fop.fo.*;
+
+
+public class Label extends ExtensionObj
+{
+ private String _label = "";
+
+ public static class Maker extends FObj.Maker {
+ public FObj make(FObj parent, PropertyList propertyList)
+ {
+ return new Label(parent, propertyList);
+ }
+ }
+
+ public static FObj.Maker maker() {
+ return new Label.Maker();
+ }
+
+ public Label(FObj parent, PropertyList propertyList) {
+ super(parent, propertyList);
+ }
+
+ protected void addCharacters(char data[], int start, int end) {
+ _label += new String(data, start, end-start);
+ }
+
+ public String toString()
+ {
+ return _label;
+ }
+
+
+}
diff --git a/src/org/apache/fop/extensions/Outline.java b/src/org/apache/fop/extensions/Outline.java
new file mode 100644
index 000000000..ee70ce529
--- /dev/null
+++ b/src/org/apache/fop/extensions/Outline.java
@@ -0,0 +1,156 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.extensions;
+
+import org.apache.fop.fo.*;
+import org.apache.fop.pdf.PDFGoTo;
+import org.apache.fop.pdf.PDFAction;
+import org.apache.fop.datatypes.IDReferences;
+import org.apache.fop.messaging.MessageHandler;
+
+import java.util.*;
+
+
+public class Outline extends ExtensionObj
+{
+ private Label _label;
+ private Vector _outlines = new Vector();
+
+ private String _internalDestination;
+ private String _externalDestination;
+
+ /** The parent outline object if it exists */
+ private Outline _parentOutline;
+
+ /** an opaque renderer context object, e.g. PDFOutline for PDFRenderer */
+ private Object _rendererObject;
+
+
+ public static class Maker extends FObj.Maker {
+ public FObj make(FObj parent, PropertyList propertyList)
+ {
+ return new Outline(parent, propertyList);
+ }
+ }
+
+ public static FObj.Maker maker() {
+ return new Outline.Maker();
+ }
+
+ public Outline(FObj parent, PropertyList propertyList) {
+ super(parent, propertyList);
+
+ _internalDestination = this.properties.get("internal-destination").getString();
+ _externalDestination = this.properties.get("external-destination").getString();
+ if (_externalDestination != null && !_externalDestination.equals("")) {
+ MessageHandler.errorln("WARNING: fox:outline external-destination not supported currently.");
+ }
+
+ if (_internalDestination == null || _internalDestination.equals("")) {
+ MessageHandler.errorln("WARNING: fox:outline requires an internal-destination.");
+ }
+
+ for (FONode node = getParent(); node != null; node = node.getParent()) {
+ if (node instanceof Outline) {
+ _parentOutline = (Outline)node;
+ break;
+ }
+ }
+
+ }
+
+ protected void addChild(FONode obj)
+ {
+ if (obj instanceof Label) {
+ _label = (Label)obj;
+ }
+ else if (obj instanceof Outline) {
+ _outlines.add(obj);
+ }
+ super.addChild(obj);
+ }
+
+
+ public void setRendererObject(Object o)
+ {
+ _rendererObject = o;
+ }
+
+ public Object getRendererObject()
+ {
+ return _rendererObject;
+ }
+
+ public Outline getParentOutline()
+ {
+ return _parentOutline;
+ }
+
+ public Label getLabel()
+ {
+ return _label == null?new Label(this,this.properties):_label;
+ }
+
+ public Vector getOutlines()
+ {
+ return _outlines;
+ }
+
+ public String getInternalDestination()
+ {
+ return _internalDestination;
+ }
+
+
+
+}
+
diff --git a/src/org/apache/fop/fo/pagination/Root.java b/src/org/apache/fop/fo/pagination/Root.java
index 23546b083..58eb8ab28 100644
--- a/src/org/apache/fop/fo/pagination/Root.java
+++ b/src/org/apache/fop/fo/pagination/Root.java
@@ -57,69 +57,79 @@ import org.apache.fop.fo.flow.*;
import org.apache.fop.fo.properties.*;
import org.apache.fop.layout.AreaTree;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.extensions.ExtensionObj;
// Java
import java.util.Vector;
import java.util.Enumeration;
+/**
+ * The fo:root formatting object. Contains page masters, root extensions,
+ * page-sequences.
+ */
public class Root extends FObj {
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent, PropertyList propertyList) throws FOPException {
- return new Root(parent, propertyList);
- }
- }
-
- public static FObj.Maker maker()
+
+ public static class Maker extends FObj.Maker {
+ public FObj make(FObj parent, PropertyList propertyList)
+ throws FOPException
{
- return new Root.Maker();
- }
-
- LayoutMasterSet layoutMasterSet;
- Vector pageSequences;
-
- protected Root(FObj parent, PropertyList propertyList) throws FOPException
- {
- super(parent, propertyList);
- this.name = "fo:root";
-
- pageSequences = new Vector();
- if (parent != null)
- {
- throw new FOPException("root must be root element");
- }
- }
-
-
- public void addPageSequence(PageSequence pageSequence)
- {
- this.pageSequences.addElement(pageSequence);
- }
-
-
- public LayoutMasterSet getLayoutMasterSet()
- {
- return this.layoutMasterSet;
+ return new Root(parent, propertyList);
}
+ }
+ public static FObj.Maker maker()
+ {
+ return new Root.Maker();
+ }
- public void format(AreaTree areaTree) throws FOPException
- {
-// MessageHandler.errorln(" Root[" + marker + "] ");
- if(layoutMasterSet == null)
- {
- throw new FOPException("No layout master set.");
- }
+ LayoutMasterSet layoutMasterSet;
+ Vector pageSequences;
- Enumeration e = pageSequences.elements();
- while (e.hasMoreElements())
- {
- ((PageSequence) e.nextElement()).format(areaTree);
- }
+ protected Root(FObj parent, PropertyList propertyList) throws FOPException
+ {
+ super(parent, propertyList);
+ this.name = "fo:root";
- }
+ pageSequences = new Vector();
+ if (parent != null)
+ {
+ throw new FOPException("root must be root element");
+ }
+ }
+ /** @deprecated handled by addChild now
+ */
+ public void addPageSequence(PageSequence pageSequence)
+ {
+ this.pageSequences.addElement(pageSequence);
+ }
+
+
+ public LayoutMasterSet getLayoutMasterSet()
+ {
+ return this.layoutMasterSet;
+ }
public void setLayoutMasterSet(LayoutMasterSet layoutMasterSet) {
this.layoutMasterSet = layoutMasterSet;
}
+
+ public void format(AreaTree areaTree) throws FOPException
+ {
+ // MessageHandler.errorln(" Root[" + marker + "] ");
+ if(layoutMasterSet == null) {
+ throw new FOPException("No layout master set.");
+ }
+
+ Enumeration e = children.elements();
+ while (e.hasMoreElements()) {
+ Object o = e.nextElement();
+ if (o instanceof PageSequence) {
+ ((PageSequence) o).format(areaTree);
+ }
+ else if (o instanceof ExtensionObj) {
+ ((ExtensionObj)o).format(areaTree);
+ }
+ }
+ }
}
diff --git a/src/org/apache/fop/layout/AreaTree.java b/src/org/apache/fop/layout/AreaTree.java
index 5b6574346..14f9377bf 100644
--- a/src/org/apache/fop/layout/AreaTree.java
+++ b/src/org/apache/fop/layout/AreaTree.java
@@ -56,6 +56,7 @@ import org.apache.fop.fo.flow.StaticContent;
import org.apache.fop.svg.*;
import org.apache.fop.render.Renderer;
import org.apache.fop.datatypes.IDReferences;
+import org.apache.fop.extensions.ExtensionObj;
// Java
import java.io.IOException;
@@ -73,6 +74,10 @@ public class AreaTree {
/* list of all the pages */
Vector pageList = new Vector();
+ /** List of root extension objects */
+ Vector rootExtensions = new Vector();
+
+
IDReferences idReferences = new IDReferences();
public void setFontInfo(FontInfo fontInfo) {
@@ -95,4 +100,16 @@ public class AreaTree {
{
return idReferences;
}
+
+ public void addExtension(ExtensionObj obj)
+ {
+ rootExtensions.addElement(obj);
+ }
+
+ public Vector getExtensions()
+ {
+ return rootExtensions;
+ }
+
+
}
diff --git a/src/org/apache/fop/layout/ExtensionArea.java b/src/org/apache/fop/layout/ExtensionArea.java
new file mode 100644
index 000000000..4d9d40795
--- /dev/null
+++ b/src/org/apache/fop/layout/ExtensionArea.java
@@ -0,0 +1,79 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.layout;
+
+import org.apache.fop.fo.*;
+
+import org.apache.fop.extensions.*;
+import org.apache.fop.render.*;
+
+public class ExtensionArea extends Area
+{
+ private ExtensionObj _extensionObj;
+
+ public ExtensionArea (ExtensionObj obj) {
+ super(null);
+ _extensionObj = obj;
+ }
+
+ public FObj getExtensionObj()
+ {
+ return _extensionObj;
+ }
+
+ public void render(Renderer renderer)
+ {
+ // renderer.renderExtensionArea(this);
+ }
+
+
+}
diff --git a/src/org/apache/fop/pdf/PDFDocument.java b/src/org/apache/fop/pdf/PDFDocument.java
index 7adcbb174..7f55fda80 100644
--- a/src/org/apache/fop/pdf/PDFDocument.java
+++ b/src/org/apache/fop/pdf/PDFDocument.java
@@ -899,30 +899,34 @@ public class PDFDocument {
}
}
else { // linkType is internal
- String goToReference;
- PDFInternalLink internalLink;
-
- if ( idReferences.doesIDExist(destination) ) {
- if ( idReferences.doesGoToReferenceExist(destination) ) {
- goToReference = idReferences.getInternalLinkGotToReference(destination);
- }
- else { //assign Internal Link GoTo object
- goToReference = idReferences.createInternalLinkGoTo(destination,++this.objectcount);
- this.objects.addElement(idReferences.getPDFGoTo(destination));
- }
- }
- else { //id was not found, so create it
- idReferences.createNewId(destination);
- idReferences.addToIdValidationList(destination);
- goToReference = idReferences.createInternalLinkGoTo(destination,++this.objectcount);
- this.objects.addElement(idReferences.getPDFGoTo(destination));
- }
- internalLink = new PDFInternalLink(goToReference);
+ String goToReference = getGoToReference(destination);
+ PDFInternalLink internalLink = new PDFInternalLink(goToReference);
link.setAction(internalLink);
}
return link;
}
+ private String getGoToReference(String destination)
+ {
+ String goToReference;
+ if ( idReferences.doesIDExist(destination) ) {
+ if ( idReferences.doesGoToReferenceExist(destination) ) {
+ goToReference = idReferences.getInternalLinkGoToReference(destination);
+ }
+ else { //assign Internal Link GoTo object
+ goToReference = idReferences.createInternalLinkGoTo(destination,++this.objectcount);
+ this.objects.addElement(idReferences.getPDFGoTo(destination));
+ }
+ }
+ else { //id was not found, so create it
+ idReferences.createNewId(destination);
+ idReferences.addToIdValidationList(destination);
+ goToReference = idReferences.createInternalLinkGoTo(destination,++this.objectcount);
+ this.objects.addElement(idReferences.getPDFGoTo(destination));
+ }
+ return goToReference;
+ }
+
/**
* make a stream object
@@ -957,6 +961,40 @@ public class PDFDocument {
}
/**
+ * Make the root Outlines object
+ */
+ public PDFOutline makeOutlineRoot()
+ {
+ PDFOutline obj = new PDFOutline(++this.objectcount, null, null);
+ this.objects.addElement(obj);
+ root.setRootOutline(obj);
+
+ return obj;
+ }
+
+ /** Make an outline object and add it to the given outline
+ * @param parent parent PDFOutline object
+ * @param label the title for the new outline object
+ * @param action the PDFAction to reference
+ */
+ public PDFOutline makeOutline(PDFOutline parent,
+ String label,
+ String destination)
+ {
+ String goToRef = getGoToReference(destination);
+
+ PDFOutline obj = new PDFOutline(++this.objectcount, label, goToRef);
+ // System.out.println("created new outline object");
+
+ if (parent != null) {
+ parent.addOutline(obj);
+ }
+ this.objects.addElement(obj);
+ return obj;
+
+ }
+
+ /**
* get the /Resources object for the document
*
* @return the /Resources object
diff --git a/src/org/apache/fop/pdf/PDFGoTo.java b/src/org/apache/fop/pdf/PDFGoTo.java
index 60862d024..e88658fd5 100644
--- a/src/org/apache/fop/pdf/PDFGoTo.java
+++ b/src/org/apache/fop/pdf/PDFGoTo.java
@@ -55,7 +55,7 @@ package org.apache.fop.pdf;
* class representing a /GoTo object.
*
*/
-public class PDFGoTo extends PDFObject {
+public class PDFGoTo extends PDFAction {
/** the pageReference */
protected String pageReference;
@@ -113,6 +113,11 @@ public class PDFGoTo extends PDFObject {
this.xPosition = (xPosition/1000f);
}
+ public String getAction()
+ {
+ return referencePDF();
+ }
+
/**
* represent the object in PDF
diff --git a/src/org/apache/fop/pdf/PDFOutline.java b/src/org/apache/fop/pdf/PDFOutline.java
new file mode 100644
index 000000000..0f4e8a1e6
--- /dev/null
+++ b/src/org/apache/fop/pdf/PDFOutline.java
@@ -0,0 +1,218 @@
+/*-- $Id$ --
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+ */
+
+package org.apache.fop.pdf;
+
+import java.util.Vector;
+
+
+/**
+ * This represents a single Outline object in a PDF, including the root Outlines
+ * object. Outlines provide the bookmark bar, usually rendered to the right of
+ * a PDF document in user agents such as Acrobat Reader
+ *
+ * @author Kelly A. Campbell
+ *
+ */
+
+public class PDFOutline extends PDFObject
+{
+
+ /** list of sub-entries (outline objects) */
+ private Vector _subentries;
+
+ /** parent outline object. Root Outlines parent is null */
+ private PDFOutline _parent;
+
+ private PDFOutline _prev;
+ private PDFOutline _next;
+
+ private PDFOutline _first;
+ private PDFOutline _last;
+
+ private int _count;
+
+
+ /** title to display for the bookmark entry */
+ private String _title;
+
+ String _actionRef;
+
+
+
+ /**
+ * @param number the object id number
+ * @param title the title of the outline entry (can only be null for root Outlines obj)
+ * @param page the page which this outline refers to.
+ */
+ public PDFOutline(int number, String title, String action)
+ {
+ super(number);
+ _subentries = new Vector();
+ _count = 0;
+ _parent = null;
+ _prev = null;
+ _next = null;
+ _first = null;
+ _last = null;
+ _title = title;
+ _actionRef = action;
+
+
+ }
+
+ public void setTitle(String title)
+ {
+ _title = title;
+ }
+
+ /**
+ * Add a sub element to this outline
+ */
+ public void addOutline(PDFOutline outline)
+ {
+ if (_subentries.size() > 0) {
+ outline._prev = (PDFOutline)_subentries.elementAt(_subentries.size() - 1);
+ outline._prev._next = outline;
+ }
+ else {
+ _first = outline;
+ }
+
+ _subentries.addElement(outline);
+ outline._parent = this;
+
+ incrementCount(); // note: count is not just the immediate children
+
+ _last = outline;
+
+ }
+
+ private void incrementCount()
+ {
+ // count is a total of our immediate subentries and all descendent subentries
+ _count++;
+ if (_parent != null) {
+ _parent.incrementCount();
+ }
+ }
+
+
+ /** represent the object in PDF */
+ protected byte[] toPDF()
+ {
+ StringBuffer result = new StringBuffer(this.number+" "+this.generation+" obj\n<<\n");
+ if (_parent == null) {
+ // root Outlines object
+ if (_first != null && _last != null) {
+ result.append(" /First "+_first.referencePDF()+"\n");
+ result.append(" /Last "+_last.referencePDF()+"\n");
+ // no count... we start with the outline completely closed for now
+ }
+ }
+ else {
+ // subentry Outline object
+ result.append(" /Title ("+escapeString(_title)+")\n");
+ result.append(" /Parent "+_parent.referencePDF()+"\n");
+ if (_first != null && _last != null) {
+ result.append(" /First "+_first.referencePDF()+"\n");
+ result.append(" /Last "+_last.referencePDF()+"\n");
+ }
+ if (_prev != null) {
+ result.append(" /Prev "+_prev.referencePDF()+"\n");
+ }
+ if (_next != null) {
+ result.append(" /Next "+_next.referencePDF()+"\n");
+ }
+ if (_count > 0) {
+ result.append(" /Count -"+_count+"\n");
+ }
+
+ if (_actionRef != null) {
+ result.append(" /A "+_actionRef+"\n");
+ }
+
+
+ }
+ result.append(">> endobj\n");
+ return result.toString().getBytes();
+
+ }
+
+ /** escape parens, and other special chars for PDF */
+ private String escapeString(String s)
+ {
+ StringBuffer result = new StringBuffer();
+ if (s != null) {
+ int l = s.length();
+
+ for (int i = 0; i < l; i++) {
+ char ch = s.charAt(i);
+ if (ch > 127) {
+ result.append("\\");
+ result.append(Integer.toOctalString((int) ch));
+ } else {
+ switch (ch) {
+ case '(' :
+ case ')' :
+ case '\\' :
+ result.append('\\');
+ break;
+ }
+ result.append(ch);
+ }
+ }
+ }
+
+ return result.toString();
+ }
+
+}
diff --git a/src/org/apache/fop/pdf/PDFRoot.java b/src/org/apache/fop/pdf/PDFRoot.java
index 92a8a7839..f31543eab 100644
--- a/src/org/apache/fop/pdf/PDFRoot.java
+++ b/src/org/apache/fop/pdf/PDFRoot.java
@@ -62,6 +62,9 @@ public class PDFRoot extends PDFObject {
/** the /Pages object that is root of the Pages hierarchy */
protected PDFPages rootPages;
+ /** Root outline object */
+ private PDFOutline _outline;
+
/**
* create a Root (/Catalog) object
*
@@ -89,15 +92,27 @@ public class PDFRoot extends PDFObject {
this.rootPages = pages;
}
+ public void setRootOutline(PDFOutline outline)
+ {
+ _outline = outline;
+ }
+
+
/**
* represent the object as PDF
*
* @return the PDF string
*/
public byte[] toPDF() {
- String p = this.number + " " + this.generation
+ StringBuffer p = new StringBuffer(this.number + " " + this.generation
+ " obj\n<< /Type /Catalog\n/Pages "
- + this.rootPages.referencePDF() + " >>\nendobj\n";
- return p.getBytes();
+ + this.rootPages.referencePDF() + "\n");
+ if (_outline != null) {
+ p.append(" /Outlines "+_outline.referencePDF()+"\n");
+ p.append(" /PageMode /UseOutlines\n");
+
+ }
+ p.append(" >>\nendobj\n");
+ return p.toString().getBytes();
}
}
diff --git a/src/org/apache/fop/render/pdf/PDFRenderer.java b/src/org/apache/fop/render/pdf/PDFRenderer.java
index 28c9561c3..45f4534eb 100644
--- a/src/org/apache/fop/render/pdf/PDFRenderer.java
+++ b/src/org/apache/fop/render/pdf/PDFRenderer.java
@@ -66,6 +66,8 @@ import org.apache.fop.pdf.*;
import org.apache.fop.layout.*;
import org.apache.fop.image.*;
import org.apache.fop.configuration.Configuration;
+import org.apache.fop.extensions.*;
+import org.apache.fop.datatypes.IDReferences;
import org.w3c.dom.*;
import org.w3c.dom.svg.*;
@@ -175,6 +177,7 @@ public class PDFRenderer implements Renderer {
boolean useKerning;
+ private PDFOutline rootOutline;
/**
* create the PDF renderer
@@ -219,7 +222,8 @@ public class PDFRenderer implements Renderer {
idReferences.getInvalidIds() + "\n");
}
-
+ renderRootExtensions(areaTree);
+
MessageHandler.logln("writing out PDF");
this.pdfDoc.output(stream);
}
@@ -1021,4 +1025,53 @@ public class PDFRenderer implements Renderer {
return rs;
}
+ protected void renderRootExtensions(AreaTree areaTree)
+ {
+ Vector v = areaTree.getExtensions();
+ if (v != null) {
+ Enumeration e = v.elements();
+ while (e.hasMoreElements()) {
+ ExtensionObj ext = (ExtensionObj)e.nextElement();
+ if (ext instanceof Outline) {
+ renderOutline((Outline)ext);
+ }
+ }
+ }
+
+ }
+
+ private void renderOutline(Outline outline)
+ {
+ if (rootOutline == null) {
+ rootOutline = this.pdfDoc.makeOutlineRoot();
+ }
+ PDFOutline pdfOutline = null;
+ Outline parent = outline.getParentOutline();
+ if (parent == null) {
+ pdfOutline = this.pdfDoc.makeOutline(rootOutline,
+ outline.getLabel().toString(),
+ outline.getInternalDestination());
+ }
+ else {
+ PDFOutline pdfParentOutline = (PDFOutline)parent.getRendererObject();
+ if (pdfParentOutline == null) {
+ MessageHandler.errorln("Error: pdfParentOutline is null");
+ }
+ else {
+ pdfOutline = this.pdfDoc.makeOutline(pdfParentOutline,
+ outline.getLabel().toString(),
+ outline.getInternalDestination());
+ }
+
+ }
+ outline.setRendererObject(pdfOutline);
+
+ // handle sub outlines
+ Vector v = outline.getOutlines();
+ Enumeration e = v.elements();
+ while (e.hasMoreElements()) {
+ renderOutline((Outline)e.nextElement());
+ }
+ }
+
}
diff --git a/src/org/apache/fop/tools/anttasks/Fop.java b/src/org/apache/fop/tools/anttasks/Fop.java
index 25c3946a7..a0eb542a0 100644
--- a/src/org/apache/fop/tools/anttasks/Fop.java
+++ b/src/org/apache/fop/tools/anttasks/Fop.java
@@ -194,8 +194,11 @@ public class Fop {
version);
driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+ driver.addElementMapping("org.apache.fop.extensions.ExtensionElementMapping");
driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
+ driver.addPropertyList("org.apache.fop.extensions.ExtensionPropertyListMapping");
+
driver.setOutputStream(new FileOutputStream(pdffile));
driver.buildFOTree(parser, fileInputSource(fofile));
driver.format();