]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
RTF: added support for fo:external-graphic
authorJeremias Maerki <jeremias@apache.org>
Sat, 8 Nov 2003 14:01:24 +0000 (14:01 +0000)
committerJeremias Maerki <jeremias@apache.org>
Sat, 8 Nov 2003 14:01:24 +0000 (14:01 +0000)
Submitted By: Peter Herweg <pherweg@web.de>

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@196994 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/flow/ExternalGraphic.java
src/java/org/apache/fop/render/rtf/RTFHandler.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfExternalGraphic.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfTextrun.java
src/java/org/apache/fop/render/rtf/rtflib/tools/ImageUtil.java

index 83d603b787a8a2f4a501c06766e68b09ec62df9d..0e78676c0d2c66f2ea63ff8b39682d6dc4557f2b 100644 (file)
  */
 package org.apache.fop.fo.flow;
 
+// XML
+import org.xml.sax.Attributes;
+
 // FOP
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
@@ -267,4 +271,12 @@ public class ExternalGraphic extends FObj {
         return placement;
     }
 
+    /**
+     * @see org.apache.fop.fo.FObj#handleAttrs
+     */
+    public void handleAttrs(Attributes attlist) throws FOPException {
+        super.handleAttrs(attlist);
+
+        getFOTreeControl().getFOInputHandler().image(this);
+    }
 }
index 85c07e96af494dd6087d330d16725750556c0ced..ef2df1947cd6c81586a110db788bd435ebcf4c1b 100644 (file)
@@ -59,7 +59,9 @@ import org.apache.avalon.framework.logger.ConsoleLogger;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.ColorType;
+import org.apache.fop.fo.EnumProperty;
 import org.apache.fop.fo.FOInputHandler;
+import org.apache.fop.datatypes.FixedLength;
 import org.apache.fop.fo.flow.Block;
 import org.apache.fop.fo.flow.ExternalGraphic;
 import org.apache.fop.fo.flow.Inline;
@@ -78,10 +80,12 @@ import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.fo.pagination.SimplePageMaster;
 import org.apache.fop.fo.properties.Constants;
 import org.apache.fop.fo.Property;
+import org.apache.fop.fo.LengthProperty;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.apps.Document;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfAfterContainer;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfBeforeContainer;
+import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfExternalGraphicContainer;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfPageNumberContainer;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfParagraphContainer;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.IRtfTextrunContainer;
@@ -91,6 +95,7 @@ import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfBefore;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfColorTable;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfDocumentArea;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfElement;
+import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfExternalGraphic;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfFile;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfFontManager;
 import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfParagraph;
@@ -111,6 +116,7 @@ import org.xml.sax.SAXException;
  * @author Trembicki-Guy, Ed <GuyE@DNB.com>
  * @author Boris Poudérous <boris.pouderous@eads-telecom.com>
  * @author Peter Herweg <pherweg@web.de>
