Page 1 of 1

Styling sdtPr

PostPosted: Sat Mar 29, 2014 1:54 am
by claveault
Hello,

I'm trying to get this kind of xml part using docx4j (extract from a word 2007-generated docx):

Code: Select all
<w:sdt>
   <w:sdtPr>
      <w:rPr>
         <w:rStyle w:val="input-light" />
      </w:rPr>
      <w:id w:val="200003" />
      <w:lock w:val="sdtLocked" />
      <w:dropDownList>
         <w:listItem w:displayText="Non/applicable" w:value="-1" />
         <w:listItem w:displayText="Yes" w:value="2" />
         <w:listItem w:displayText="No" w:value="3" />
      </w:dropDownList>
   </w:sdtPr>
   <w:sdtContent>
      <w:p w:rsidR="004537C3" w:rsidRDefault="006E7A6A">
         <w:pPr>
            <w:rPr>
               <w:rStyle w:val="input-light" />
            </w:rPr>
         </w:pPr>
         <w:r>
            <w:rPr>
               <w:rStyle w:val="input-light" />
            </w:rPr>
            <w:t>Non/applicable</w:t>
         </w:r>
      </w:p>
   </w:sdtContent>
</w:sdt>


It all turns out fine, except for the "dropDownList" styling (first <w:rStyle w:val="input-light" /> ). I've tried several methods, including both codes proposed on the doc4j webapp, to create my rPr object and add it to the sdtPr. Example from the webapp :

Code: Select all
SdtPr sdtpr = wmlObjectFactory.createSdtPr();
// Create object for rPr (wrapped in JAXBElement)
RPr rpr = wmlObjectFactory.createRPr();
JAXBElement<org.docx4j.wml.RPr> rprWrapped = wmlObjectFactory.createSdtPrRPr(rpr);
sdtpr.getRPrOrAliasOrLock().add( rprWrapped);
// Create object for rStyle
RStyle rstyle = wmlObjectFactory.createRStyle();
rpr.setRStyle(rstyle);
rstyle.setVal( "input-light");


But, whatever thr method, when trying to add my sdt object to my MainDocumentPart, I get a java.lang.NullPointerException :

Code: Select all
at org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart$FontAndStyleFinder.apply(MainDocumentPart.java:553)
at org.docx4j.TraversalUtil$CallbackImpl.walkJAXBElements(TraversalUtil.java:163)
at org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart.addObject(MainDocumentPart.java:702)


If I leave the dropdownList unstyled, it all works fine and my document it created normally.

I might have missed something, since this really doesn't seem to be an expected behavior to me.
Thanks in advance for any ideas on the subject !

Re: Styling sdtPr

PostPosted: Sat Mar 29, 2014 9:30 am
by jason
Hi, Thanks for the report

Issue replicated by code below, and fixed by change at line 707 in https://github.com/plutext/docx4j/commi ... 020434fe9a

Nightly build will follow later today.


Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
import java.math.BigInteger;

import javax.xml.bind.JAXBElement;

import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.BooleanDefaultTrue;
import org.docx4j.wml.CTLanguage;
import org.docx4j.wml.CTPlaceholder;
import org.docx4j.wml.CTSdtDropDownList;
import org.docx4j.wml.CTSdtEndPr;
import org.docx4j.wml.CTSdtListItem;
import org.docx4j.wml.Color;
import org.docx4j.wml.Id;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.ParaRPr;
import org.docx4j.wml.R;
import org.docx4j.wml.RPr;
import org.docx4j.wml.RStyle;
import org.docx4j.wml.SdtBlock;
import org.docx4j.wml.SdtContentBlock;
import org.docx4j.wml.SdtPr;
import org.docx4j.wml.Text;



public class Clav {

        /**
         * @param args
         * @throws Docx4JException
         */

        public static void main(String[] args) throws Docx4JException {
               
                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
                MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
               
                mdp.addObject(createIt());
               
// Works fine
//              mdp.getContent().add(createIt());
//              mdp.getStylesInUse();
               
// Works fine          
//              String filename = System.getProperty("user.dir") + "/OUT_SdtList.docx";
//              wordMLPackage.save(new java.io.File(filename) );
               
        }

