Sfoglia il codice sorgente

add support for positioning Page Overlay in AFP Renderer/Painter

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@824249 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-1_0
Chris Bowditch 14 anni fa
parent
commit
de3f6e8dd0

BIN
lib/xmlgraphics-commons-1.4svn.jar Vedi File


+ 3
- 2
src/documentation/content/xdocs/trunk/output.xml Vedi File

@@ -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>

+ 4
- 2
src/java/org/apache/fop/afp/DataStream.java Vedi File

@@ -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);
}


+ 13
- 6
src/java/org/apache/fop/render/afp/AFPDocumentHandler.java Vedi File

@@ -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) {

+ 11
- 6
src/java/org/apache/fop/render/afp/AFPRenderer.java Vedi File

@@ -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());
}
}
}
}
}

+ 1
- 1
src/java/org/apache/fop/render/afp/extensions/AFPElementMapping.java Vedi File

@@ -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);
}
}


+ 107
- 0
src/java/org/apache/fop/render/afp/extensions/AFPPageOverlay.java Vedi File

@@ -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() + ")";
}
}

+ 97
- 0
src/java/org/apache/fop/render/afp/extensions/AFPPageOverlayElement.java Vedi File

@@ -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();
}
}

+ 3
- 0
status.xml Vedi File

@@ -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.

Loading…
Annulla
Salva