+ * @author Andreas Putz <a.putz@skynamics.com>
  */
 public class RTFHandler extends FOInputHandler {
 
@@ -693,6 +699,64 @@ public class RTFHandler extends FOInputHandler {
      * @see org.apache.fop.fo.FOInputHandler#image(ExternalGraphic)
      */
     public void image(ExternalGraphic eg) {
+        try {
+       
+        
+            final IRtfTextrunContainer c =
+                    (IRtfTextrunContainer)builderContext.getContainer(IRtfTextrunContainer.class,
+                    true, this);
+            
+            final RtfExternalGraphic newGraphic = c.getTextrun().newImage();
+       
+            Property p=null; 
+               
+            //get source file
+            if((p=eg.properties.get("src"))!=null) {
+                newGraphic.setURL (p.getString());
+            } else {
+                log.error("The attribute 'src' of <fo:external-graphic> is required.");
+                return;
+            }
+            
+            //get scaling
+            if((p=eg.properties.get("scaling"))!=null) {
+                EnumProperty e=(EnumProperty)p;
+                if(p.getEnum()==Constants.UNIFORM) {
+                    newGraphic.setScaling ("uniform");
+                }
+            }
+            
+            //get width
+            if((p=eg.properties.get("width"))!=null) {
+                LengthProperty lengthProp=(LengthProperty)p;
+                if(lengthProp.getLength() instanceof FixedLength) {
+                    Float f = new Float(lengthProp.getLength().getValue() / 1000f);
+                    String sValue = f.toString() + "pt";
+                    newGraphic.setWidth(sValue);
+                }
+            }
+            
+            //get height
+            if((p=eg.properties.get("height"))!=null) {
+                LengthProperty lengthProp=(LengthProperty)p;
+                if(lengthProp.getLength() instanceof FixedLength) {
+                    Float f = new Float(lengthProp.getLength().getValue() / 1000f);
+                    String sValue = f.toString() + "pt";
+                    newGraphic.setHeight(sValue);
+                }
+            }
+
+            //TODO: make this configurable:
+            //      int compression = m_context.m_options.getRtfExternalGraphicCompressionRate ();
+            int compression = 0;
+            if (compression != 0) {
+                if (! newGraphic.setCompressionRate (compression)) {
+                    log.warn("The compression rate " + compression + " is invalid. The value has to be between 1 and 100 %.");
+                }
+            }
+        } catch(Exception e) {
+            log.error("image: " + e.getMessage());
+        }
     }
 
     /**
index 76a6bc6632a5a27e10d33193d1f85ad3267498be..6af9e4ce9eeb1ddfb9e8ecff7547b3619c19278b 100644 (file)
@@ -277,10 +277,10 @@ public class RtfExternalGraphic extends RtfElement {
             // convert
             int to = ImageConstants.CONVERT_TO [type - ImageConstants.I_TO_CONVERT_BASIS];
 
-            if (to == ImageConstants.I_JPG) {
-                ByteArrayOutputStream out = null;
+//            if (to == ImageConstants.I_JPG) {
+//                ByteArrayOutputStream out = null;
 //                try {
-                    //convert to jpeg
+//                    //convert to jpeg
 //                    out = new ByteArrayOutputStream();
 //                    Encoder jpgEncoder = new Encoder(graphicCompressionRate, out);
 //                    jpgEncoder.encodeJPEG(data);
@@ -292,11 +292,11 @@ public class RtfExternalGraphic extends RtfElement {
 //                            + "not be created (src = '" + url + "'");
 //                }
 //                finally {
-                    out.close();
+//                    out.close();
 //                }
-            } else {
+//            } else {
                 type = ImageConstants.I_NOT_SUPPORTED;
-            }
+//            }
         }
 
 
index 32910ca1ab2db04f8092d0ced7788b7898d842c3..7a12202c294478e87460ccac29c71be0582f018c 100644 (file)
@@ -63,6 +63,7 @@ import java.util.List;
 import java.util.Iterator;
 import java.io.IOException;
 import org.apache.fop.render.rtf.rtflib.exceptions.RtfStructureException;
+import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfExternalGraphic;
 
 /**  Class which contains a linear text run. It has methods to add attributes, text, paragraph breaks....
  *  @author Peter Herweg, pherweg@web.de
@@ -167,6 +168,10 @@ public class RtfTextrun extends RtfContainer {
     public void addPageNumber(RtfAttributes attr) throws IOException {
         RtfPageNumber r=new RtfPageNumber(this, writer, attr);
     }
+    
+    public RtfExternalGraphic newImage() throws IOException {
+        return new RtfExternalGraphic(this, writer);
+    }
 
     /**
      * Adds a new RtfTextrun to the given container if necessary, and returns it.
index a762083dba1bbaf889660e0f1e4c901201a7e38c..dab3338c0405891830f3e744da7e5a2a4acde239 100644 (file)
@@ -95,6 +95,10 @@ public class ImageUtil {
         for (int i = 0; i < len; i++) {
             if (Character.isDigit (s.charAt (i))) {
                 retString += s.charAt (i);
+            } else {
+                //for example "600.0pt" has to be exited,
+                //when the dot is reached.
+                break; 
             }
         }