Ignore:
Timestamp:
09/20/11 12:34:05 (8 months ago)
Author:
jharrop
Message:

Albert Aymerich's patch to load content (docx and xml) from inputstreams.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/packages/OpcPackage.java

    r1467 r1667  
    2222package org.docx4j.openpackaging.packages; 
    2323 
     24import java.io.BufferedInputStream; 
    2425import java.io.FileInputStream; 
    2526import java.io.FileNotFoundException; 
    2627import java.io.FileOutputStream; 
     28import java.io.IOException; 
     29import java.io.InputStream; 
    2730import java.util.HashMap; 
    2831 
     
    166169         *            The docx file  
    167170         */      
    168         public static OpcPackage load(java.io.File docxFile) throws Docx4JException { 
    169                  
    170                 if (docxFile.getName().endsWith(".xml")) { 
    171                          
    172                         org.docx4j.convert.in.FlatOpcXmlImporter xmlPackage; 
    173                         try { 
    174                                 Unmarshaller u = Context.jcXmlPackage.createUnmarshaller(); 
    175                                 u.setEventHandler(new org.docx4j.jaxb.JaxbValidationEventHandler()); 
    176  
    177                                 org.docx4j.xmlPackage.Package wmlPackageEl = (org.docx4j.xmlPackage.Package)((JAXBElement)u.unmarshal( 
    178                                                 new javax.xml.transform.stream.StreamSource(new FileInputStream(docxFile.getAbsolutePath())))).getValue();  
    179  
    180                                 xmlPackage = new org.docx4j.convert.in.FlatOpcXmlImporter( wmlPackageEl); 
    181                         } catch (Exception e) { 
    182                                 log.error(e); 
    183                                 throw new Docx4JException("Couldn't load xml from " + docxFile.getAbsolutePath(), e); 
    184                         }  
    185                         return xmlPackage.get();  
    186                 } 
    187                  
    188 //              LoadFromZipFile loader = new LoadFromZipFile(); 
    189                 LoadFromZipNG loader = new LoadFromZipNG(); 
    190 //              return (WordprocessingMLPackage)loader.get(docxFile);            
    191                 FileInputStream fis = null; 
    192                 try { 
    193                         fis = new FileInputStream(docxFile); 
    194                 } catch (FileNotFoundException e) { 
    195                         log.error(e); 
     171        public static OpcPackage load(final java.io.File docxFile) throws Docx4JException { 
     172                 
     173                try { 
     174                        if (docxFile.getName().endsWith(".xml")) { 
     175                                return OpcPackage.load(new FileInputStream(docxFile),false); 
     176                        } 
     177                        return OpcPackage.load(new FileInputStream(docxFile),true); 
     178                } catch (final FileNotFoundException e) { 
     179                        OpcPackage.log.error(e); 
    196180                        throw new Docx4JException("Couldn't load file from " + docxFile.getAbsolutePath(), e); 
    197181                } 
    198                 return loader.get(fis); 
     182        } 
     183 
     184        /** 
     185         * Convenience method to create a WordprocessingMLPackage 
     186         * or PresentationMLPackage 
     187         * from an inputstream (.docx/.docxm, .ppxtx or Flat OPC .xml). 
     188         * It detects the convenient format inspecting two first bytes of stream (magic bytes).  
     189         * For office 2007 'x' formats, these two bytes are 'PK' (same as zip file)   
     190     * 
     191         * @param inputStream 
     192         *            The docx file  
     193         */      
     194        public static OpcPackage load(final InputStream inputStream) throws Docx4JException{ 
     195                //try to detect the type of file using a bufferedinputstream 
     196                final BufferedInputStream bis = new BufferedInputStream(inputStream); 
     197                bis.mark(0); 
     198                final byte[] firstTwobytes=new byte[2]; 
     199                int read=0; 
     200                try { 
     201                        read = bis.read(firstTwobytes); 
     202                        bis.reset(); 
     203                } catch (final IOException e) { 
     204                        throw new Docx4JException("Error reading from the stream", e); 
     205                } 
     206                if (read!=2){ 
     207                        throw new Docx4JException("Error reading from the stream (no bytes available)"); 
     208                } 
     209                final boolean docxType = (firstTwobytes[0]=='P' && firstTwobytes[1]=='K'); 
     210                return OpcPackage.load(bis,docxType); 
     211        } 
     212         
     213        /** 
     214         * convenience method to load a word2007 document  
     215         * from an existing inputstream (.docx/.docxm, .ppxtx or Flat OPC .xml). 
     216         *  
     217         * @param is 
     218         * @param docxFormat 
     219         * @return 
     220         * @throws Docx4JException 
     221         */ 
     222        public static OpcPackage load(final InputStream is, final boolean docxFormat) throws Docx4JException { 
     223                if (docxFormat){ 
     224                        final LoadFromZipNG loader = new LoadFromZipNG(); 
     225                        return loader.get(is); 
     226                } 
     227                org.docx4j.convert.in.FlatOpcXmlImporter xmlPackage; 
     228                try { 
     229                        final Unmarshaller u = Context.jcXmlPackage.createUnmarshaller(); 
     230                        u.setEventHandler(new org.docx4j.jaxb.JaxbValidationEventHandler()); 
     231 
     232                        final org.docx4j.xmlPackage.Package wmlPackageEl = (org.docx4j.xmlPackage.Package)((JAXBElement)u.unmarshal( 
     233                                        new javax.xml.transform.stream.StreamSource(is))).getValue();  
     234 
     235                        xmlPackage = new org.docx4j.convert.in.FlatOpcXmlImporter( wmlPackageEl); 
     236                } catch (final Exception e) { 
     237                        OpcPackage.log.error(e); 
     238                        throw new Docx4JException("Couldn't load xml from stream ",e); 
     239                }  
     240                return xmlPackage.get();  
    199241        } 
    200242 
Note: See TracChangeset for help on using the changeset viewer.