Page 1 of 1

NPE when exporting my docx to PDF

PostPosted: Tue Jun 14, 2016 4:25 am
by murilo.beriam
Hello! Docx4J is just great and the Helper AddIn rocks! But I am facing a problem, which is difficult for me to debug. I have created a DOCX using the code generated by the Helper AddIn and it seems to work fine, but when I export it to PDF format using the code below, I receive a NullPointerException:

Code: Select all
Docx4J.toFO(foSettings, myStream, Docx4J.FLAG_EXPORT_PREFER_XSL);

The stacktrace is

Code: Select all
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.getCellPStyle(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.apply(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.walkJAXBElements(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.walkJAXBElements(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.walkJAXBElements(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix$StyleRenamer.walkJAXBElements(
   at org.docx4j.TraversalUtil.<init>(
   at org.docx4j.convert.out.common.preprocess.ParagraphStylesInTableFix.process(
   at org.docx4j.convert.out.common.Preprocess.process(
   at org.docx4j.convert.out.common.AbstractWmlExporter.preprocess(
   at org.docx4j.convert.out.common.AbstractWmlExporter.preprocess(
   at org.docx4j.convert.out.common.AbstractExporter.export(
   at org.docx4j.Docx4J.toFO(

I do not know what to include in my code to avoid this exception. It seems some style is missing.

The DOCX file I have used when running the AddIn is attached (Tabela.docx). The generated one by docx4j that does not export well is the generatedUsingDocx4j.docx.

If I try to export to PDF direct from the attached file, the generated PDF is OK. But, if I run the Add In based on that file, get the code, create a docx based on it and generate a PDF from it, then the NPE arises.

Here is the code I used to generate the docx and the PDF:
Code: Select all
public final ByteArrayOutputStream bindDocx(File templateWordFile, boolean returnAsPdf) throws Exception {

        ByteArrayOutputStream wordAsStream = new ByteArrayOutputStream();
        WordprocessingMLPackage output = null;
        try {
            WordprocessingMLPackage wordMLPackage = (WordprocessingMLPackage)OpcPackage.load(templateWordFile);
            List<Map<DataFieldName, String>> data = new ArrayList<Map<DataFieldName, String>>();
            output = org.docx4j.model.fields.merge.MailMerger.getConsolidatedResultCrude(wordMLPackage, data, true);
            output = this.bindComplexElementsToDocx(context, output);

            if(returnAsPdf) {
                Mapper fontMapper = new IdentityPlusMapper();
                FOSettings foSettings = Docx4J.createFOSettings();
                Docx4J.toFO(foSettings, wordAsStream , Docx4J.FLAG_EXPORT_PREFER_XSL);
                if (wordMLPackage.getMainDocumentPart().getFontTablePart()!=null) {
            } else {
            return wordAsStream;
        } catch (Exception e) {
            throw e;
        } finally {
            try {
            } catch (IOException e) {
                Logger.error("Fail to close stream", e);

    public WordprocessingMLPackage bindComplexElementsToDocx(JoinRHContext context, WordprocessingMLPackage output) throws JoinRHException {
        try {
            org.docx4j.wml.ObjectFactory wmlObjectFactory = new org.docx4j.wml.ObjectFactory();

                    // Create object for tbl (wrapped in JAXBElement)
                    Tbl tbl = wmlObjectFactory.createTbl();
                    JAXBElement<org.docx4j.wml.Tbl> tblWrapped = wmlObjectFactory.createBodyTbl(tbl);
                        // Create object for tr
                        Tr tr = wmlObjectFactory.createTr();
                        tbl.getContent().add( tr);
                            // Create object for tc (wrapped in JAXBElement)
                            Tc tc = wmlObjectFactory.createTc();
                            JAXBElement<org.docx4j.wml.Tc> tcWrapped = wmlObjectFactory.createTrTc(tc);
                            tr.getContent().add( tcWrapped);
                                // Create object for p
                                P p = wmlObjectFactory.createP();
                                tc.getContent().add( p);
                                    // Create object for pPr
                                    PPr ppr = wmlObjectFactory.createPPr();
                                        // Create object for rPr
                                        ParaRPr pararpr = wmlObjectFactory.createParaRPr();
                                            // Create object for b
                                            BooleanDefaultTrue booleandefaulttrue = wmlObjectFactory.createBooleanDefaultTrue();
                                            // Create object for color
                                            Color color = wmlObjectFactory.createColor();
                                                color.setVal( "B66B34");
                                        // Create object for jc
                                        Jc jc = wmlObjectFactory.createJc();
                                    // Create object for r
                                    R r = wmlObjectFactory.createR();
                                    p.getContent().add( r);
                                        // Create object for rPr
                                        RPr rpr = wmlObjectFactory.createRPr();
                                            // Create object for b
                                            BooleanDefaultTrue booleandefaulttrue2 = wmlObjectFactory.createBooleanDefaultTrue();
                                            // Create object for color
                                            Color color2 = wmlObjectFactory.createColor();
                                                color2.setVal( "B66B34");
                                        // 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( "Data");
                                // Create object for tcPr
                                TcPr tcpr = wmlObjectFactory.createTcPr();
                                    // Create object for tcW
                                    TblWidth tblwidth = wmlObjectFactory.createTblWidth();
                                        tblwidth.setW( BigInteger.valueOf( 1763) );
                                        tblwidth.setType( "dxa");

//TC2 until TC19 removed to shorten post

                            Tc tc20 = wmlObjectFactory.createTc();
                            JAXBElement<org.docx4j.wml.Tc> tcWrapped20 = wmlObjectFactory.createTrTc(tc20);
                            tr5.getContent().add( tcWrapped20);
                                // Create object for p
                                P p20 = wmlObjectFactory.createP();
                                tc20.getContent().add( p20);
                                    // Create object for pPr
                                    PPr ppr20 = wmlObjectFactory.createPPr();
                                        // Create object for jc
                                        Jc jc20 = wmlObjectFactory.createJc();
                                    // Create object for r
                                    R r20 = wmlObjectFactory.createR();
                                    p20.getContent().add( r20);
                                        // Create object for t (wrapped in JAXBElement)
                                        Text text20 = wmlObjectFactory.createText();
                                        JAXBElement<org.docx4j.wml.Text> textWrapped20 = wmlObjectFactory.createRT(text20);
                                        r20.getContent().add( textWrapped20);
                                            text20.setValue( "3,66");
                                // Create object for tcPr
                                TcPr tcpr20 = wmlObjectFactory.createTcPr();
                                    // Create object for tcW
                                    TblWidth tblwidth20 = wmlObjectFactory.createTblWidth();
                                        tblwidth20.setW( BigInteger.valueOf( 1764) );
                                        tblwidth20.setType( "dxa");
                                    // Create object for shd
                                    CTShd shd12 = wmlObjectFactory.createCTShd();
                                        shd12.setFill( "auto");
                                        shd12.setColor( "auto");
                        // Create object for tblPr
                        TblPr tblpr = wmlObjectFactory.createTblPr();
                            // Create object for tblLook
                            CTTblLook tbllook = wmlObjectFactory.createCTTblLook();
                                tbllook.setVal( "04A0");
                            // Create object for tblStyle
                            CTTblPrBase.TblStyle tblprbasetblstyle = wmlObjectFactory.createCTTblPrBaseTblStyle();
                                tblprbasetblstyle.setVal( "Tabelacomgrade");
                            // Create object for tblW
                            TblWidth tblwidth21 = wmlObjectFactory.createTblWidth();
                                tblwidth21.setW( BigInteger.valueOf( 0) );
                                tblwidth21.setType( "auto");
                        // Create object for tblGrid
                        TblGrid tblgrid = wmlObjectFactory.createTblGrid();
                            // Create object for gridCol
                            TblGridCol tblgridcol = wmlObjectFactory.createTblGridCol();
                            tblgrid.getGridCol().add( tblgridcol);
                                tblgridcol.setW( BigInteger.valueOf( 1763) );
                            // Create object for gridCol
                            TblGridCol tblgridcol2 = wmlObjectFactory.createTblGridCol();
                            tblgrid.getGridCol().add( tblgridcol2);
                                tblgridcol2.setW( BigInteger.valueOf( 1764) );
                            // Create object for gridCol
                            TblGridCol tblgridcol3 = wmlObjectFactory.createTblGridCol();
                            tblgrid.getGridCol().add( tblgridcol3);
                                tblgridcol3.setW( BigInteger.valueOf( 1763) );
                            // Create object for gridCol
                            TblGridCol tblgridcol4 = wmlObjectFactory.createTblGridCol();
                            tblgrid.getGridCol().add( tblgridcol4);
                                tblgridcol4.setW( BigInteger.valueOf( 1764) );
                                List<Object> paragraphs = this.getAllElementFromObject(output.getMainDocumentPart(), P.class);
                                boolean found = false;
                                for (int i=0; !found && i<paragraphs.size(); i++) {
                                    Object parag = paragraphs.get(i);
                                    List<Object> textos = this.getAllElementFromObject(parag, Text.class);
                                    for (Object content : textos) {
                                        if (content instanceof Text && ((Text)content).getValue().contains("placeholder")) {
                                            found = true;
                                            output.getMainDocumentPart().getContent().set(i, tblWrapped);
                                return output;
        } catch (Exception e) {
            Logger.error("Fail to bind placeholder", e);
            throw e;

I did not included the section the AddIn suggested. Is it a problem?

If you need any detail, please, let me know. Thanks in advance!

Re: NPE when exporting my docx to PDF

PostPosted: Fri Jun 17, 2016 4:34 pm
by jason
Running your docx I get:

Code: Select all
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
   at java.util.ArrayList.RangeCheck(
   at java.util.ArrayList.get(
   at org.docx4j.model.fields.FieldRef.getFldName(

That would be because you have:

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
        <w:fldChar w:fldCharType="begin"/>
        <w:instrText xml:space="preserve"></w:instrText>
        <w:fldChar w:fldCharType="separate"/>
        <w:t>MERGEFIELD  Forma_Reajuste</w:t>
        <w:fldChar w:fldCharType="end"/>
Parsed in 0.001 seconds, using GeSHi

ie empty field begin.

So commenting out (in my code):

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
                //FieldUpdater updater = new FieldUpdater(wordMLPackage);
Parsed in 0.014 seconds, using GeSHi

I see the same issue you report. The problem is that style 'Tabelacomgrade' is not defined in your docx. ... 3f53c7db9e now guards against that.

Re: NPE when exporting my docx to PDF

PostPosted: Thu Jun 30, 2016 3:05 am
by murilo.beriam
Thanks for the feedback!!!