xmlns:afp="http://xmlgraphics.apache.org/fop/extensions/afp">
<fo:layout-master-set>
<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:simple-page-master>
</fo:layout-master-set>
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).
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>
</section>
<section id="afp-no-operation">
import org.apache.fop.afp.modca.PageGroup;
import org.apache.fop.afp.modca.PageObject;
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.ptoca.PtocaBuilder;
import org.apache.fop.afp.ptoca.PtocaProducer;
/** The MO:DCA interchange set in use (default to MO:DCA-P IS/2 set) */
private InterchangeSet interchangeSet
- = InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2);
+ = InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2);
private final Factory factory;
currentPage.createIncludePageSegment(name, xOrigin, yOrigin, createHardPageSegments);
}
+
+
/**
* Creates a TagLogicalElement on the current page.
*
* @param attributes
* 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++) {
- String name = attributes[i].getKey();
- String value = attributes[i].getValue();
- currentPage.createTagLogicalElement(name, value, tleSequence++);
+
+ currentPage.createTagLogicalElement(attributes[i], tleSequence++);
}
}
* @param attributes
* 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++) {
- String name = attributes[i].getKey();
- String value = attributes[i].getValue();
- currentPageGroup.createTagLogicalElement(name, value);
+ currentPageGroup.createTagLogicalElement(attributes[i]);
}
}
* The tag name
* @param 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) {
- currentPage.createTagLogicalElement(name, value, tleSequence++);
+
+ currentPage.createTagLogicalElement(tleState, tleSequence++);
+
} else {
- currentPageGroup.createTagLogicalElement(name, value);
+ currentPageGroup.createTagLogicalElement(tleState);
}
}
/**
* 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*
* @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;
}
/**
* 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.add(tle);
}
+
/**
* Creates a NoOperation 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)) {
getTagLogicalElements().add(tle);
tleSequence++;
import org.apache.fop.afp.modca.triplets.AttributeQualifierTriplet;
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.util.BinaryUtils;
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
*/
/**
* 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
*/
- 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;
}
- /**
- * 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));
}
+ private void setEncoding(int encoding) {
+ if (encoding != State.ENCODING_NONE) {
+ addTriplet(new EncodingTriplet(encoding));
+ }
+ }
+
/**
* Sets the attribute qualifier of this structured field
*
setFullyQualifiedName(
FullyQualifiedNameTriplet.TYPE_ATTRIBUTE_GID,
FullyQualifiedNameTriplet.FORMAT_CHARSTR,
- name);
- setAttributeValue(value);
+ state.key);
+ setAttributeValue(state.value);
+ setEncoding(state.encoding);
setAttributeQualifier(tleID, 1);
byte[] data = new byte[SF_HEADER_LENGTH];
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;
+ }
+
+
+ }
}
+++ /dev/null
-/*
- * 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;
- }
-
-}
--- /dev/null
+/*
+ * 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.FOUserAgent;
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.ExtensionElementMapping;
import org.apache.fop.fo.extensions.InternalElementMapping;
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
* above exception messages
case IN_PAGE_HEADER:
String name = aps.getName();
String value = aps.getValue();
- dataStream.createTagLogicalElement(name, value);
+ int encoding = aps.getEncoding();
+ dataStream.createTagLogicalElement(name, value, encoding);
break;
default:
throw new IFException(
if (placement != null && placement.length() > 0) {
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) {
pageSetupExtn.setContent(content.toString());
content.setLength(0); //Reset text buffer (see characters())
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
+import org.apache.fop.afp.modca.TagLogicalElement;
+
/**
* This is the pass-through value object for the AFP extension.
*/
/** defines where to place the extension in the generated file */
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.
*
*/
public class AFPPageSetupElement extends AbstractAFPExtensionObject {
+ private static final String ATT_ENCODING = "encoding";
private static final String ATT_SRC = "src";
/**
} else {
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);
if (placement != null && placement.length() > 0) {
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="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">
When PDF accessibility is enabled, the contents for the different regions must appear in the
proper order in the structure tree.