Changeset 1631


Ignore:
Timestamp:
07/31/11 14:04:51 (10 months ago)
Author:
jharrop
Message:

Alberto's patch (email 29 July) to the conversion process (HtmlExporterNG2,
(Pdf)Conversion, SvgExporter?):

With this change, storing any images is delegated to a
ConversionImageHandler? that may be passed as a conversion parameter. The
default implementation (DefaultConversionImageHandler?) contains the
functionality from handleImageRel and AbstractWordXmlPicture?.handlePart.

Location:
trunk/docx4j/src
Files:
4 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/html/AbstractHtmlExporter.java

    r1398 r1631  
    1212import org.apache.log4j.Logger; 
    1313import org.docx4j.UnitsOfMeasurement; 
     14import org.docx4j.convert.out.AbstractConversionSettings; 
    1415import org.docx4j.convert.out.Output; 
    1516import org.docx4j.fonts.Mapper; 
     
    2021import org.docx4j.model.properties.Property; 
    2122import org.docx4j.model.properties.PropertyFactory; 
    22 import org.docx4j.model.properties.paragraph.Indent; 
    2323import org.docx4j.model.properties.paragraph.PBorderBottom; 
    2424import org.docx4j.model.properties.paragraph.PBorderTop; 
     
    3030import org.docx4j.model.properties.table.BorderTop; 
    3131import org.docx4j.model.styles.StyleTree; 
     32import org.docx4j.model.styles.StyleTree.AugmentedStyle; 
    3233import org.docx4j.model.styles.Tree; 
    33 import org.docx4j.model.styles.StyleTree.AugmentedStyle; 
    3434import org.docx4j.openpackaging.exceptions.Docx4JException; 
    3535import org.docx4j.openpackaging.packages.OpcPackage; 
     
    4040import org.docx4j.wml.CTTblStylePr; 
    4141import org.docx4j.wml.PPr; 
     42import org.docx4j.wml.PPrBase.Ind; 
    4243import org.docx4j.wml.RPr; 
    4344import org.docx4j.wml.STBorder; 
     
    4748import org.docx4j.wml.TcPr; 
    4849import org.docx4j.wml.TrPr; 
    49 import org.docx4j.wml.PPrBase.Ind; 
    5050import org.w3c.dom.Document; 
    5151import org.w3c.dom.DocumentFragment; 
     
    281281//    }     
    282282     
    283         public static class HtmlSettings { 
    284  
    285                 private Map<String, Object> settings; 
     283        public static class HtmlSettings extends AbstractConversionSettings { 
     284                 
     285                public static final String CONDITIONAL_COMMENTS = "conditionalComments"; 
     286                public static final String FONT_FAMILY_STACK = "fontFamilyStack"; 
     287                public static final String USER_CSS = "userCSS"; 
     288                public static final String USER_SCRIPT = "userScript"; 
     289                public static final String USER_BODY_TOP = "userBodyTop"; 
     290                public static final String USER_BODY_TAIL = "userBodyTail"; 
    286291                 
    287292                public HtmlSettings() { 
    288                         settings = new java.util.HashMap<String, Object>(); 
    289                         settings.put("conditionalComments", Boolean.FALSE); 
    290                         settings.put("fontFamilyStack",     Boolean.FALSE); 
    291                         settings.put("imageDirPath", ""); 
    292                          
    293                         settings.put("userCSS", ""); 
    294                         settings.put("userScript", ""); 
    295                         settings.put("userBodyTop", "<!-- userBodyTop goes here -->"); 
    296                         settings.put("userBodyTail", "<!-- userBodyTail goes here -->"); 
    297                          
    298                 } 
    299                  
    300                 public Map<String, Object> getSettings() { 
    301                         return settings; 
    302                 } 
    303                  
    304                 public void setWmlPackage(OpcPackage wmlPackage) { 
    305                         settings.put("wmlPackage", wmlPackage); 
    306                 } 
    307                 public OpcPackage getWmlPackage() { 
    308                         return (OpcPackage)settings.get("wmlPackage"); 
     293                        settings.put(CONDITIONAL_COMMENTS, Boolean.FALSE); 
     294                        settings.put(FONT_FAMILY_STACK,     Boolean.FALSE); 
     295                         
     296                        settings.put(USER_CSS, ""); 
     297                        settings.put(USER_SCRIPT, ""); 
     298                        settings.put(USER_BODY_TOP, "<!-- userBodyTop goes here -->"); 
     299                        settings.put(USER_BODY_TAIL, "<!-- userBodyTail goes here -->"); 
     300                         
    309301                } 
    310302                 
     
    322314                public Mapper getFontMapper() { 
    323315                        return (Mapper)settings.get("fontMapper"); 
    324                 } 
    325                  
    326                 // If this is set to something, images in 
    327                 // internal binary parts will be saved to this directory; 
    328                 // otherwise they won't 
    329                 public void setImageDirPath(String imageDirPath) { 
    330                         settings.put("imageDirPath", imageDirPath); 
    331                 } 
    332                 public String getImageDirPath() { 
    333                         return (String)settings.get("imageDirPath"); 
    334316                } 
    335317                                 
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/html/HtmlExporterNG2.java

    r1450 r1631  
    4040import org.docx4j.model.TransformState; 
    4141import org.docx4j.model.SymbolModel.SymbolModelTransformState; 
     42import org.docx4j.model.images.DefaultConversionImageHandler; 
    4243import org.docx4j.model.styles.StyleTree; 
    4344import org.docx4j.model.styles.Tree; 
     
    168169         *  
    169170         * */  
     171        @Override 
    170172        @Deprecated      
    171173    public void html(WordprocessingMLPackage wmlPackage, javax.xml.transform.Result result, 
     
    175177    } 
    176178 
     179        @Override 
    177180        @Deprecated 
    178181    public void html(WordprocessingMLPackage wmlPackage, javax.xml.transform.Result result, boolean fontFamilyStack, 
     
    197200         *  
    198201         * */  
     202        @Override 
    199203        public void html(WordprocessingMLPackage wmlPackage, 
    200204                        javax.xml.transform.Result result, HtmlSettings htmlSettings) 
     
    221225                } 
    222226 
     227                // Ensure that the imageHandler is set up 
     228                boolean privateImageHandler = false; 
     229                if (htmlSettings.getImageHandler() == null) { 
     230                        htmlSettings.setImageHandler(htmlSettings.getImageDirPath() != null ?  
     231                                        new DefaultConversionImageHandler(htmlSettings.getImageDirPath()) :  
     232                                        new DefaultConversionImageHandler()); 
     233                        privateImageHandler = true; 
     234                } 
     235                 
    223236                if (htmlSettings.getFontMapper() == null) { 
    224237                        htmlSettings.setFontMapper(wmlPackage.getFontMapper()); 
     
    259272                                result); 
    260273 
     274                if (privateImageHandler) { 
     275                        //remove a locally created imageHandler in case the HtmlSettings get reused 
     276                        htmlSettings.getSettings().remove(HtmlSettings.IMAGE_HANDLER); 
     277                } 
    261278                log.info("wordDocument transformed to xhtml .."); 
    262279 
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/html/docx2xhtmlNG2.xslt

    r1555 r1631  
    3232<xsl:param name="wmlPackage"/> <!-- select="'passed in'"-->      
    3333<xsl:param name="modelStates"/> <!-- select="'passed in'"-->     
    34 <xsl:param name="imageDirPath"/> 
     34<xsl:param name="imageHandler"/> 
    3535    
    3636<!-- Used in extension function for mapping fonts -->            
     
    345345        <xsl:copy-of select="java:org.docx4j.model.images.WordXmlPictureE20.createHtmlImgE20(  
    346346                        $wmlPackage,  
    347                         string($imageDirPath), 
     347                        $imageHandler, 
    348348                        $wpinline)" /> 
    349349                </xsl:when> 
     
    367367                                <xsl:copy-of select="java:org.docx4j.model.images.WordXmlPictureE10.createHtmlImgE10(  
    368368                                                $wmlPackage,  
    369                                                 string($imageDirPath), 
     369                                                $imageHandler, 
    370370                                                $wpict)" /> 
    371371                        </xsl:when> 
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/PdfConversion.java

    r1168 r1631  
    11package org.docx4j.convert.out.pdf; 
    22 
    3 import java.io.File; 
    43import java.io.OutputStream; 
    54 
    65import org.apache.log4j.Logger; 
     6import org.docx4j.convert.out.pdf.viaXSLFO.PdfSettings; 
    77import org.docx4j.openpackaging.exceptions.Docx4JException; 
    88import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     
    2525 */ 
    2626public abstract class PdfConversion  { 
    27          
     27                 
    2828        // can't implement Output interface, because PDF output isn't XML 
    2929        // so instead, have something similar:   
    30         public abstract void output(OutputStream os) throws Docx4JException; 
     30        public abstract void output(OutputStream os, PdfSettings settings) throws Docx4JException; 
    3131                 
    3232        protected static Logger log = Logger.getLogger(PdfConversion.class);     
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/viaXSLFO/Conversion.java

    r1572 r1631  
    4343import org.docx4j.jaxb.Context; 
    4444import org.docx4j.model.PropertyResolver; 
     45import org.docx4j.model.SymbolModel.SymbolModelTransformState; 
    4546import org.docx4j.model.TransformState; 
    46 import org.docx4j.model.SymbolModel.SymbolModelTransformState; 
     47import org.docx4j.model.images.DefaultConversionImageHandler; 
    4748import org.docx4j.model.listnumbering.Emulator.ResultTriple; 
    4849import org.docx4j.model.properties.Property; 
     
    6162import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
    6263import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; 
    63 import org.docx4j.wml.Body; 
    6464import org.docx4j.wml.CTPageNumber; 
    6565import org.docx4j.wml.CTSimpleField; 
    6666import org.docx4j.wml.NumberFormat; 
    6767import org.docx4j.wml.PPr; 
     68import org.docx4j.wml.PPrBase.NumPr.Ilvl; 
    6869import org.docx4j.wml.RPr; 
    6970import org.docx4j.wml.Style; 
    7071import org.docx4j.wml.TcPr; 
    71 import org.docx4j.wml.PPrBase.NumPr.Ilvl; 
    7272import org.w3c.dom.Document; 
    7373import org.w3c.dom.DocumentFragment; 
     
    221221         * @param os 
    222222         *            The OutputStream to write the pdf to  
     223         * @param settings 
     224         *            The configuration for the conversion  
    223225         *  
    224226         * */      
    225         public void output(OutputStream os) throws Docx4JException { 
     227        @Override 
     228        public void output(OutputStream os, PdfSettings settings) throws Docx4JException { 
    226229 
    227230                // See http://xmlgraphics.apache.org/fop/0.95/embedding.html 
     
    294297                                        Context.jcSectionModel); 
    295298 
    296                         java.util.HashMap<String, Object> settings = new java.util.HashMap<String, Object>(); 
    297                         settings.put("wmlPackage", wordMLPackage); 
    298                         String imageDirPath = System.getProperty("java.io.tmpdir"); 
    299                         settings.put("imageDirPath", imageDirPath); 
     299                        if (settings == null) { 
     300                                settings = new PdfSettings(); 
     301                        } 
     302                        settings.setWmlPackage(wordMLPackage); 
     303                        boolean privateImageHandler = false; 
     304                        if (settings.getImageHandler() == null) { 
     305                                settings.setImageHandler(settings.getImageDirPath() != null ?  
     306                                                new DefaultConversionImageHandler(settings.getImageDirPath()) :  
     307                                                new DefaultConversionImageHandler()); 
     308                                privateImageHandler = true; 
     309                        } 
     310                         
    300311 
    301312                        // Resulting SAX events (the generated FO) must be piped through to 
     
    309320                        // per converter. 
    310321                        HashMap<String, TransformState> modelStates = new HashMap<String, TransformState>(); 
    311                         settings.put("modelStates", modelStates); 
     322                        settings.getSettings().put("modelStates", modelStates); 
    312323 
    313324                        // Converter c = new Converter(); 
     
    335346                                Result intermediateResult = new StreamResult(intermediate); 
    336347 
    337                                 XmlUtils.transform(domDoc, xslt, settings, intermediateResult); 
     348                                XmlUtils.transform(domDoc, xslt, settings.getSettings(), intermediateResult); 
    338349 
    339350                                String fo = intermediate.toString("UTF-8"); 
     
    351362                        } else { 
    352363 
    353                                 XmlUtils.transform(domDoc, xslt, settings, result); 
     364                                XmlUtils.transform(domDoc, xslt, settings.getSettings(), result); 
     365                        } 
     366                         
     367                        if (privateImageHandler) { 
     368                                //remove a locally created imageHandler in case the HtmlSettings get reused 
     369                                settings.getSettings().remove(PdfSettings.IMAGE_HANDLER); 
    354370                        } 
    355371 
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/viaXSLFO/docx2fo.xslt

    r1368 r1631  
    6363<xsl:param name="wmlPackage"/> <!-- select="'passed in'"-->      
    6464<xsl:param name="modelStates"/> <!-- select="'passed in'"-->     
    65 <xsl:param name="imageDirPath"/> 
     65<xsl:param name="imageHandler"/> 
    6666    
    6767<!-- Used in extension function for mapping fonts -->            
     
    487487                 
    488488                        <xsl:copy-of select="java:org.docx4j.model.images.WordXmlPictureE20.createXslFoImgE20(  
    489                                         $wmlPackage, string($imageDirPath), 
     489                                        $wmlPackage, $imageHandler, 
    490490                                        $wpinline, $modelStates)" />             
    491491                </xsl:when> 
     
    509509                         
    510510                        <xsl:copy-of select="java:org.docx4j.model.images.WordXmlPictureE10.createXslFoImgE10(  
    511                         $wmlPackage, string($imageDirPath), 
     511                        $wmlPackage, $imageHandler, 
    512512                        $wpict, $modelStates)" /> 
    513513                </xsl:when> 
  • trunk/docx4j/src/main/java/org/docx4j/model/images/AbstractWordXmlPicture.java

    r1625 r1631  
    11package org.docx4j.model.images; 
    2  
    3 import java.io.IOException; 
    4 import java.io.OutputStream; 
    5 import java.util.concurrent.locks.ReadWriteLock; 
    6 import java.util.concurrent.locks.ReentrantReadWriteLock; 
    72 
    83import javax.xml.parsers.DocumentBuilderFactory; 
    94import javax.xml.parsers.ParserConfigurationException; 
    105 
    11 import org.apache.commons.codec.binary.Base64; 
    12 import org.apache.commons.vfs.CacheStrategy; 
    13 import org.apache.commons.vfs.FileObject; 
    14 import org.apache.commons.vfs.FileSystemException; 
    15 import org.apache.commons.vfs.FileSystemManager; 
    16 import org.apache.commons.vfs.impl.StandardFileSystemManager; 
    176import org.apache.log4j.Logger; 
    187import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
    198import org.docx4j.openpackaging.parts.Part; 
    209import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart; 
    21 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 
    2210import org.docx4j.openpackaging.parts.WordprocessingML.MetafileEmfPart; 
    23 import org.docx4j.openpackaging.parts.WordprocessingML.MetafilePart; 
    2411import org.docx4j.openpackaging.parts.WordprocessingML.MetafileWmfPart; 
    2512import org.docx4j.openpackaging.parts.WordprocessingML.MetafileWmfPart.SvgDocument; 
     
    263250    } 
    264251         
     252        protected void handleImageRel(ConversionImageHandler imageHandler, String imgRelId, Part sourcePart) { 
     253        Relationship rel = sourcePart.getRelationshipsPart().getRelationshipByID(imgRelId); 
     254        Part part = null; 
     255        String uri = null; 
     256        boolean ignoreImage = false; 
     257                setID(imgRelId);                 
     258                 
     259                if (rel.getTargetMode() == null || rel.getTargetMode().equals("Internal")) { 
     260                        part = sourcePart.getRelationshipsPart().getPart(rel); 
     261                        if (!(part instanceof BinaryPart)) { 
     262                                log.error("Invalid part type id: " + imgRelId + ", class = " + part.getClass().getName()); 
     263                                ignoreImage = true; 
     264                        } 
     265                } 
     266                if (!ignoreImage) { 
     267                        uri = handlePart(imageHandler, this, rel, (BinaryPart)part); 
     268                        if (uri != null) { 
     269                                this.setSrc(uri); 
     270                        } 
     271                } 
     272        } 
    265273 
    266274        /** 
    267          * @param imageDirPath 
     275         * @param imageHandler 
    268276         * @param picture 
     277         * @param relationship 
    269278         * @param part 
    270279         * @return uri for the image we've saved, or null 
    271280         */ 
    272         protected static String handlePart(String imageDirPath, AbstractWordXmlPicture picture, 
    273                         Part part) { 
    274                 try { 
    275  
    276                         if (imageDirPath.equals("")) { 
    277                                  
    278                                 // TODO: this isn't going to work for XSL FO! 
    279                                 // So for XSL FO, you always need an imageDirPath!  
    280  
    281                                 // <img 
    282                                 // src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/ 
    283                                 // 
    284                                 // which is nice, except it doesn't work in IE7, 
    285                                 // and is limited to 32KB in IE8! 
    286  
    287                                 java.nio.ByteBuffer bb = ((BinaryPart) part) 
    288                                                 .getBuffer(); 
    289                                 bb.clear(); 
    290                                 byte[] bytes = new byte[bb.capacity()]; 
    291                                 bb.get(bytes, 0, bytes.length); 
    292                                  
    293                                 byte[] encoded = Base64.encodeBase64(bytes, true); 
    294  
    295                                 picture 
    296                                                 .setSrc("data:" + part.getContentType() 
    297                                                                 + ";base64," 
    298                                                                 + (new String(encoded, "UTF-8"))); 
    299                                  
    300                                 return null; 
    301  
    302                         } else { 
    303                                 // Need to save the image 
    304  
    305                                 // To create directory: 
    306                                 FileObject folder = getFileSystemManager() 
    307                                                 .resolveFile(imageDirPath); 
    308                                 if (!folder.exists()) { 
    309                                         folder.createFolder(); 
    310                                 } 
    311  
    312                                 // Construct a file name from the part name 
    313                                 String partname = part.getPartName().toString(); 
    314                                 String filename = partname.substring(partname 
    315                                                 .lastIndexOf("/") + 1); 
    316                                  
    317                                 // Don't want multiple threads using the same file 
    318                                 if (Thread.currentThread().getName()!=null) { 
    319                                         filename = Thread.currentThread().getName() + filename;  
    320                                 } 
    321                                  
    322                                  
    323                                 log.debug("image file name: " + filename); 
    324  
    325                                 FileObject fo = folder.resolveFile(filename); 
    326                                 if (fo.exists()) { 
    327  
    328                                         log.warn("Overwriting (!) existing file!"); 
    329  
    330                                 } else { 
    331                                         fo.createFile(); 
    332                                 } 
    333                                 // System.out.println("URL: " + 
    334                                 // fo.getURL().toExternalForm() ); 
    335                                 // System.out.println("String: " + fo.toString() ); 
    336  
    337                                 // Save the file 
    338                                 OutputStream out = fo.getContent() 
    339                                                 .getOutputStream(); 
    340                                 // instance of org.apache.commons.vfs.provider.DefaultFileContent$FileContentOutputStream 
    341                                 // which extends MonitorOutputStream 
    342                             // which in turn extends BufferedOutputStream 
    343                             // which in turn extends FilterOutputStream. 
    344                                  
    345                                 String src; 
    346                                 try { 
    347                                         java.nio.ByteBuffer bb = ((BinaryPart) part) 
    348                                                         .getBuffer(); 
    349                                         bb.clear(); 
    350                                         byte[] bytes = new byte[bb.capacity()]; 
    351                                         bb.get(bytes, 0, bytes.length); 
    352  
    353                                         out.write(bytes); 
    354                                          
    355                                         // Set the attribute 
    356                                         src = fixImgSrcURL(fo); 
    357                                         picture.setSrc(src); 
    358                                         log.info("Wrote @src='" + src); 
    359                                         return src; 
    360                                 } finally { 
    361                                         try { 
    362                                                 fo.close(); 
    363                                                 // That Closes this file, and its content. 
    364                                                 // Closing the content in turn 
    365                                                 // closes any open stream. 
    366                                                 // out.flush() is unnecessary, since  
    367                                                 // FilterOutputStream's close() does do flush() first. 
    368                                         } catch (IOException ioe) { 
    369                                                 ioe.printStackTrace(); 
    370                                         }                                        
    371                                 } 
    372  
    373                         } 
    374  
    375                 } catch (Exception e) { 
    376                         e.printStackTrace(); 
    377                         log.error(e); 
    378                 } 
    379                 return null; 
    380         } 
    381  
    382         private static FileSystemManager fileSystemManager; 
    383         private static ReadWriteLock aLock = new ReentrantReadWriteLock(true); 
    384  
    385         public static FileSystemManager getFileSystemManager() { 
    386                 aLock.readLock().lock(); 
    387  
    388                 try { 
    389                         if (fileSystemManager == null) { 
    390                                 try { 
    391                                         StandardFileSystemManager fm = new StandardFileSystemManager(); 
    392                                         fm.setCacheStrategy(CacheStrategy.MANUAL); 
    393                                         fm.init(); 
    394                                         fileSystemManager = fm; 
    395                                 } catch (Exception exc) { 
    396                                         throw new RuntimeException(exc); 
    397                                 } 
    398                         } 
    399  
    400                         return fileSystemManager; 
    401                 } 
    402         finally 
    403         { 
    404             aLock.readLock().unlock(); 
    405         } 
    406     } 
    407      
    408         /** 
    409          * imageDirPath is anything VFSJFileChooser can resolve into a FileObject.  
    410          * That's enough for saving the image. In order for a web browser to 
    411          * display it, the URI Scheme has to be something a web browser can 
    412          * understand. So at that point, webdav:// will have to become http://,  
    413          * and smb:// become file:// ... 
    414          */ 
    415     static String fixImgSrcURL( FileObject fo) 
    416     {            
    417         String itemUrl = null; 
    418                 try { 
    419                         itemUrl = fo.getURL().toExternalForm(); 
    420                         log.debug(itemUrl); 
    421  
    422                         String itemUrlLower = itemUrl.toLowerCase();                     
    423                 if (itemUrlLower.startsWith("http://")  
    424                                  || itemUrlLower.startsWith("https://")) { 
    425                                 return itemUrl; 
    426                         } else if (itemUrlLower.startsWith("file://")) { 
    427                                 // we'll convert file protocol to relative reference 
    428                                 // if this is html output 
    429                                  
    430                                 if (fo.getParent() == null) { 
    431                                         return itemUrl;                                  
    432                                 } else if (fo.getParent().getURL().toExternalForm().equalsIgnoreCase( 
    433                                                     getFileSystemManager().resolveFile(System.getProperty("java.io.tmpdir")).getURL().toExternalForm() )) { 
    434                                          
    435                                         // The image is being stored in the system temp directory, 
    436                                         // so assume this is a pdf export, and preserve the absolute 
    437                                         // file path 
    438  
    439                                         // org.apache.commons.vfs.provider.local.LocalFile has a 
    440                                         // method doIsSameFile, but the point of using FileObject is 
    441                                         // that it won't necessarily be a local file.  
    442                                          
    443                                         return itemUrl;                                          
    444                                 } else { 
    445                              // Otherwise, assume it is an html export and return a relative path 
    446                                         return  fo.getParent().getName().getBaseName()  
    447                                                                 + "/" + fo.getName().getBaseName(); 
    448                                 } 
    449                                  
    450                         } else if (itemUrlLower.startsWith("webdav://")) { 
    451                                 // TODO - convert to http:, dropping username / password 
    452                                 return itemUrl; 
    453                         }                        
    454                 log.warn("How to handle scheme: " + itemUrl );         
    455                 } catch (FileSystemException e) { 
    456                         log.error("Problem fixing Img Src URL", e); 
    457                 }                        
    458         return itemUrl;         
    459     } 
    460      
    461      
     281        protected String handlePart(ConversionImageHandler imageHandler, AbstractWordXmlPicture picture, Relationship relationship, BinaryPart binaryPart) { 
     282                return imageHandler.handleImage(picture, relationship, binaryPart); 
     283        } 
    462284         
    463285//      void setAttribute(Node imageElement, String name, String value) { 
  • trunk/docx4j/src/main/java/org/docx4j/model/images/WordXmlPictureE10.java

    r1463 r1631  
    2222import java.util.HashMap; 
    2323 
    24 import javax.xml.namespace.QName; 
     24import javax.xml.bind.JAXBElement; 
     25import javax.xml.bind.JAXBException; 
    2526import javax.xml.parsers.DocumentBuilderFactory; 
    2627import javax.xml.parsers.ParserConfigurationException; 
     
    3334import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
    3435import org.docx4j.openpackaging.parts.Part; 
    35 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 
    36 import org.docx4j.relationships.Relationship; 
    3736import org.docx4j.vml.CTImageData; 
    3837import org.docx4j.vml.CTShape; 
    39 import org.docx4j.vml.CTShapetype; 
    4038import org.docx4j.wml.Pict; 
    4139import org.w3c.dom.Document; 
     
    4341import org.w3c.dom.Node; 
    4442import org.w3c.dom.traversal.NodeIterator; 
    45  
    46 import javax.xml.bind.JAXBElement; 
    47 import javax.xml.bind.JAXBException; 
    48 import javax.xml.bind.Unmarshaller; 
    4943 
    5044/** 
     
    164158    private static WordXmlPictureE10 createWordXmlPictureFromE10( 
    165159                WordprocessingMLPackage wmlPackage, 
    166                 String imageDirPath, 
     160                ConversionImageHandler imageHandler, 
    167161                NodeIterator wpict, 
    168162                Part sourcePart) { 
     
    193187        if (imgRelId!=null && !imgRelId.equals("")) { 
    194188                log.debug("Handling " + imgRelId); 
    195                 converter.handleImageRel(imgRelId, imageDirPath, sourcePart); 
     189                converter.handleImageRel(imageHandler, imgRelId, sourcePart); 
    196190        } else { 
    197191                log.error("No relId?!"); 
     
    213207    public static DocumentFragment createHtmlImgE10( 
    214208                WordprocessingMLPackage wmlPackage, 
    215                 String imageDirPath, 
     209                ConversionImageHandler imageHandler, 
    216210                NodeIterator wpict) { 
    217211         
    218212 
    219213        WordXmlPictureE10 converter = createWordXmlPictureFromE10( wmlPackage, 
    220                          imageDirPath, 
     214                         imageHandler, 
    221215                         wpict, wmlPackage.getMainDocumentPart()); 
    222216         
     
    236230    public static DocumentFragment createXslFoImgE10( 
    237231                WordprocessingMLPackage wmlPackage, 
    238                 String imageDirPath, 
     232                ConversionImageHandler imageHandler, 
    239233                NodeIterator wpict, 
    240234                HashMap<String, TransformState> modelStates) { 
     
    244238         
    245239        WordXmlPictureE10 converter = createWordXmlPictureFromE10( wmlPackage, 
    246                          imageDirPath, 
     240                         imageHandler, 
    247241                         wpict, sourcePart); 
    248242         
    249         log.debug("imageDirPath: " + imageDirPath); 
     243        //log.debug("imageDirPath: " + imageDirPath); 
    250244         
    251245        if (converter==null) { 
     
    297291//              this.data = value; 
    298292//      } 
    299  
    300  
    301  
    302          
    303         private void handleImageRel(String imgRelId, String imageDirPath, Part sourcePart) { 
    304  
    305                 setID(imgRelId);                                 
    306  
    307                 //Relationship rel = wmlPackage.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(imgRelId); 
    308                 Relationship rel = sourcePart.getRelationshipsPart().getRelationshipByID(imgRelId); 
    309          
    310         // if the relationship isn't found, produce a warning 
    311         //if (String.IsNullOrEmpty(picture.Src)) 
    312         //{ 
    313         //    this.embeddedPicturesDropped++; 
    314         //} 
    315          
    316         if (rel.getTargetMode() == null 
    317                         || rel.getTargetMode().equals("Internal") ) { 
    318                  
    319 //              BinaryPartAbstractImage part = (BinaryPartAbstractImage)wmlPackage.getMainDocumentPart() 
    320 //                              .getRelationshipsPart().getPart(rel); 
    321                 BinaryPartAbstractImage part = (BinaryPartAbstractImage)sourcePart 
    322                         .getRelationshipsPart().getPart(rel); 
    323                         String uri = handlePart(imageDirPath, this, part); 
    324                          
    325                         // Scale it?  Shouldn't be necessary, since Word should 
    326                         // be providing the height/width 
    327 //                      try { 
    328 //                              ImageInfo imageInfo = BinaryPartAbstractImage.getImageInfo(uri); 
    329 //                               
    330 //                              List<SectionWrapper> sections = wmlPackage.getDocumentModel().getSections(); 
    331 //                              PageDimensions page = sections.get(sections.size()-1).getPageDimensions(); 
    332 //                               
    333 //                              picture.ensureFitsPage(imageInfo, page ); 
    334 //                      } catch (Exception e) { 
    335 //                              e.printStackTrace(); 
    336 //                      } 
    337                          
    338                  
    339         } else { 
    340             this.setSrc( rel.getTarget() );              
    341         } 
    342                  
    343         } 
    344293         
    345294         
  • trunk/docx4j/src/main/java/org/docx4j/model/images/WordXmlPictureE20.java

    r1131 r1631  
    2121 
    2222import java.util.HashMap; 
     23 
     24import javax.xml.bind.JAXBElement; 
     25import javax.xml.bind.JAXBException; 
     26import javax.xml.bind.Unmarshaller; 
    2327 
    2428import org.apache.log4j.Logger; 
     
    3337import org.docx4j.jaxb.Context; 
    3438import org.docx4j.model.TransformState; 
    35 import org.docx4j.model.images.AbstractWordXmlPicture.Dimensions; 
    3639import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
    3740import org.docx4j.openpackaging.parts.Part; 
    38 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 
    3941import org.docx4j.relationships.Relationship; 
    4042import org.w3c.dom.Document; 
     
    4244import org.w3c.dom.Node; 
    4345import org.w3c.dom.traversal.NodeIterator; 
    44  
    45 import javax.xml.bind.JAXBElement; 
    46 import javax.xml.bind.JAXBException; 
    47 import javax.xml.bind.Unmarshaller; 
    4846 
    4947/** 
     
    227225     */ 
    228226    public static WordXmlPictureE20 createWordXmlPictureFromE20(WordprocessingMLPackage wmlPackage, 
    229                 String imageDirPath, 
     227                ConversionImageHandler imageHandler, 
    230228                NodeIterator anchorOrInline, 
    231229                Part sourcePart) { 
     
    254252        String imgRelId = blip.getEmbed();       
    255253        if (imgRelId!=null) { 
    256                 converter.handleImageRel(imgRelId, imageDirPath, sourcePart); 
     254                converter.handleImageRel(imageHandler, imgRelId, sourcePart); 
    257255        } else if (blip.getLink()!=null) { 
    258                 converter.handleImageRel(blip.getLink(), imageDirPath, sourcePart); 
     256                converter.handleImageRel(imageHandler, blip.getLink(), sourcePart); 
    259257        } else { 
    260258                log.error("not linked or embedded?!"); 
     
    305303     */ 
    306304    public static DocumentFragment createHtmlImgE20(WordprocessingMLPackage wmlPackage, 
    307                 String imageDirPath, 
     305                ConversionImageHandler imageHandler, 
    308306                NodeIterator wpInline) { 
    309307 
    310308        WordXmlPictureE20 converter = createWordXmlPictureFromE20( wmlPackage, 
    311                          imageDirPath, wpInline, wmlPackage.getMainDocumentPart() ); 
     309                         imageHandler, wpInline, wmlPackage.getMainDocumentPart() ); 
    312310         
    313311        return getHtmlDocumentFragment(converter); 
     
    327325     */ 
    328326    public static DocumentFragment createXslFoImgE20(WordprocessingMLPackage wmlPackage, 
    329                 String imageDirPath, 
     327                ConversionImageHandler imageHandler, 
    330328                NodeIterator wpInline,  
    331329                HashMap<String, TransformState> modelStates) { 
     
    334332         
    335333        WordXmlPictureE20 converter = createWordXmlPictureFromE20( wmlPackage, 
    336                          imageDirPath, wpInline, sourcePart); 
     334                         imageHandler, wpInline, sourcePart); 
    337335         
    338336        Document d = converter.createXslFoImageElement(); 
     
    425423    } 
    426424     
    427      
    428         private void handleImageRel(String imgRelId, String imageDirPath, Part sourcePart) { 
    429                  
    430                 setID(imgRelId);                 
    431                 //Relationship rel = wmlPackage.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(imgRelId); 
    432                 Relationship rel = sourcePart.getRelationshipsPart().getRelationshipByID(imgRelId); 
    433                  
    434                 if (rel.getTargetMode() == null 
    435                                 || rel.getTargetMode().equals("Internal")) { 
    436          
    437 //                      Part p = (BinaryPartAbstractImage)wmlPackage.getMainDocumentPart() 
    438 //                                      .getRelationshipsPart().getPart(rel); 
    439                         Part p = (BinaryPartAbstractImage)sourcePart 
    440                                                 .getRelationshipsPart().getPart(rel); 
    441                          
    442                         BinaryPartAbstractImage part = null; 
    443                         if (p instanceof BinaryPartAbstractImage) { 
    444 //                              part= (BinaryPartAbstractImage)wmlPackage.getMainDocumentPart() 
    445 //                                              .getRelationshipsPart().getPart(rel); 
    446                                 part= (BinaryPartAbstractImage)sourcePart 
    447                                                 .getRelationshipsPart().getPart(rel); 
    448                         } else { 
    449                                 // Could be a MetafileEmfPart or WMF 
    450                                 log.error("TODO: Add support for " + p.getClass().getName() ); 
    451                                         // TODO 
    452                         } 
    453                         String uri = handlePart(imageDirPath, this, part); 
    454                         // Scale it?  Shouldn't be necessary, since Word should 
    455                         // be providing the height/width 
    456         //              try { 
    457         //                      ImageInfo imageInfo = BinaryPartAbstractImage.getImageInfo(uri); 
    458         //                       
    459         //                      List<SectionWrapper> sections = wmlPackage.getDocumentModel().getSections(); 
    460         //                      PageDimensions page = sections.get(sections.size()-1).getPageDimensions(); 
    461         //                       
    462         //                      picture.ensureFitsPage(imageInfo, page ); 
    463         //              } catch (Exception e) { 
    464         //                      e.printStackTrace(); 
    465         //              } 
    466          
    467                 } else { // External 
    468                         this.setSrc(rel.getTarget()); 
    469                 }        
    470         } 
    471      
    472425 
    473426//    private byte[] data; 
  • trunk/docx4j/src/main/java/org/docx4j/samples/CreatePdf.java

    r1237 r1631  
    2929 
    3030import org.docx4j.XmlUtils; 
     31import org.docx4j.convert.out.pdf.viaXSLFO.PdfSettings; 
    3132import org.docx4j.fonts.IdentityPlusMapper; 
    3233import org.docx4j.fonts.Mapper; 
     
    9293                                                new java.io.File(inputfilepath + ".fo")); 
    9394                                OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf");                  
    94                                 c.output(os); 
     95                                c.output(os, new PdfSettings() ); 
    9596                                System.out.println("Saved " + inputfilepath + ".pdf"); 
    9697                        }   
  • trunk/docx4j/src/main/java/org/docx4j/utils/VFSUtils.java

    r305 r1631  
    2121package org.docx4j.utils; 
    2222 
     23import java.util.concurrent.locks.ReadWriteLock; 
     24import java.util.concurrent.locks.ReentrantReadWriteLock; 
     25 
     26import org.apache.commons.vfs.CacheStrategy; 
    2327import org.apache.commons.vfs.FileSystemException; 
     28import org.apache.commons.vfs.FileSystemManager; 
     29import org.apache.commons.vfs.impl.StandardFileSystemManager; 
    2430import org.apache.commons.vfs.provider.UriParser; 
    2531 
     
    2834 */ 
    2935public class VFSUtils { 
     36        private static FileSystemManager fileSystemManager; 
     37        private static ReadWriteLock aLock = new ReentrantReadWriteLock(true); 
    3038         
    3139        /** 
     
    6674        } 
    6775 
     76        public static FileSystemManager getFileSystemManager() { 
     77                aLock.readLock().lock(); 
     78 
     79                try { 
     80                        if (fileSystemManager == null) { 
     81                                try { 
     82                                        StandardFileSystemManager fm = new StandardFileSystemManager(); 
     83                                        fm.setCacheStrategy(CacheStrategy.MANUAL); 
     84                                        fm.init(); 
     85                                        fileSystemManager = fm; 
     86                                } catch (Exception exc) { 
     87                                        throw new RuntimeException(exc); 
     88                                } 
     89                        } 
     90 
     91                        return fileSystemManager; 
     92                } 
     93        finally 
     94        { 
     95            aLock.readLock().unlock(); 
     96        } 
     97    } 
     98         
    6899} // VFSUtils class 
    69100 
  • trunk/docx4j/src/pptx4j/java/org/pptx4j/convert/out/svginhtml/PictureExporter.java

    r1179 r1631  
    11package org.pptx4j.convert.out.svginhtml; 
    22 
    3 import javax.xml.bind.JAXBElement; 
    43import javax.xml.bind.JAXBException; 
    5 import javax.xml.bind.Unmarshaller; 
    64 
    75import org.apache.log4j.Logger; 
     
    108import org.docx4j.dml.CTPoint2D; 
    119import org.docx4j.dml.CTPositiveSize2D; 
    12 import org.docx4j.dml.CTTransform2D; 
    13 import org.docx4j.dml.picture.Pic; 
    14 import org.docx4j.dml.wordprocessingDrawing.Anchor; 
    15 import org.docx4j.dml.wordprocessingDrawing.Inline; 
    16 import org.docx4j.jaxb.Context; 
    1710import org.docx4j.model.images.AbstractWordXmlPicture; 
    18 import org.docx4j.model.images.WordXmlPictureE20; 
    19 import org.docx4j.model.images.AbstractWordXmlPicture.Dimensions; 
     11import org.docx4j.model.images.ConversionImageHandler; 
    2012import org.docx4j.openpackaging.packages.PresentationMLPackage; 
    21 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
    2213import org.docx4j.openpackaging.parts.Part; 
    23 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 
    24 import org.docx4j.relationships.Relationship; 
    25 import org.pptx4j.Box; 
    2614import org.pptx4j.model.ResolvedLayout; 
    2715import org.w3c.dom.DocumentFragment; 
     
    7563                PresentationMLPackage pmlPackage, 
    7664                ResolvedLayout rl,               
    77                 String imageDirPath, 
     65                ConversionImageHandler imageHandler, 
    7866                NodeIterator wpInline) { 
    7967 
    8068        PictureExporter converter = createPicture( pmlPackage, 
    81                          imageDirPath, wpInline, rl ); 
     69                         imageHandler, wpInline, rl ); 
    8270         
    8371        DocumentFragment df = getHtmlDocumentFragment(converter); 
     
    132120         
    133121    public static PictureExporter createPicture(PresentationMLPackage pmlPackage, 
    134                 String imageDirPath, 
     122                ConversionImageHandler imageHandler, 
    135123                NodeIterator anchorOrInline, 
    136124                ResolvedLayout rl) { 
     
    160148        String imgRelId = blip.getEmbed();       
    161149        if (imgRelId!=null) { 
    162                 converter.handleImageRel(imgRelId, imageDirPath, (Part)rl.relationships.getSourceP()); 
     150                converter.handleImageRel(imageHandler, imgRelId, (Part)rl.relationships.getSourceP()); 
    163151        } else if (blip.getLink()!=null) { 
    164                 converter.handleImageRel(blip.getLink(), imageDirPath, (Part)rl.relationships.getSourceP()); 
     152                converter.handleImageRel(imageHandler, blip.getLink(), (Part)rl.relationships.getSourceP()); 
    165153        } else { 
    166154                log.error("not linked or embedded?!"); 
     
    172160         
    173161                return converter; 
    174         } 
    175  
    176         private void handleImageRel(String imgRelId, String imageDirPath, Part sourcePart) { 
    177                  
    178                 setID(imgRelId);                 
    179                 Relationship rel = sourcePart.getRelationshipsPart().getRelationshipByID(imgRelId); 
    180                  
    181                 if (rel.getTargetMode() == null 
    182                                 || rel.getTargetMode().equals("Internal")) { 
    183          
    184                         Part p = (BinaryPartAbstractImage)sourcePart 
    185                                                 .getRelationshipsPart().getPart(rel); 
    186                          
    187                         BinaryPartAbstractImage part = null; 
    188                         if (p instanceof BinaryPartAbstractImage) { 
    189                                 part= (BinaryPartAbstractImage)sourcePart 
    190                                                 .getRelationshipsPart().getPart(rel); 
    191                         } else { 
    192                                 // Could be a MetafileEmfPart or WMF 
    193                                 log.error("TODO: Add support for " + p.getClass().getName() ); 
    194                                         // TODO 
    195                         } 
    196                         String uri = handlePart(imageDirPath, this, part); 
    197                         // Scale it?  Shouldn't be necessary, since Word should 
    198                         // be providing the height/width 
    199          
    200                 } else { // External 
    201                         this.setSrc(rel.getTarget()); 
    202                 }        
    203162        } 
    204163 
  • trunk/docx4j/src/pptx4j/java/org/pptx4j/convert/out/svginhtml/SvgExporter.java

    r1374 r1631  
    1717import org.apache.log4j.Logger; 
    1818import org.docx4j.XmlUtils; 
     19import org.docx4j.convert.out.AbstractConversionSettings; 
    1920import org.docx4j.convert.out.html.AbstractHtmlExporter; 
    2021import org.docx4j.convert.out.html.AbstractHtmlExporter.HtmlSettings; 
     
    2223import org.docx4j.dml.CTTextParagraphProperties; 
    2324import org.docx4j.dml.CTTransform2D; 
     25import org.docx4j.model.images.DefaultConversionImageHandler; 
    2426import org.docx4j.model.styles.StyleTree; 
    2527import org.docx4j.model.styles.Tree; 
     
    5355public class SvgExporter { 
    5456         
     57        public static class SvgSettings extends AbstractConversionSettings { 
     58                 
     59        } 
     60         
    5561        // NB: file suffix must end with .xhtml in order to see the SVG in a browser 
    5662         
     
    9096        public static String svg(PresentationMLPackage presentationMLPackage, 
    9197                        SlidePart slide) throws Exception { 
     98                return svg(presentationMLPackage, slide, null); 
     99        } 
     100         
     101        /** 
     102         * Create an HTML (with SVG) page representing the slide. 
     103         * @param presentationMLPackage 
     104         * @param slide 
     105         * @param settings 
     106         * @return 
     107         * @throws Exception 
     108         */ 
     109        public static String svg(PresentationMLPackage presentationMLPackage, 
     110                        SlidePart slide, SvgSettings settings) throws Exception { 
    92111                 
    93112        ResolvedLayout rl = ((SlidePart)slide).getResolvedLayout();      
     
    96115//              "http://schemas.openxmlformats.org/presentationml/2006/main", "spTree", GroupShape.class) ); 
    97116         
    98         return SvgExporter.svg(presentationMLPackage, rl); 
     117        return SvgExporter.svg(presentationMLPackage, rl, settings); 
    99118        } 
    100119         
     
    106125         */ 
    107126        private static String svg(PresentationMLPackage presentationMLPackage, 
    108                         ResolvedLayout layout) throws Exception { 
     127                        ResolvedLayout layout, SvgSettings settings) throws Exception { 
    109128         
    110129                ByteArrayOutputStream intermediate = new ByteArrayOutputStream(); 
    111130                Result intermediateResult =  new StreamResult( intermediate ); 
    112131                         
    113                 svg(presentationMLPackage, layout, intermediateResult); 
     132                svg(presentationMLPackage, layout, intermediateResult, settings); 
    114133                         
    115134                return intermediate.toString("UTF-8"); 
     
    119138         
    120139        private static void svg(PresentationMLPackage presentationMLPackage, 
    121                         ResolvedLayout layout, javax.xml.transform.Result result 
    122                         ) throws Exception { 
     140                        ResolvedLayout layout, javax.xml.transform.Result result, 
     141                        SvgSettings settings) throws Exception { 
    123142                         
    124143                org.w3c.dom.Document doc = XmlUtils.marshaltoW3CDomDocument( 
     
    127146                                "http://schemas.openxmlformats.org/presentationml/2006/main", "spTree", GroupShape.class);       
    128147 
    129         HtmlSettings htmlSettings = new HtmlSettings(); 
    130                 htmlSettings.setWmlPackage(presentationMLPackage); 
    131                 htmlSettings.getSettings().put("resolvedLayout", layout); 
    132         htmlSettings.getSettings().put("imageDirPath", imageDirPath); 
    133                  
    134                 org.docx4j.XmlUtils.transform(doc, xslt, htmlSettings.getSettings(), result); 
     148                if (settings == null) { 
     149                        settings = new SvgSettings(); 
     150                } 
     151                settings.setWmlPackage(presentationMLPackage); 
     152                settings.getSettings().put("resolvedLayout", layout); 
     153                if ((settings.getImageDirPath() == null) && (imageDirPath != null)) { 
     154                        settings.setImageDirPath(imageDirPath); 
     155                } 
     156                boolean privateImageHandler = false; 
     157                if (settings.getImageHandler() == null) { 
     158                        settings.setImageHandler(settings.getImageDirPath() != null ?  
     159                                        new DefaultConversionImageHandler(settings.getImageDirPath()) :  
     160                                        new DefaultConversionImageHandler()); 
     161                        privateImageHandler = true; 
     162                } 
     163                org.docx4j.XmlUtils.transform(doc, xslt, settings.getSettings(), result); 
     164                if (privateImageHandler) { 
     165                        //remove a locally created imageHandler in case the SvgSettings get reused 
     166                        settings.getSettings().remove(HtmlSettings.IMAGE_HANDLER); 
     167                } 
    135168        } 
    136169 
  • trunk/docx4j/src/pptx4j/java/org/pptx4j/convert/out/svginhtml/pptx2svginhtml.xslt

    r1180 r1631  
    6464        <xsl:param name="wmlPackage"/> <!--  really, its pml --> 
    6565        <xsl:param name="resolvedLayout"/> 
    66         <xsl:param name="imageDirPath"/> 
     66        <xsl:param name="imageHandler"/> 
    6767         
    6868 
     
    198198        <xsl:copy-of select="java:org.pptx4j.convert.out.svginhtml.PictureExporter.createHtmlImg(  
    199199                        $wmlPackage, $resolvedLayout, 
    200                         string($imageDirPath), 
     200                        $imageHandler, 
    201201                        .)" /> 
    202202     
Note: See TracChangeset for help on using the changeset viewer.