        public static SdtBlock createIt() {

                org.docx4j.wml.ObjectFactory wmlObjectFactory = new org.docx4j.wml.ObjectFactory();

                SdtBlock sdtblock = wmlObjectFactory.createSdtBlock();
                    // Create object for sdtPr
                    SdtPr sdtpr = wmlObjectFactory.createSdtPr();
                    sdtblock.setSdtPr(sdtpr);
                        // Create object for rPr (wrapped in JAXBElement)
                        RPr rpr = wmlObjectFactory.createRPr();
                        JAXBElement<org.docx4j.wml.RPr> rprWrapped = wmlObjectFactory.createSdtPrRPr(rpr);
                        sdtpr.getRPrOrAliasOrLock().add( rprWrapped);
                            // Create object for rStyle
                            RStyle rstyle = wmlObjectFactory.createRStyle();
                            rpr.setRStyle(rstyle);
                                rstyle.setVal( "IntenseEmphasis");
                        // Create object for id
                        Id id = wmlObjectFactory.createId();
                        sdtpr.getRPrOrAliasOrLock().add( id);
                            id.setVal( BigInteger.valueOf( -997491543) );
                        // Create object for placeholder (wrapped in JAXBElement)
                        CTPlaceholder placeholder = wmlObjectFactory.createCTPlaceholder();
                        JAXBElement<org.docx4j.wml.CTPlaceholder> placeholderWrapped = wmlObjectFactory.createSdtPrPlaceholder(placeholder);
                        sdtpr.getRPrOrAliasOrLock().add( placeholderWrapped);
                            // Create object for docPart
                            CTPlaceholder.DocPart placeholderdocpart = wmlObjectFactory.createCTPlaceholderDocPart();
                            placeholder.setDocPart(placeholderdocpart);
                                placeholderdocpart.setVal( "DefaultPlaceholder_1082065159");
                        // Create object for showingPlcHdr (wrapped in JAXBElement)
                        BooleanDefaultTrue booleandefaulttrue = wmlObjectFactory.createBooleanDefaultTrue();
                        JAXBElement<org.docx4j.wml.BooleanDefaultTrue> booleandefaulttrueWrapped = wmlObjectFactory.createSdtPrShowingPlcHdr(booleandefaulttrue);
                        sdtpr.getRPrOrAliasOrLock().add( booleandefaulttrueWrapped);
                        // Create object for dropDownList (wrapped in JAXBElement)
                        CTSdtDropDownList sdtdropdownlist = wmlObjectFactory.createCTSdtDropDownList();
                        JAXBElement<org.docx4j.wml.CTSdtDropDownList> sdtdropdownlistWrapped = wmlObjectFactory.createSdtPrDropDownList(sdtdropdownlist);
                        sdtpr.getRPrOrAliasOrLock().add( sdtdropdownlistWrapped);
                            // Create object for listItem
                            CTSdtListItem sdtlistitem = wmlObjectFactory.createCTSdtListItem();
                            sdtdropdownlist.getListItem().add( sdtlistitem);
                                sdtlistitem.setValue( "Choose an item.");
                            // Create object for listItem
                            CTSdtListItem sdtlistitem2 = wmlObjectFactory.createCTSdtListItem();
                            sdtdropdownlist.getListItem().add( sdtlistitem2);
                                sdtlistitem2.setDisplayText( "yes");
                                sdtlistitem2.setValue( "yes");
                            // Create object for listItem
                            CTSdtListItem sdtlistitem3 = wmlObjectFactory.createCTSdtListItem();
                            sdtdropdownlist.getListItem().add( sdtlistitem3);
                                sdtlistitem3.setDisplayText( "no");
                                sdtlistitem3.setValue( "no");
                            // Create object for listItem
                            CTSdtListItem sdtlistitem4 = wmlObjectFactory.createCTSdtListItem();
                            sdtdropdownlist.getListItem().add( sdtlistitem4);
                                sdtlistitem4.setDisplayText( "na");
                                sdtlistitem4.setValue( "na");
// Already done above; Generated code is attempting to do it again                             
//                      // Create object for id
//                      Id id2 = wmlObjectFactory.createId();
//                      sdtpr.setId(id2);
//                          id2.setVal( BigInteger.valueOf( -997491543) );
                    // Create object for sdtEndPr
                    CTSdtEndPr sdtendpr = wmlObjectFactory.createCTSdtEndPr();
                    sdtblock.setSdtEndPr(sdtendpr);
                        // Create object for rPr
                        RPr rpr2 = wmlObjectFactory.createRPr();
                        sdtendpr.getRPr().add( rpr2);
                            // Create object for lang
                            CTLanguage language = wmlObjectFactory.createCTLanguage();
                            rpr2.setLang(language);
                                language.setVal( "en-AU");
                            // Create object for rStyle
                            RStyle rstyle2 = wmlObjectFactory.createRStyle();
                            rpr2.setRStyle(rstyle2);
                                rstyle2.setVal( "DefaultParagraphFont");
                            // Create object for bCs
                            BooleanDefaultTrue booleandefaulttrue2 = wmlObjectFactory.createBooleanDefaultTrue();
                            rpr2.setBCs(booleandefaulttrue2);
                            // Create object for i
                            BooleanDefaultTrue booleandefaulttrue3 = wmlObjectFactory.createBooleanDefaultTrue();
                            rpr2.setI(booleandefaulttrue3);
                            // Create object for iCs
                            BooleanDefaultTrue booleandefaulttrue4 = wmlObjectFactory.createBooleanDefaultTrue();
                            rpr2.setICs(booleandefaulttrue4);
                            // Create object for color
                            Color color = wmlObjectFactory.createColor();
                            rpr2.setColor(color);
                                color.setVal( "auto");
                            // Create object for b
                            BooleanDefaultTrue booleandefaulttrue5 = wmlObjectFactory.createBooleanDefaultTrue();
                            rpr2.setB(booleandefaulttrue5);
                    // Create object for sdtContent
                    SdtContentBlock sdtcontentblock = wmlObjectFactory.createSdtContentBlock();
                    sdtblock.setSdtContent(sdtcontentblock);
                        // Create object for p
                        P p = wmlObjectFactory.createP();
                        sdtcontentblock.getContent().add( p);
                            // Create object for pPr
                            PPr ppr = wmlObjectFactory.createPPr();
                            p.setPPr(ppr);
                                // Create object for rPr
                                ParaRPr pararpr = wmlObjectFactory.createParaRPr();
                                ppr.setRPr(pararpr);
                                    // Create object for lang
                                    CTLanguage language2 = wmlObjectFactory.createCTLanguage();
                                    pararpr.setLang(language2);
                                        language2.setVal( "en-AU");
                            // Create object for r
                            R r = wmlObjectFactory.createR();
                            p.getContent().add( r);
                                // Create object for rPr
                                RPr rpr3 = wmlObjectFactory.createRPr();
                                r.setRPr(rpr3);
                                    // Create object for rStyle
                                    RStyle rstyle3 = wmlObjectFactory.createRStyle();
                                    rpr3.setRStyle(rstyle3);
                                        rstyle3.setVal( "PlaceholderText");
                                // Create object for t (wrapped in JAXBElement)
                                Text text = wmlObjectFactory.createText();
                                JAXBElement<org.docx4j.wml.Text> textWrapped = wmlObjectFactory.createRT(text);
                                r.getContent().add( textWrapped);
                                    text.setValue( "Choose an item.");

                return sdtblock;
                }
                }
 
Parsed in 0.031 seconds, using GeSHi 1.0.8.4

Re: Styling sdtPr

PostPosted: Mon Mar 31, 2014 7:44 pm
by claveault
Hi,
Thanks for the quick support. I works fine now !