Page 1 of 1

Styling sdtPr

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

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

Code: Select all
         <w:rStyle w:val="input-light" />
      <w:id w:val="200003" />
      <w:lock w:val="sdtLocked" />
         <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:p w:rsidR="004537C3" w:rsidRDefault="006E7A6A">
               <w:rStyle w:val="input-light" />
               <w:rStyle w:val="input-light" />

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();
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.TraversalUtil$CallbackImpl.walkJAXBElements(

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 ... 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.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();
// Works fine
//              mdp.getContent().add(createIt());
//              mdp.getStylesInUse();
// Works fine          
//              String filename = System.getProperty("user.dir") + "/OUT_SdtList.docx";
//     );

        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();
                        // 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();
                                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();
                                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();
                        // Create object for rPr
                        RPr rpr2 = wmlObjectFactory.createRPr();
                        sdtendpr.getRPr().add( rpr2);
                            // Create object for lang
                            CTLanguage language = wmlObjectFactory.createCTLanguage();
                                language.setVal( "en-AU");
                            // Create object for rStyle
                            RStyle rstyle2 = wmlObjectFactory.createRStyle();
                                rstyle2.setVal( "DefaultParagraphFont");
                            // Create object for bCs
                            BooleanDefaultTrue booleandefaulttrue2 = wmlObjectFactory.createBooleanDefaultTrue();
                            // Create object for i
                            BooleanDefaultTrue booleandefaulttrue3 = wmlObjectFactory.createBooleanDefaultTrue();
                            // Create object for iCs
                            BooleanDefaultTrue booleandefaulttrue4 = wmlObjectFactory.createBooleanDefaultTrue();
                            // Create object for color
                            Color color = wmlObjectFactory.createColor();
                                color.setVal( "auto");
                            // Create object for b
                            BooleanDefaultTrue booleandefaulttrue5 = wmlObjectFactory.createBooleanDefaultTrue();
                    // Create object for sdtContent
                    SdtContentBlock sdtcontentblock = wmlObjectFactory.createSdtContentBlock();
                        // Create object for p
                        P p = wmlObjectFactory.createP();
                        sdtcontentblock.getContent().add( p);
                            // Create object for pPr
                            PPr ppr = wmlObjectFactory.createPPr();
                                // Create object for rPr
                                ParaRPr pararpr = wmlObjectFactory.createParaRPr();
                                    // Create object for lang
                                    CTLanguage language2 = wmlObjectFactory.createCTLanguage();
                                        language2.setVal( "en-AU");
                            // Create object for r
                            R r = wmlObjectFactory.createR();
                            p.getContent().add( r);
                                // Create object for rPr
                                RPr rpr3 = wmlObjectFactory.createRPr();
                                    // Create object for rStyle
                                    RStyle rstyle3 = wmlObjectFactory.createRStyle();
                                        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.032 seconds, using GeSHi

Re: Styling sdtPr

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