git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1376950 13f79535-47bb-0310-9956-ffa450edef68tags/fop-2_0
xmlns:afp="http://xmlgraphics.apache.org/fop/extensions/afp"> | xmlns:afp="http://xmlgraphics.apache.org/fop/extensions/afp"> | ||||
<fo:layout-master-set> | <fo:layout-master-set> | ||||
<fo:simple-page-master master-name="simple"> | <fo:simple-page-master master-name="simple"> | ||||
<afp:tag-logical-element name="The TLE Name" value="The TLE Value" /> | |||||
<afp:tag-logical-element name="The TLE Name" value="The TLE Value" | |||||
encoding="500" /> | |||||
<fo:region-body/> | <fo:region-body/> | ||||
</fo:simple-page-master> | </fo:simple-page-master> | ||||
</fo:layout-master-set> | </fo:layout-master-set> | ||||
The tag-logical-element extension element can appear within a simple-page-master | The tag-logical-element extension element can appear within a simple-page-master | ||||
(page level) or it can appear as child of page-sequence (page group level). | (page level) or it can appear as child of page-sequence (page group level). | ||||
Multiple tag-logical-element extension elements within a simple-page-master or | Multiple tag-logical-element extension elements within a simple-page-master or | ||||
page-sequence are allowed. The name and value attributes are mandatory. | |||||
page-sequence are allowed. The name and value attributes are mandatory. The encoding attribute specifying a CCSID encoding is optional. | |||||
</p> | </p> | ||||
</section> | </section> | ||||
<section id="afp-no-operation"> | <section id="afp-no-operation"> |
import org.apache.fop.afp.modca.PageGroup; | import org.apache.fop.afp.modca.PageGroup; | ||||
import org.apache.fop.afp.modca.PageObject; | import org.apache.fop.afp.modca.PageObject; | ||||
import org.apache.fop.afp.modca.ResourceGroup; | import org.apache.fop.afp.modca.ResourceGroup; | ||||
import org.apache.fop.afp.modca.TagLogicalElementBean; | |||||
import org.apache.fop.afp.modca.TagLogicalElement; | |||||
import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet; | import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet; | ||||
import org.apache.fop.afp.ptoca.PtocaBuilder; | import org.apache.fop.afp.ptoca.PtocaBuilder; | ||||
import org.apache.fop.afp.ptoca.PtocaProducer; | import org.apache.fop.afp.ptoca.PtocaProducer; | ||||
/** The MO:DCA interchange set in use (default to MO:DCA-P IS/2 set) */ | /** The MO:DCA interchange set in use (default to MO:DCA-P IS/2 set) */ | ||||
private InterchangeSet interchangeSet | private InterchangeSet interchangeSet | ||||
= InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2); | |||||
= InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2); | |||||
private final Factory factory; | private final Factory factory; | ||||
currentPage.createIncludePageSegment(name, xOrigin, yOrigin, createHardPageSegments); | currentPage.createIncludePageSegment(name, xOrigin, yOrigin, createHardPageSegments); | ||||
} | } | ||||
/** | /** | ||||
* Creates a TagLogicalElement on the current page. | * Creates a TagLogicalElement on the current page. | ||||
* | * | ||||
* @param attributes | * @param attributes | ||||
* the array of key value pairs. | * the array of key value pairs. | ||||
*/ | */ | ||||
public void createPageTagLogicalElement(TagLogicalElementBean[] attributes) { | |||||
public void createPageTagLogicalElement(TagLogicalElement.State[] attributes) { | |||||
for (int i = 0; i < attributes.length; i++) { | for (int i = 0; i < attributes.length; i++) { | ||||
String name = attributes[i].getKey(); | |||||
String value = attributes[i].getValue(); | |||||
currentPage.createTagLogicalElement(name, value, tleSequence++); | |||||
currentPage.createTagLogicalElement(attributes[i], tleSequence++); | |||||
} | } | ||||
} | } | ||||
* @param attributes | * @param attributes | ||||
* the array of key value pairs. | * the array of key value pairs. | ||||
*/ | */ | ||||
public void createPageGroupTagLogicalElement(TagLogicalElementBean[] attributes) { | |||||
public void createPageGroupTagLogicalElement(TagLogicalElement.State[] attributes) { | |||||
for (int i = 0; i < attributes.length; i++) { | for (int i = 0; i < attributes.length; i++) { | ||||
String name = attributes[i].getKey(); | |||||
String value = attributes[i].getValue(); | |||||
currentPageGroup.createTagLogicalElement(name, value); | |||||
currentPageGroup.createTagLogicalElement(attributes[i]); | |||||
} | } | ||||
} | } | ||||
* The tag name | * The tag name | ||||
* @param value | * @param value | ||||
* The tag value | * The tag value | ||||
* @param encoding The CCSID character set encoding | |||||
*/ | */ | ||||
public void createTagLogicalElement(String name, String value) { | |||||
public void createTagLogicalElement(String name, String value, int encoding) { | |||||
TagLogicalElement.State tleState = new TagLogicalElement.State(name, value, encoding); | |||||
if (currentPage != null) { | if (currentPage != null) { | ||||
currentPage.createTagLogicalElement(name, value, tleSequence++); | |||||
currentPage.createTagLogicalElement(tleState, tleSequence++); | |||||
} else { | } else { | ||||
currentPageGroup.createTagLogicalElement(name, value); | |||||
currentPageGroup.createTagLogicalElement(tleState); | |||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Creates a MO:DCA {@link TagLogicalElement} | * Creates a MO:DCA {@link TagLogicalElement} | ||||
* | * | ||||
* @param name name of the element | |||||
* @param value value of the element | |||||
* @param state the attribute state for the TLE | |||||
* @param tleSequence current start tle sequence number within stream* | * @param tleSequence current start tle sequence number within stream* | ||||
* @return a new {@link TagLogicalElement} | * @return a new {@link TagLogicalElement} | ||||
*/ | */ | ||||
public TagLogicalElement createTagLogicalElement(String name, String value, int tleSequence) { | |||||
TagLogicalElement tle = new TagLogicalElement(name, value, tleSequence); | |||||
public TagLogicalElement createTagLogicalElement(TagLogicalElement.State state, | |||||
int tleSequence) { | |||||
TagLogicalElement tle = new TagLogicalElement(state, tleSequence); | |||||
return tle; | return tle; | ||||
} | } | ||||
/** | /** | ||||
* Creates a TagLogicalElement on the page. | * Creates a TagLogicalElement on the page. | ||||
* | * | ||||
* @param name | |||||
* the name of the tag | |||||
* @param value | |||||
* the value of the tag | |||||
* @param tleID | |||||
* unique ID within AFP stream | |||||
* @param state the state of the TLE | |||||
* @param tleID the id of the TLE | |||||
*/ | */ | ||||
public void createTagLogicalElement(String name, String value, int tleID) { | |||||
TagLogicalElement tle = new TagLogicalElement(name, value, tleID); | |||||
public void createTagLogicalElement(TagLogicalElement.State state, int tleID) { | |||||
TagLogicalElement tle = new TagLogicalElement(state, tleID); | |||||
List list = getTagLogicalElements(); | List list = getTagLogicalElements(); | ||||
list.add(tle); | list.add(tle); | ||||
} | } | ||||
/** | /** | ||||
* Creates a NoOperation on the page. | * Creates a NoOperation on the page. | ||||
* | * |
/** | /** | ||||
* Creates a TagLogicalElement on the page. | * Creates a TagLogicalElement on the page. | ||||
* | * | ||||
* @param name | |||||
* the name of the tag | |||||
* @param value | |||||
* the value of the tag | |||||
* @param state | |||||
* the state of the TLE | |||||
*/ | */ | ||||
public void createTagLogicalElement(String name, String value) { | |||||
TagLogicalElement tle = factory.createTagLogicalElement(name, value, tleSequence); | |||||
public void createTagLogicalElement(TagLogicalElement.State state) { | |||||
TagLogicalElement tle = factory.createTagLogicalElement(state, tleSequence); | |||||
if (!getTagLogicalElements().contains(tle)) { | if (!getTagLogicalElements().contains(tle)) { | ||||
getTagLogicalElements().add(tle); | getTagLogicalElements().add(tle); | ||||
tleSequence++; | tleSequence++; |
import org.apache.fop.afp.modca.triplets.AttributeQualifierTriplet; | import org.apache.fop.afp.modca.triplets.AttributeQualifierTriplet; | ||||
import org.apache.fop.afp.modca.triplets.AttributeValueTriplet; | import org.apache.fop.afp.modca.triplets.AttributeValueTriplet; | ||||
import org.apache.fop.afp.modca.triplets.EncodingTriplet; | |||||
import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet; | import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet; | ||||
import org.apache.fop.afp.util.BinaryUtils; | import org.apache.fop.afp.util.BinaryUtils; | ||||
public class TagLogicalElement extends AbstractTripletStructuredObject { | public class TagLogicalElement extends AbstractTripletStructuredObject { | ||||
/** | /** | ||||
* Name of the key, used within the TLE | |||||
* the params of the TLE | |||||
*/ | */ | ||||
private String name = null; | |||||
/** | |||||
* Value returned by the key | |||||
*/ | |||||
private String value = null; | |||||
private State state; | |||||
/** | /** | ||||
* Sequence of TLE within document | * Sequence of TLE within document | ||||
*/ | */ | ||||
/** | /** | ||||
* Construct a tag logical element with the name and value specified. | * Construct a tag logical element with the name and value specified. | ||||
* | * | ||||
* @param name the name of the tag logical element | |||||
* @param value the value of the tag logical element | |||||
* @param state the state of the tag logical element | |||||
* @param tleID unique identifier for TLE within AFP stream | * @param tleID unique identifier for TLE within AFP stream | ||||
*/ | */ | ||||
public TagLogicalElement(String name, String value, int tleID) { | |||||
this.name = name; | |||||
this.value = value; | |||||
public TagLogicalElement(State state, int tleID) { | |||||
this.state = state; | |||||
this.tleID = tleID; | this.tleID = tleID; | ||||
} | } | ||||
/** | |||||
* Sets the attribute value of this structured field | |||||
* | |||||
* @param value the attribute value | |||||
*/ | |||||
public void setAttributeValue(String value) { | |||||
private void setAttributeValue(String value) { | |||||
addTriplet(new AttributeValueTriplet(value)); | addTriplet(new AttributeValueTriplet(value)); | ||||
} | } | ||||
private void setEncoding(int encoding) { | |||||
if (encoding != State.ENCODING_NONE) { | |||||
addTriplet(new EncodingTriplet(encoding)); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Sets the attribute qualifier of this structured field | * Sets the attribute qualifier of this structured field | ||||
* | * | ||||
setFullyQualifiedName( | setFullyQualifiedName( | ||||
FullyQualifiedNameTriplet.TYPE_ATTRIBUTE_GID, | FullyQualifiedNameTriplet.TYPE_ATTRIBUTE_GID, | ||||
FullyQualifiedNameTriplet.FORMAT_CHARSTR, | FullyQualifiedNameTriplet.FORMAT_CHARSTR, | ||||
name); | |||||
setAttributeValue(value); | |||||
state.key); | |||||
setAttributeValue(state.value); | |||||
setEncoding(state.encoding); | |||||
setAttributeQualifier(tleID, 1); | setAttributeQualifier(tleID, 1); | ||||
byte[] data = new byte[SF_HEADER_LENGTH]; | byte[] data = new byte[SF_HEADER_LENGTH]; | ||||
writeTriplets(os); | writeTriplets(os); | ||||
} | } | ||||
/** | |||||
* | |||||
* Holds the attribute state of a TLE | |||||
* | |||||
*/ | |||||
public static class State { | |||||
/** | |||||
* value interpreted as no encoding | |||||
*/ | |||||
public static final int ENCODING_NONE = -1; | |||||
/** The key attribute */ | |||||
private String key; | |||||
/** The value attribute */ | |||||
private String value; | |||||
/** The CCSID character et encoding attribute */ | |||||
private int encoding = ENCODING_NONE; | |||||
/** | |||||
* Constructor | |||||
* | |||||
* @param key the key attribute | |||||
* @param value the value attribute | |||||
*/ | |||||
public State(String key, String value) { | |||||
this.key = key; | |||||
this.value = value; | |||||
} | |||||
/** | |||||
* | |||||
* @param key the key attribute | |||||
* @param value the value attribute | |||||
* @param encoding the CCSID character set encoding attribute | |||||
*/ | |||||
public State(String key, String value, int encoding) { | |||||
this.key = key; | |||||
this.value = value; | |||||
this.encoding = encoding; | |||||
} | |||||
} | |||||
} | } |
/* | |||||
* 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$ */ | |||||
package org.apache.fop.afp.modca; | |||||
/** | |||||
* The TagLogicalElementBean provides a bean for holding the attributes of | |||||
* a tag logical element as key value pairs. | |||||
* <p/> | |||||
*/ | |||||
public class TagLogicalElementBean { | |||||
/** The key attribute */ | |||||
private String key; | |||||
/** The value attribute */ | |||||
private String value; | |||||
/** | |||||
* Constructor for the TagLogicalElementBean. | |||||
* | |||||
* @param key the key attribute | |||||
* @param value the value attribute | |||||
*/ | |||||
public TagLogicalElementBean(String key, String value) { | |||||
this.key = key; | |||||
this.value = value; | |||||
} | |||||
/** | |||||
* Getter for the key attribute. | |||||
* | |||||
* @return the key | |||||
*/ | |||||
public String getKey() { | |||||
return key; | |||||
} | |||||
/** | |||||
* Getter for the value attribute. | |||||
* | |||||
* @return the value | |||||
*/ | |||||
public String getValue() { | |||||
return value; | |||||
} | |||||
} |
/* | |||||
* 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$ */ | |||||
package org.apache.fop.afp.modca.triplets; | |||||
import java.io.IOException; | |||||
import java.io.OutputStream; | |||||
import org.apache.fop.afp.util.BinaryUtils; | |||||
/** | |||||
* | |||||
* Represents a CCSID encoding triplet. | |||||
* | |||||
*/ | |||||
public class EncodingTriplet extends AbstractTriplet { | |||||
private int encoding; | |||||
/** | |||||
* @param encoding the CCSID character set encoding | |||||
*/ | |||||
public EncodingTriplet( int encoding) { | |||||
super(CODED_GRAPHIC_CHARACTER_SET_GLOBAL_IDENTIFIER); | |||||
this.encoding = encoding; | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public void writeToStream(OutputStream os) throws IOException { | |||||
// [len,id,0,0,0,0] | |||||
byte[] data = getData(); | |||||
byte[] encodingBytes = BinaryUtils.convert(encoding, 2); | |||||
// [len,id,0,0,0,0] -> [len.id,0,0,encodingBytes[0],encodingBytes[1]] | |||||
System.arraycopy(encodingBytes, 0, data, 4, encodingBytes.length); | |||||
os.write(data); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public int getDataLength() { | |||||
//len(1b) + id(1b) + 0x0000 (2b) + encoding (2b) = 6b | |||||
return 6; | |||||
} | |||||
} |
import org.apache.fop.apps.FOPException; | import org.apache.fop.apps.FOPException; | ||||
import org.apache.fop.apps.FOUserAgent; | import org.apache.fop.apps.FOUserAgent; | ||||
import org.apache.fop.complexscripts.bidi.DelimitedTextRange; | import org.apache.fop.complexscripts.bidi.DelimitedTextRange; | ||||
import org.apache.fop.fo.expr.PropertyException; | |||||
import org.apache.fop.fo.extensions.ExtensionAttachment; | import org.apache.fop.fo.extensions.ExtensionAttachment; | ||||
import org.apache.fop.fo.extensions.ExtensionElementMapping; | import org.apache.fop.fo.extensions.ExtensionElementMapping; | ||||
import org.apache.fop.fo.extensions.InternalElementMapping; | import org.apache.fop.fo.extensions.InternalElementMapping; | ||||
getFOValidationEventProducer().missingProperty(this, getName(), propertyName, locator); | getFOValidationEventProducer().missingProperty(this, getName(), propertyName, locator); | ||||
} | } | ||||
/** | |||||
* Helper function to throw an error caused by an invalid property | |||||
* | |||||
* @param propertyName the name of the property. | |||||
* @param propertyValue the value of the property. | |||||
* * @param e optional property parsing exception. | |||||
* @throws ValidationException the validation error provoked by the method call | |||||
*/ | |||||
protected void invalidPropertyValueError(String propertyName, String propertyValue, Exception e) | |||||
throws ValidationException { | |||||
getFOValidationEventProducer().invalidPropertyValue(this, getName(), propertyName, | |||||
propertyValue, new PropertyException(e), locator); | |||||
} | |||||
/** | /** | ||||
* Helper function to return "Error(line#/column#)" string for | * Helper function to return "Error(line#/column#)" string for | ||||
* above exception messages | * above exception messages |
case IN_PAGE_HEADER: | case IN_PAGE_HEADER: | ||||
String name = aps.getName(); | String name = aps.getName(); | ||||
String value = aps.getValue(); | String value = aps.getValue(); | ||||
dataStream.createTagLogicalElement(name, value); | |||||
int encoding = aps.getEncoding(); | |||||
dataStream.createTagLogicalElement(name, value, encoding); | |||||
break; | break; | ||||
default: | default: | ||||
throw new IFException( | throw new IFException( |
if (placement != null && placement.length() > 0) { | if (placement != null && placement.length() > 0) { | ||||
pageSetupExtn.setPlacement(ExtensionPlacement.fromXMLValue(placement)); | pageSetupExtn.setPlacement(ExtensionPlacement.fromXMLValue(placement)); | ||||
} | } | ||||
String encoding = lastAttributes.getValue("encoding"); | |||||
if (encoding != null && pageSetupExtn != null) { | |||||
pageSetupExtn.setEncoding(Integer.parseInt(encoding)); | |||||
} | |||||
if (content.length() > 0 && pageSetupExtn != null) { | if (content.length() > 0 && pageSetupExtn != null) { | ||||
pageSetupExtn.setContent(content.toString()); | pageSetupExtn.setContent(content.toString()); | ||||
content.setLength(0); //Reset text buffer (see characters()) | content.setLength(0); //Reset text buffer (see characters()) |
import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||
import org.xml.sax.helpers.AttributesImpl; | import org.xml.sax.helpers.AttributesImpl; | ||||
import org.apache.fop.afp.modca.TagLogicalElement; | |||||
/** | /** | ||||
* This is the pass-through value object for the AFP extension. | * This is the pass-through value object for the AFP extension. | ||||
*/ | */ | ||||
/** defines where to place the extension in the generated file */ | /** defines where to place the extension in the generated file */ | ||||
protected ExtensionPlacement placement = ExtensionPlacement.DEFAULT; | protected ExtensionPlacement placement = ExtensionPlacement.DEFAULT; | ||||
/** | |||||
* the CCSID character set encoding | |||||
*/ | |||||
protected int encoding = TagLogicalElement.State.ENCODING_NONE; | |||||
/** | |||||
* | |||||
* @return CCSID character set encoding | |||||
*/ | |||||
public int getEncoding() { | |||||
return encoding; | |||||
} | |||||
/** | |||||
* | |||||
* @param encoding CCSID character set encoding | |||||
*/ | |||||
public void setEncoding(int encoding) { | |||||
this.encoding = encoding; | |||||
} | |||||
/** | /** | ||||
* Default constructor. | * Default constructor. | ||||
* | * |
*/ | */ | ||||
public class AFPPageSetupElement extends AbstractAFPExtensionObject { | public class AFPPageSetupElement extends AbstractAFPExtensionObject { | ||||
private static final String ATT_ENCODING = "encoding"; | |||||
private static final String ATT_SRC = "src"; | private static final String ATT_SRC = "src"; | ||||
/** | /** | ||||
} else { | } else { | ||||
missingPropertyError(AFPPageSetup.ATT_VALUE); | missingPropertyError(AFPPageSetup.ATT_VALUE); | ||||
} | } | ||||
attr = attlist.getValue(ATT_ENCODING); | |||||
if (attr != null) { | |||||
try { | |||||
pageSetup.setEncoding(Integer.parseInt(attr)); | |||||
} catch (NumberFormatException nfe) { | |||||
invalidPropertyValueError(ATT_ENCODING, attr, nfe); | |||||
} | |||||
} | |||||
} | } | ||||
String placement = attlist.getValue(AFPPageSetup.ATT_PLACEMENT); | String placement = attlist.getValue(AFPPageSetup.ATT_PLACEMENT); | ||||
if (placement != null && placement.length() > 0) { | if (placement != null && placement.length() > 0) { |
documents. Example: the fix of marks layering will be such a case when it's done. | documents. Example: the fix of marks layering will be such a case when it's done. | ||||
--> | --> | ||||
<release version="FOP Trunk" date="TBD"> | <release version="FOP Trunk" date="TBD"> | ||||
<action context="Renderers" dev="MH" type="fix" fixes-bug="48954" due-to="PH"> | |||||
Support for character encoding of TLEs in AFP output | |||||
</action> | |||||
<action context="Renderers" dev="VH" type="fix" fixes-bug="53778"> | <action context="Renderers" dev="VH" type="fix" fixes-bug="53778"> | ||||
When PDF accessibility is enabled, the contents for the different regions must appear in the | When PDF accessibility is enabled, the contents for the different regions must appear in the | ||||
proper order in the structure tree. | proper order in the structure tree. |