git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@824249 13f79535-47bb-0310-9956-ffa450edef68tags/fop-1_0
@@ -766,13 +766,14 @@ out = proc.getOutputStream();]]></source> | |||
<source><![CDATA[ | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="simple"> | |||
<afp:include-page-overlay name="O1SAMP1 " /> | |||
<afp:include-page-overlay name="O1SAMP1 " x="20mm" y="30mm" /> | |||
... | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
]]></source> | |||
<p>The mandatory name attribute must refer to an 8 character (space padded) resource name that | |||
must be known in the AFP processing environment.</p> | |||
must be known in the AFP processing environment. Optional x and y attributes can be specified | |||
to place the Overlay at an offset from the top left of the page.</p> | |||
</section> | |||
<section id="afp-page-segment"> | |||
<title>Page Segment (IPS) Extension</title> |
@@ -485,9 +485,11 @@ public class DataStream { | |||
* | |||
* @param name | |||
* the name of the static overlay | |||
* @param x x-coordinate | |||
* @param y y-coordinate | |||
*/ | |||
public void createIncludePageOverlay(String name) { | |||
currentPageObject.createIncludePageOverlay(name, 0, 0, paintingState.getRotation()); | |||
public void createIncludePageOverlay(String name, int x, int y) { | |||
currentPageObject.createIncludePageOverlay(name, x, y, paintingState.getRotation()); | |||
currentPageObject.getActiveEnvironmentGroup().createOverlay(name); | |||
} | |||
@@ -47,6 +47,7 @@ import org.apache.fop.render.afp.extensions.AFPElementMapping; | |||
import org.apache.fop.render.afp.extensions.AFPIncludeFormMap; | |||
import org.apache.fop.render.afp.extensions.AFPInvokeMediumMap; | |||
import org.apache.fop.render.afp.extensions.AFPPageSetup; | |||
import org.apache.fop.render.afp.extensions.AFPPageOverlay; | |||
import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler; | |||
import org.apache.fop.render.intermediate.IFDocumentHandler; | |||
import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator; | |||
@@ -286,12 +287,7 @@ public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler | |||
"AFP page setup extension encountered outside the page header: " + aps, | |||
null); | |||
} | |||
if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(element)) { | |||
String overlay = aps.getName(); | |||
if (overlay != null) { | |||
dataStream.createIncludePageOverlay(overlay); | |||
} | |||
} else if (AFPElementMapping.INCLUDE_PAGE_SEGMENT.equals(element)) { | |||
if (AFPElementMapping.INCLUDE_PAGE_SEGMENT.equals(element)) { | |||
String name = aps.getName(); | |||
String source = aps.getValue(); | |||
pageSegmentMap.put(source, name); | |||
@@ -302,6 +298,17 @@ public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler | |||
} | |||
} | |||
} | |||
} else if (extension instanceof AFPPageOverlay) { | |||
AFPPageOverlay ipo = (AFPPageOverlay)extension; | |||
if (this.location != LOC_IN_PAGE_HEADER) { | |||
throw new IFException( | |||
"AFP page overlay extension encountered outside the page header: " + ipo, | |||
null); | |||
} | |||
String overlay = ipo.getName(); | |||
if (overlay != null) { | |||
dataStream.createIncludePageOverlay(overlay, ipo.getX(), ipo.getY()); | |||
} | |||
} else if (extension instanceof AFPInvokeMediumMap) { | |||
if (this.location != LOC_FOLLOWING_PAGE_SEQUENCE | |||
&& this.location != LOC_IN_PAGE_HEADER) { |
@@ -91,6 +91,7 @@ import org.apache.fop.render.afp.extensions.AFPExtensionAttachment; | |||
import org.apache.fop.render.afp.extensions.AFPIncludeFormMap; | |||
import org.apache.fop.render.afp.extensions.AFPInvokeMediumMap; | |||
import org.apache.fop.render.afp.extensions.AFPPageSetup; | |||
import org.apache.fop.render.afp.extensions.AFPPageOverlay; | |||
/** | |||
* This is an implementation of a FOP Renderer that renders areas to AFP. | |||
@@ -758,12 +759,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer implements AFPCust | |||
if (attachment instanceof AFPPageSetup) { | |||
AFPPageSetup aps = (AFPPageSetup) attachment; | |||
String element = aps.getElementName(); | |||
if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(element)) { | |||
String overlay = aps.getName(); | |||
if (overlay != null) { | |||
dataStream.createIncludePageOverlay(overlay); | |||
} | |||
} else if (AFPElementMapping.INCLUDE_PAGE_SEGMENT | |||
if (AFPElementMapping.INCLUDE_PAGE_SEGMENT | |||
.equals(element)) { | |||
String name = aps.getName(); | |||
String source = aps.getValue(); | |||
@@ -779,6 +775,15 @@ public class AFPRenderer extends AbstractPathOrientedRenderer implements AFPCust | |||
dataStream.createNoOperation(content); | |||
} | |||
} | |||
} else if (attachment instanceof AFPPageOverlay) { | |||
AFPPageOverlay ipo = (AFPPageOverlay) attachment; | |||
String element = ipo.getElementName(); | |||
if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(element)) { | |||
String overlay = ipo.getName(); | |||
if (overlay != null) { | |||
dataStream.createIncludePageOverlay(overlay, ipo.getX(), ipo.getY()); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -97,7 +97,7 @@ public class AFPElementMapping extends ElementMapping { | |||
static class AFPIncludePageOverlayMaker extends ElementMapping.Maker { | |||
public FONode make(FONode parent) { | |||
return new AFPPageSetupElement(parent, INCLUDE_PAGE_OVERLAY); | |||
return new AFPPageOverlayElement(parent, INCLUDE_PAGE_OVERLAY); | |||
} | |||
} | |||
@@ -0,0 +1,107 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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: AFPIncludeFormMap.java 798207 2009-07-27 16:33:01Z jeremias $ */ | |||
package org.apache.fop.render.afp.extensions; | |||
import java.net.URI; | |||
import org.xml.sax.ContentHandler; | |||
import org.xml.sax.SAXException; | |||
import org.xml.sax.helpers.AttributesImpl; | |||
import org.apache.fop.fo.extensions.ExtensionAttachment; | |||
/** | |||
* This extension allows to include an AFP Page Overlay resource. It is implemented as an extension | |||
* attachment ({@link ExtensionAttachment}). | |||
*/ | |||
public class AFPPageOverlay extends AFPExtensionAttachment { | |||
private static final long serialVersionUID = 8548056652642588919L; | |||
/** X coordinate attribute */ | |||
protected static final String ATT_X = "X"; | |||
/** X coordinate attribute */ | |||
protected static final String ATT_Y = "Y"; | |||
/** | |||
* The x coordinate | |||
*/ | |||
private int x = 0; | |||
/** | |||
* The y coordinate | |||
*/ | |||
private int y = 0; | |||
/** | |||
* Default constructor. | |||
*/ | |||
public AFPPageOverlay() { | |||
super(AFPElementMapping.INCLUDE_PAGE_OVERLAY); | |||
} | |||
/** | |||
* returns X coordinate | |||
* @return x integer | |||
*/ | |||
public int getX() { | |||
return x; | |||
} | |||
/** | |||
* Sets the X coordinate | |||
* @param x The integer to be set. | |||
*/ | |||
public void setX(int x) { | |||
this.x = x; | |||
} | |||
/** | |||
* returns Y coordinate | |||
* @return y integer | |||
*/ | |||
public int getY() { | |||
return y; | |||
} | |||
/** | |||
* Sets the Y coordinate | |||
* @param y The integer to be set. | |||
*/ | |||
public void setY(int y) { | |||
this.y = y; | |||
} | |||
/** {@inheritDoc} */ | |||
public void toSAX(ContentHandler handler) throws SAXException { | |||
AttributesImpl atts = new AttributesImpl(); | |||
if (name != null && name.length() > 0) { | |||
atts.addAttribute(null, ATT_NAME, ATT_NAME, "CDATA", name); | |||
} | |||
handler.startElement(CATEGORY, elementName, elementName, atts); | |||
handler.endElement(CATEGORY, elementName, elementName); | |||
} | |||
/** {@inheritDoc} */ | |||
public String toString() { | |||
return getClass().getName() + "(element-name=" + getElementName() | |||
+ " name=" + getName() + " x=" + getX() + " y=" + getY() + ")"; | |||
} | |||
} |
@@ -0,0 +1,97 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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: AFPPageSetupElement.java 798207 2009-07-27 16:33:01Z jeremias $ */ | |||
package org.apache.fop.render.afp.extensions; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.Locator; | |||
import org.apache.fop.apps.FOPException; | |||
import org.apache.fop.fo.Constants; | |||
import org.apache.fop.fo.FONode; | |||
import org.apache.fop.fo.PropertyList; | |||
import org.apache.fop.fo.extensions.ExtensionAttachment; | |||
import org.apache.fop.afp.AFPPaintingState; | |||
import org.apache.fop.afp.AFPUnitConverter; | |||
import org.apache.xmlgraphics.util.UnitConv; | |||
/** | |||
* This class extends the org.apache.fop.render.afp.extensions.AbstractAFPExtensionObject class. | |||
* This object will be used to map the page overlay object in AFPElementMapping. | |||
* <p/> | |||
*/ | |||
public class AFPPageOverlayElement extends AbstractAFPExtensionObject { | |||
private static final String ATT_X = "x"; | |||
private static final String ATT_Y = "y"; | |||
/** | |||
* Constructs an AFP object (called by Maker). | |||
* | |||
* @param parent the parent formatting object | |||
* @param name the name of the afp element | |||
*/ | |||
public AFPPageOverlayElement(FONode parent, String name) { | |||
super(parent, name); | |||
} | |||
private AFPPageOverlay getPageSetupAttachment() { | |||
return (AFPPageOverlay)getExtensionAttachment(); | |||
} | |||
/** {@inheritDoc} */ | |||
protected void startOfNode() throws FOPException { | |||
super.startOfNode(); | |||
if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(getLocalName())) { | |||
if (parent.getNameId() != Constants.FO_SIMPLE_PAGE_MASTER | |||
&& parent.getNameId() != Constants.FO_PAGE_SEQUENCE) { | |||
invalidChildError(getLocator(), parent.getName(), getNamespaceURI(), getName(), | |||
"rule.childOfPageSequenceOrSPM"); | |||
} | |||
} else { | |||
if (parent.getNameId() != Constants.FO_SIMPLE_PAGE_MASTER) { | |||
invalidChildError(getLocator(), parent.getName(), getNamespaceURI(), getName(), | |||
"rule.childOfSPM"); | |||
} | |||
} | |||
} | |||
/** {@inheritDoc} */ | |||
public void processNode(String elementName, Locator locator, | |||
Attributes attlist, PropertyList propertyList) | |||
throws FOPException { | |||
super.processNode(elementName, locator, attlist, propertyList); | |||
AFPPageOverlay pageOverlay = getPageSetupAttachment(); | |||
if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(elementName)) { | |||
// convert user specific units to mpts and set the coordinates for the page overlay | |||
AFPPaintingState paintingState = new AFPPaintingState(); | |||
AFPUnitConverter unitConverter = new AFPUnitConverter(paintingState); | |||
int x = (int)unitConverter.mpt2units(UnitConv.convert(attlist.getValue(ATT_X))); | |||
int y = (int)unitConverter.mpt2units(UnitConv.convert(attlist.getValue(ATT_Y))); | |||
pageOverlay.setX(x); | |||
pageOverlay.setY(y); | |||
} | |||
} | |||
/** {@inheritDoc} */ | |||
protected ExtensionAttachment instantiateExtensionAttachment() { | |||
return new AFPPageOverlay(); | |||
} | |||
} |
@@ -58,6 +58,9 @@ | |||
documents. Example: the fix of marks layering will be such a case when it's done. | |||
--> | |||
<release version="FOP Trunk" date="TBD"> | |||
<action context="Renderers" dev="CB" type="add"> | |||
Added support for positioning Page Overlays in AFP Output | |||
</action> | |||
<action context="Fonts" dev="JM" type="add"> | |||
Added support for specifying referenced fonts per renderer in addition to the general | |||
match list. |