Changeset 1716 for trunk/docx4j/src/main


Ignore:
Timestamp:
11/18/11 05:43:44 (6 months ago)
Author:
jharrop
Message:

XHTML import: basic import of images

Location:
trunk/docx4j/src/main/java/org/docx4j
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/convert/in/css/Importer.java

    r1715 r1716  
    1313import org.apache.log4j.Logger; 
    1414import org.docx4j.XmlUtils; 
     15import org.docx4j.dml.wordprocessingDrawing.Inline; 
    1516import org.docx4j.jaxb.Context; 
    1617import org.docx4j.model.properties.Property; 
     
    1920import org.docx4j.model.properties.run.AbstractRunProperty; 
    2021import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     22import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 
    2123import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart; 
    2224import org.docx4j.openpackaging.parts.relationships.Namespaces; 
     
    2729import org.docx4j.org.xhtmlrenderer.css.style.DerivedValue; 
    2830import org.docx4j.org.xhtmlrenderer.css.style.FSDerivedValue; 
     31import org.docx4j.org.xhtmlrenderer.docx.Docx4JFSImage; 
     32import org.docx4j.org.xhtmlrenderer.docx.Docx4jUserAgent; 
    2933import org.docx4j.org.xhtmlrenderer.docx.DocxRenderer; 
    3034import org.docx4j.org.xhtmlrenderer.layout.Styleable; 
     
    3337import org.docx4j.org.xhtmlrenderer.render.Box; 
    3438import org.docx4j.org.xhtmlrenderer.render.InlineBox; 
    35 import org.docx4j.relationships.Relationships; 
    3639import org.docx4j.wml.Numbering; 
    3740import org.docx4j.wml.P; 
     41import org.docx4j.wml.P.Hyperlink; 
    3842import org.docx4j.wml.PPr; 
     43import org.docx4j.wml.PPrBase.NumPr; 
     44import org.docx4j.wml.PPrBase.NumPr.Ilvl; 
     45import org.docx4j.wml.PPrBase.NumPr.NumId; 
    3946import org.docx4j.wml.R; 
    4047import org.docx4j.wml.RPr; 
    4148import org.docx4j.wml.Text; 
    42 import org.docx4j.wml.P.Hyperlink; 
    43 import org.docx4j.wml.PPrBase.NumPr; 
    44 import org.docx4j.wml.PPrBase.NumPr.Ilvl; 
    45 import org.docx4j.wml.PPrBase.NumPr.NumId; 
    4649import org.w3c.dom.Element; 
    4750import org.w3c.dom.css.CSSValue; 
     
    7376    private P currentP; 
    7477     
     78    private WordprocessingMLPackage wordMLPackage; 
    7579    private RelationshipsPart rp; 
    7680    private NumberingDefinitionsPart ndp; 
     
    7882    private ListHelper listHelper; 
    7983     
    80     private Importer(RelationshipsPart rp, NumberingDefinitionsPart ndp) { 
    81         this.rp  = rp;           
    82         this.ndp = ndp;          
     84    private DocxRenderer renderer; 
     85     
     86    private Importer(WordprocessingMLPackage wordMLPackage) { 
     87        this.wordMLPackage= wordMLPackage; 
     88        rp = wordMLPackage.getMainDocumentPart().getRelationshipsPart(); 
     89        ndp = wordMLPackage.getMainDocumentPart().getNumberingDefinitionsPart(); 
     90         
    8391        listHelper = new ListHelper(); 
    8492    } 
    8593 
    86     public static List<Object> convert(File file, RelationshipsPart rp, NumberingDefinitionsPart ndp) throws IOException { 
    87  
    88         DocxRenderer renderer = new DocxRenderer(); 
    89         renderer.setDocument(file); 
    90         renderer.layout(); 
     94    public static List<Object> convert(File file, WordprocessingMLPackage wordMLPackage) throws IOException { 
     95 
     96        Importer importer = new Importer(wordMLPackage); 
     97 
     98        importer.renderer = new DocxRenderer(); 
     99        importer.renderer.setDocument(file); 
     100        importer.renderer.layout(); 
    91101                     
    92         Importer importer = new Importer(rp, ndp); 
    93         importer.traverse(renderer.getRootBox(), ""); 
     102        importer.traverse(importer.renderer.getRootBox(), ""); 
    94103         
    95104        return importer.imports;         
    96105    } 
    97106     
    98     public static List<Object> convert(String uri, RelationshipsPart rp, NumberingDefinitionsPart ndp) { 
    99          
    100         DocxRenderer renderer = new DocxRenderer(); 
    101         renderer.setDocument(uri); 
    102         renderer.layout(); 
     107    public static List<Object> convert(String uri, WordprocessingMLPackage wordMLPackage) { 
     108 
     109        Importer importer = new Importer(wordMLPackage); 
     110         
     111        importer.renderer = new DocxRenderer(); 
     112        importer.renderer.setDocument(uri); 
     113        importer.renderer.layout(); 
    103114                     
    104         Importer importer = new Importer(rp, ndp); 
    105         importer.traverse(renderer.getRootBox(), ""); 
     115        importer.traverse(importer.renderer.getRootBox(), ""); 
    106116         
    107117        return importer.imports;         
    108118    } 
    109119 
    110     public static List<Object> convertFromString(String content, RelationshipsPart rp, NumberingDefinitionsPart ndp) { 
    111          
    112         DocxRenderer renderer = new DocxRenderer(); 
    113         renderer.setDocumentFromString(content); 
    114         renderer.layout(); 
     120    public static List<Object> convertFromString(String content, WordprocessingMLPackage wordMLPackage, String baseUrl) { 
     121         
     122        Importer importer = new Importer(wordMLPackage); 
     123 
     124        importer.renderer = new DocxRenderer(); 
     125        importer.renderer.setDocumentFromString(content, baseUrl); 
     126        importer.renderer.layout(); 
    115127                     
    116         Importer importer = new Importer(rp, ndp); 
    117         importer.traverse(renderer.getRootBox(), ""); 
     128        importer.traverse(importer.renderer.getRootBox(), ""); 
    118129         
    119130        return importer.imports;         
     
    160171    private void traverse(Box box, String indents) { 
    161172         
    162         //log.info(box.getClass().getName() ); 
     173        log.info(box.getClass().getName() ); 
    163174        if (box instanceof BlockBox) { 
    164175            BlockBox blockBox = ((BlockBox)box); 
     
    209220                             
    210221                            if (e.getNodeName().equals("li")) { 
    211                                  
    212                                  
    213                                 Numbering.Num num = null; 
    214                                 try { 
    215                                         if ( cssMap.get("list-style-type" ).getCssText().equals("decimal")) { 
    216                                                 num = listHelper.getOrderedList(ndp); 
    217                                         } 
    218                                         if (cssMap.get("list-style-type" ).getCssText().equals("disc")) { 
    219                                                 num = listHelper.getUnorderedList(ndp); 
    220                                         } 
    221                                          
    222                                         // TODO: support other list-style-type 
    223                                          
    224                                         // TODO: generate list definitions based on CSS  
    225                                         // (and multiple list definitions) 
    226                                          
    227                                 } catch (JAXBException je) { 
    228                                         // Shouldn't happen 
    229                                         je.printStackTrace(); 
    230                                         log.error(e); 
    231                                 } 
    232  
    233                                 if (num==null) { 
    234                                         log.warn( "No support for list-style-type: "  
    235                                                         + cssMap.get("list-style-type" ).getCssText()   );  // eg decimal, disc 
    236                                          
    237                                 } else { 
    238  
    239                                             paraStillEmpty = false; 
    240                                              
    241                                             // Create and add <w:numPr> 
    242                                             NumPr numPr =  Context.getWmlObjectFactory().createPPrBaseNumPr(); 
    243                                             currentP.getPPr().setNumPr(numPr); 
    244          
    245                                             // The <w:numId> element 
    246                                             NumId numIdElement = Context.getWmlObjectFactory().createPPrBaseNumPrNumId(); 
    247                                             numPr.setNumId(numIdElement); 
    248                                             numIdElement.setVal( num.getNumId() ); // point to the correct list 
    249                                              
    250                                             // The <w:ilvl> element 
    251                                             Ilvl ilvlElement = Context.getWmlObjectFactory().createPPrBaseNumPrIlvl(); 
    252                                             numPr.setIlvl(ilvlElement); 
    253                                             ilvlElement.setVal(BigInteger.valueOf(0)); 
    254                                                  
    255                                             // TMP: don't let this override our numbering 
    256                                             currentP.getPPr().setInd(null); 
    257                                 } 
     222                                addNumbering(e, cssMap); 
     223                            } else if  (e.getNodeName().equals("img")) { 
     224                                        // TODO, should we be using ReplacedElementFactory approach instead?                             
     225                                addImage(e);                             
    258226                            } 
    259227                             
     
    294262    } 
    295263 
     264        private void addImage(Element e) { 
     265                System.out.println("Detected an image!!! " + e.getAttribute("src")); 
     266                 
     267                Docx4jUserAgent docx4jUserAgent = renderer.getDocx4jUserAgent(); 
     268                Docx4JFSImage docx4JFSImage = docx4jUserAgent.getDocx4JImageResource( e.getAttribute("src") ); 
     269                                 
     270                BinaryPartAbstractImage imagePart; 
     271                Inline inline = null; 
     272                try { 
     273                         
     274                        imagePart = BinaryPartAbstractImage.createImagePart( 
     275                                        wordMLPackage,  
     276                                        docx4JFSImage.getBytes()); 
     277                    inline = imagePart.createImageInline( null, null, 0, 1, false); 
     278                     
     279                } catch (Exception e1) { 
     280                        // TODO Auto-generated catch block 
     281                        e1.printStackTrace(); 
     282                }                                        
     283                 
     284                // Now add the inline in w:p/w:r/w:drawing 
     285                org.docx4j.wml.R  run = Context.getWmlObjectFactory().createR();                 
     286                currentP.getContent().add(run);         
     287                org.docx4j.wml.Drawing drawing = Context.getWmlObjectFactory().createDrawing();          
     288                run.getContent().add(drawing);           
     289                drawing.getAnchorOrInline().add(inline); 
     290                 
     291            paraStillEmpty = false; 
     292                 
     293        } 
     294 
     295        private void addNumbering(Element e, Map<String, CSSValue> cssMap) { 
     296                Numbering.Num num = null; 
     297                try { 
     298                        if ( cssMap.get("list-style-type" ).getCssText().equals("decimal")) { 
     299                                num = listHelper.getOrderedList(ndp); 
     300                        } 
     301                        if (cssMap.get("list-style-type" ).getCssText().equals("disc")) { 
     302                                num = listHelper.getUnorderedList(ndp); 
     303                        } 
     304                         
     305                        // TODO: support other list-style-type 
     306                         
     307                        // TODO: generate list definitions based on CSS  
     308                        // (and multiple list definitions) 
     309                         
     310                } catch (JAXBException je) { 
     311                        // Shouldn't happen 
     312                        je.printStackTrace(); 
     313                        log.error(e); 
     314                } 
     315 
     316                if (num==null) { 
     317                        log.warn( "No support for list-style-type: "  
     318                                        + cssMap.get("list-style-type" ).getCssText()   );  // eg decimal, disc 
     319                         
     320                } else { 
     321 
     322                    paraStillEmpty = false; 
     323                     
     324                    // Create and add <w:numPr> 
     325                    NumPr numPr =  Context.getWmlObjectFactory().createPPrBaseNumPr(); 
     326                    currentP.getPPr().setNumPr(numPr); 
     327 
     328                    // The <w:numId> element 
     329                    NumId numIdElement = Context.getWmlObjectFactory().createPPrBaseNumPrNumId(); 
     330                    numPr.setNumId(numIdElement); 
     331                    numIdElement.setVal( num.getNumId() ); // point to the correct list 
     332                     
     333                    // The <w:ilvl> element 
     334                    Ilvl ilvlElement = Context.getWmlObjectFactory().createPPrBaseNumPrIlvl(); 
     335                    numPr.setIlvl(ilvlElement); 
     336                    ilvlElement.setVal(BigInteger.valueOf(0)); 
     337                     
     338                    // TMP: don't let this override our numbering 
     339                    currentP.getPPr().setInd(null); 
     340                } 
     341        } 
     342 
    296343    private void processInlineBox( InlineBox inlineBox, String indents) { 
    297344 
     
    496543//      File f = new File(System.getProperty("user.dir") + "/input.html"); 
    497544//        File f = new File(System.getProperty("user.dir") + "/src/test/resources/xhtml/inheritance.html"); 
    498         File f = new File(System.getProperty("user.dir") + "/src/test/resources/xhtml/extjs-cleaned-omitDepr.xhtml"); 
     545        File f = new File(System.getProperty("user.dir") + "/src/test/resources/xhtml/img.xhtml"); 
    499546             
    500547                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); 
     
    505552                 
    506553                wordMLPackage.getMainDocumentPart().getContent().addAll(  
    507                                 convert(f, wordMLPackage.getMainDocumentPart().getRelationshipsPart(), ndp ) ); 
     554                                convert(f, wordMLPackage) ); 
    508555                 
    509556                System.out.println( 
  • trunk/docx4j/src/main/java/org/docx4j/model/datastorage/BindingHandler.java

    r1715 r1716  
    282282                                }                                
    283283                                 
    284                                 List<Object> results = Importer.convertFromString(unescaped, sourcePart.getRelationshipsPart(), ndp ); 
     284                                String baseUrl = null; 
     285                                List<Object> results = Importer.convertFromString(unescaped, pkg, baseUrl ); 
    285286                                log.info("Got results: " + results.size() ); 
    286287                                 
Note: See TracChangeset for help on using the changeset viewer.