diff options
Diffstat (limited to 'src/java/org/apache/fop/rtf/renderer')
-rw-r--r-- | src/java/org/apache/fop/rtf/renderer/RTFHandler.java | 13 | ||||
-rw-r--r-- | src/java/org/apache/fop/rtf/renderer/TextAttributesConverter.java | 345 |
2 files changed, 358 insertions, 0 deletions
diff --git a/src/java/org/apache/fop/rtf/renderer/RTFHandler.java b/src/java/org/apache/fop/rtf/renderer/RTFHandler.java index acd5ee2f6..c95ac439d 100644 --- a/src/java/org/apache/fop/rtf/renderer/RTFHandler.java +++ b/src/java/org/apache/fop/rtf/renderer/RTFHandler.java @@ -62,6 +62,7 @@ import org.apache.fop.datatypes.ColorType; import org.apache.fop.fo.FOInputHandler; import org.apache.fop.fo.flow.Block; import org.apache.fop.fo.flow.ExternalGraphic; +import org.apache.fop.fo.flow.Inline; import org.apache.fop.fo.flow.InstreamForeignObject; import org.apache.fop.fo.flow.Leader; import org.apache.fop.fo.flow.ListBlock; @@ -425,6 +426,18 @@ public class RTFHandler extends FOInputHandler { } /** + * @see org.apache.fop.fo.FOInputHandler#startInline(Inline) + */ + public void startInline(Inline inl){ + } + + /** + * @see org.apache.fop.fo.FOInputHandler#endInline(Inline) + */ + public void endInline(Inline inl){ + } + + /** * @see org.apache.fop.fo.FOInputHandler#startBody(TableBody) */ public void startBody(TableBody tb) { diff --git a/src/java/org/apache/fop/rtf/renderer/TextAttributesConverter.java b/src/java/org/apache/fop/rtf/renderer/TextAttributesConverter.java new file mode 100644 index 000000000..522cc8749 --- /dev/null +++ b/src/java/org/apache/fop/rtf/renderer/TextAttributesConverter.java @@ -0,0 +1,345 @@ +/* + * ============================================================================ + * The Apache Software License, Version 1.1 + * ============================================================================ + * + * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The end-user documentation included with the redistribution, if any, must + * include the following acknowledgment: "This product includes software + * developed by the Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, if + * and wherever such third-party acknowledgments normally appear. + * + * 4. The names "FOP" and "Apache Software Foundation" must not be used to + * endorse or promote products derived from this software without prior + * written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", nor may + * "Apache" appear in their name, without prior written permission of the + * Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + * + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation and was originally created by + * James Tauber <jtauber@jtauber.com>. For more information on the Apache + * Software Foundation, please see <http://www.apache.org/>. + */ + +package org.apache.fop.rtf.renderer; + +//XML +import org.xml.sax.Attributes; + +//FOP +import org.apache.avalon.framework.logger.Logger; +import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.fop.apps.FOPException; +import org.apache.fop.fo.EnumProperty; +import org.apache.fop.fo.expr.NCnameProperty; +import org.apache.fop.fo.properties.Constants; +import org.apache.fop.fo.LengthProperty; +import org.apache.fop.fo.ListProperty; +import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.Property; +import org.apache.fop.fo.SpaceProperty; +import org.apache.fop.fo.ColorTypeProperty; +import org.apache.fop.fo.NumberProperty; +import org.apache.fop.datatypes.ColorType; + +//RTF +import org.apache.fop.rtf.rtflib.rtfdoc.RtfAttributes; +import org.apache.fop.rtf.rtflib.rtfdoc.RtfColorTable; +import org.apache.fop.rtf.rtflib.rtfdoc.RtfFontManager; +import org.apache.fop.rtf.rtflib.rtfdoc.RtfText; + + +/** Converts FO properties to RtfAttributes + * @author Bertrand Delacretaz bdelacretaz@codeconsult.ch + * @author Andreas Putz a.putz@skynamics.com + * @author Boris Poudérous boris.pouderous@eads-telecom.com + * @author Peter Herweg, pherweg@web.de + * @author Normand Massé + * @author Chris Scott + * @author rmarra + */ + +class TextAttributesConverter { + private static Logger log = new ConsoleLogger(); + + /** + * Converts all known text FO properties to RtfAttributes + * @param props list of FO properites, which are to be converted + * @param props list of default FO properites (usally null) + */ + public static RtfAttributes convertAttributes(PropertyList props, PropertyList defProps) + throws FOPException { + RtfAttributes attrib = null; + + if (defProps != null) { + attrib = convertAttributes(defProps, null); + } else { + attrib = new RtfAttributes(); + } + + attrBlockFontFamily(props, attrib); + attrBlockFontWeight(props, attrib); + attrBlockFontSize(props, attrib); + attrBlockFontColor(props, attrib); + attrBlockFontItalic(props, attrib); + attrBlockFontUnderline(props, attrib); + attrBlockBackgroundColor(props, attrib); + attrBlockSpaceBeforeAfter(props, attrib); + attrBlockMargins(props, attrib); + attrBlockTextAlign(props, attrib); + + return attrib; + } + + /** + * Converts all character related FO properties to RtfAttributes. + * @param props list of FO properites, which are to be converted + * @param props list of default FO properites (usally null) + */ + public static RtfAttributes convertCharacterAttributes(PropertyList props, PropertyList defProps) + throws FOPException { + + RtfAttributes attrib = null; + + if (defProps != null) { + attrib = convertCharacterAttributes(defProps, null); + } else { + attrib = new RtfAttributes(); + } + + attrBlockFontFamily(props, attrib); + attrBlockFontWeight(props, attrib); + attrBlockFontSize(props, attrib); + attrBlockFontColor(props, attrib); + attrBlockFontItalic(props, attrib); + attrBlockFontUnderline(props, attrib); + attrBlockBackgroundColor(props, attrib); + + return attrib; + } + + + private static void attrBlockFontFamily(PropertyList properties, RtfAttributes rtfAttr) { + String fopValue = properties.get("font-family").getString(); + + if (fopValue != null) { + rtfAttr.set(RtfText.ATTR_FONT_FAMILY, RtfFontManager.getInstance().getFontNumber(fopValue)); + } + } + + private static void attrBlockFontSize(PropertyList properties, RtfAttributes rtfAttr) { + int fopValue = properties.get("font-size").getLength().getValue() / 500; + rtfAttr.set("fs", fopValue); + } + + private static void attrBlockFontColor(PropertyList properties, RtfAttributes rtfAttr) { + // Cell background color + ColorTypeProperty colorTypeProp=(ColorTypeProperty)properties.get("color"); + if(colorTypeProp != null) { + ColorType colorType = colorTypeProp.getColorType(); + if (colorType != null) { + if (colorType.getAlpha() != 0 + || colorType.getRed() != 0 + || colorType.getGreen() != 0 + || colorType.getBlue() != 0) { + rtfAttr.set( + RtfText.ATTR_FONT_COLOR, + convertFOPColorToRTF(colorType)); + } + } else { + log.warn("Named color '" + colorTypeProp.toString() + "' not found. "); + } + } + } + + + + private static void attrBlockFontWeight(PropertyList properties, RtfAttributes rtfAttr) { + String fopValue = properties.get("font-weight").getString(); + if (fopValue == "bold" || fopValue == "700") { + rtfAttr.set("b", 1); + } else { + rtfAttr.set("b", 0); + } + } + + private static void attrBlockFontItalic(PropertyList properties, RtfAttributes rtfAttr) { + String fopValue = properties.get("font-style").getString(); + if(fopValue.equals("italic")) { + rtfAttr.set(RtfText.ATTR_ITALIC, 1); + } else { + rtfAttr.set(RtfText.ATTR_ITALIC, 0); + } + } + + private static void attrBlockFontUnderline(PropertyList properties, RtfAttributes rtfAttr) { + EnumProperty enumProp=(EnumProperty)properties.get("text-decoration"); + if(enumProp.getEnum()==Constants.UNDERLINE) { + rtfAttr.set(RtfText.ATTR_UNDERLINE, 1); + } else { + rtfAttr.set(RtfText.ATTR_UNDERLINE, 0); + } + } + + private static void attrBlockSpaceBeforeAfter(PropertyList properties, RtfAttributes rtfAttr) { + SpaceProperty spaceProp=null; + + //space-before + spaceProp=(SpaceProperty)properties.get("space-before"); + if(spaceProp!=null) { + Float f = new Float(spaceProp.getLengthRange().getOptimum().getLength().getValue() / 1000f); + String sValue = f.toString() + "pt"; + + try { + rtfAttr.set( + RtfText.SPACE_BEFORE, + (int)FoUnitsConverter.getInstance().convertToTwips(sValue)); + } catch(FOPException fe) { + log.warn("attrBlockSpaceBeforeAfter: " + fe.getMessage()); + } + } + + //space-after + spaceProp=(SpaceProperty)properties.get("space-after"); + if(spaceProp!=null) { + Float f = new Float(spaceProp.getLengthRange().getOptimum().getLength().getValue() / 1000f); + String sValue = f.toString() + "pt"; + + try { + rtfAttr.set( + RtfText.SPACE_AFTER, + (int)FoUnitsConverter.getInstance().convertToTwips(sValue)); + } catch(FOPException fe) { + log.warn("attrBlockSpaceBeforeAfter: " + fe.getMessage()); + } + } + } + + private static void attrBlockMargins(PropertyList properties, RtfAttributes rtfAttr) { + try { + LengthProperty lengthProp=null; + + // margin-left + lengthProp=(LengthProperty)properties.get("margin-left"); + if (lengthProp != null) { + Float f = new Float(lengthProp.getLength().getValue() / 1000f); + String sValue = f.toString() + "pt"; + + rtfAttr.set( + RtfText.LEFT_INDENT_BODY, + (int)FoUnitsConverter.getInstance().convertToTwips(sValue)); + } else { + rtfAttr.set(RtfText.LEFT_INDENT_BODY, 0); + } + + // margin-right + lengthProp=(LengthProperty)properties.get("margin-right"); + if (lengthProp != null) { + Float f = new Float(lengthProp.getLength().getValue() / 1000f); + String sValue = f.toString() + "pt"; + + rtfAttr.set( + RtfText.LEFT_INDENT_BODY, + (int)FoUnitsConverter.getInstance().convertToTwips(sValue)); + } else { + rtfAttr.set(RtfText.RIGHT_INDENT_BODY, 0); + } + } catch(FOPException fe) { + log.warn("attrBlockSpaceBeforeAfter: " + fe.getMessage()); + } + } + + + + private static void attrBlockTextAlign(PropertyList properties, RtfAttributes rtfAttr) { + int fopValue = properties.get("text-align").getEnum(); + String rtfValue = null; + switch (fopValue) { + case Constants.CENTER: { + rtfValue = RtfText.ALIGN_CENTER; + break; + } + case Constants.END: { + rtfValue = RtfText.ALIGN_RIGHT; + break; + } + case Constants.JUSTIFY: { + rtfValue = RtfText.ALIGN_JUSTIFIED; + break; + } + default: { + rtfValue = RtfText.ALIGN_LEFT; + break; + } + } + + rtfAttr.set(rtfValue); + } + + /** + * Reads background-color from bl and writes it to rtfAttr. + * + * @param bl the Block object the properties are read from + * @param rtfAttr the RtfAttributes object the attributes are written to + */ + private static void attrBlockBackgroundColor(PropertyList properties, RtfAttributes rtfAttr) { + ColorType fopValue = properties.get("background-color").getColorType(); + int rtfColor = 0; + /* FOP uses a default background color of "transparent", which is + actually a transparent black, which is generally not suitable as a + default here. Changing FOP's default to "white" causes problems in + PDF output, so we will look for the default here & change it to + "auto". */ + if ((fopValue.getRed() == 0) + && (fopValue.getGreen() == 0) + && (fopValue.getBlue() == 0) + && (fopValue.getAlpha() == 0)) { + rtfColor = 0; //=auto + } else { + rtfColor = convertFOPColorToRTF(fopValue); + } + + rtfAttr.set(RtfText.ATTR_BACKGROUND_COLOR, rtfColor); + } + + /** + * Converts a FOP ColorType to the integer pointing into the RTF color table + * @param fopColor the ColorType object to be converted + * @return integer pointing into the RTF color table + */ + public static int convertFOPColorToRTF(ColorType fopColor) { + int redComponent = ColorType.convertChannelToInteger (fopColor.getRed()); + int greenComponent = ColorType.convertChannelToInteger (fopColor.getGreen()); + int blueComponent = ColorType.convertChannelToInteger (fopColor.getBlue()); + return RtfColorTable.getInstance().getColorNumber(redComponent, + greenComponent, blueComponent).intValue(); + } + +} |