Browse Source

Bugzilla#48954: Support for character encoding of TLEs in AFP output. Submitted by PH.


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1376950 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_0
Mehdi Houshmand 11 years ago
parent
commit
8430f08399

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

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

+ 18
- 13
src/java/org/apache/fop/afp/DataStream.java View File

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



+ 4
- 4
src/java/org/apache/fop/afp/Factory.java View File

/** /**
* 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;
} }



+ 5
- 8
src/java/org/apache/fop/afp/modca/AbstractPageObject.java View File

/** /**
* 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.
* *

+ 4
- 6
src/java/org/apache/fop/afp/modca/PageGroup.java View File

/** /**
* 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++;

+ 65
- 21
src/java/org/apache/fop/afp/modca/TagLogicalElement.java View File



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


}
} }

+ 0
- 64
src/java/org/apache/fop/afp/modca/TagLogicalElementBean.java View File

/*
* 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;
}

}

+ 63
- 0
src/java/org/apache/fop/afp/modca/triplets/EncodingTriplet.java View File

/*
* 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;
}

}

+ 17
- 0
src/java/org/apache/fop/fo/FONode.java View File

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

+ 2
- 1
src/java/org/apache/fop/render/afp/AFPDocumentHandler.java View File

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(

+ 6
- 0
src/java/org/apache/fop/render/afp/extensions/AFPExtensionHandler.java View File

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())

+ 23
- 0
src/java/org/apache/fop/render/afp/extensions/AFPPageSetup.java View File

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

+ 11
- 0
src/java/org/apache/fop/render/afp/extensions/AFPPageSetupElement.java View File

*/ */
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) {

+ 3
- 0
status.xml View File

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.

Loading…
Cancel
Save