0

My problem is that i can't get my textfields with document.getContent() and document.getContents(). So I tried to use XPath for selecting the objects, it works but i can't copy the object and add it again.

For example:

XPath Exception Comment
//wps:txbx/w:txbxContent javax.xml.bind.MarshalException SAXException2, Missing @XmlRootElement-Annotation
//wps:txbx/w:txbxContent/w:p/w:r javax.xml.transform.TransformerException unexpected Element, because it is on the wrong place

I also tried to make a own object but this also don't worked for me, because it wasn't accepted as an JAXB Object.

This is my code:

public static void main(final String[] args) throws Docx4JException, JAXBException
{
    final String filePath = "./files/GetTextfield.docx";
    
    final WordprocessingMLPackage word = Docx4J.load(new File(filePath));
    final MainDocumentPart document = word.getMainDocumentPart();
    
    final String xpathExpr = "//wps:txbx/w:txbxContent/w:p/w:r"; 
    final List<Object> nodes = document.getJAXBNodesViaXPath(xpathExpr, false);
    
    addPageBreak(document);
    
    final XmlUtils xmlUtils = new XmlUtils();
    final Object field = nodes.get(0);
    final Object copy = xmlUtils.deepCopy(field);
    
    document.addObject(copy);
    
    System.out.println(document.getXML());
    
    // TODO Before MailMerge need to copy template content to all pages
}

I recreated this question because the old one is getting kind of confusing, I guess.

My Document as XML (document.getXML())

<w:document mc:Ignorable="w14 w15 wp14" xmlns:cppr="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:dgm1611="http://schemas.microsoft.com/office/drawing/2016/11/diagram" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wp15="http://schemas.microsoft.com/office/word/2012/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a1611="http://schemas.microsoft.com/office/drawing/2016/11/main" xmlns:a16svg="http://schemas.microsoft.com/office/drawing/2016/SVG/main" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:dgm1612="http://schemas.microsoft.com/office/drawing/2016/12/diagram" xmlns:comp="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:xvml="urn:schemas-microsoft-com:office:excel" xmlns:c173="http://schemas.microsoft.com/office/drawing/2017/03/chart" xmlns:anam3d="http://schemas.microsoft.com/office/drawing/2018/animation/model3d" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:adec="http://schemas.microsoft.com/office/drawing/2017/decorative" xmlns:oda="http://opendope.org/answers" xmlns:a18hc="http://schemas.microsoft.com/office/drawing/2018/hyperlinkcolor" xmlns:odc="http://opendope.org/conditions" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:cdr="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:odi="http://opendope.org/components" xmlns:msink="http://schemas.microsoft.com/ink/2010/main" xmlns:cdr14="http://schemas.microsoft.com/office/drawing/2010/chartDrawing" xmlns:iact="http://schemas.microsoft.com/office/powerpoint/2014/inkAction" xmlns:an18="http://schemas.microsoft.com/office/drawing/2018/animation" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:odq="http://opendope.org/questions" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:odx="http://opendope.org/xpaths" xmlns:a15="http://schemas.microsoft.com/office/drawing/2012/main" xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" xmlns:c15="http://schemas.microsoft.com/office/drawing/2012/chart" xmlns:a13cmd="http://schemas.microsoft.com/office/drawing/2013/main/command" xmlns:c14="http://schemas.microsoft.com/office/drawing/2007/8/2/chart" xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:c16="http://schemas.microsoft.com/office/drawing/2014/chart" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:thm15="http://schemas.microsoft.com/office/thememl/2012/main" xmlns:we="http://schemas.microsoft.com/office/webextensions/webextension/2010/11" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:ns39="http://www.w3.org/2003/InkML" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:ns38="http://www.w3.org/1998/Math/MathML" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:dgm14="http://schemas.microsoft.com/office/drawing/2010/diagram" xmlns:c16ac="http://schemas.microsoft.com/office/drawing/2014/chart/ac" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:cs="http://schemas.microsoft.com/office/drawing/2012/chartStyle" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:pic14="http://schemas.microsoft.com/office/drawing/2010/picture" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:wetp="http://schemas.microsoft.com/office/webextensions/taskpanes/2010/11">
    <w:body>
        <w:p w:rsidRPr="009670CB" w:rsidR="00CF457B" w:rsidP="009670CB" w:rsidRDefault="00BD5B37">
            <w:bookmarkStart w:name="_GoBack" w:id="0"/>
            <w:bookmarkEnd w:id="0"/>
            <w:r>
                <w:rPr>
                    <w:noProof/>
                </w:rPr>
                <mc:AlternateContent>
                    <mc:Choice Requires="wps">
                        <w:drawing>
                            <wp:anchor distT="45720" distB="45720" distL="114300" distR="114300" simplePos="false" relativeHeight="251659264" behindDoc="false" locked="false" layoutInCell="true" allowOverlap="true">
                                <wp:simplePos x="0" y="0"/>
                                <wp:positionH relativeFrom="column">
                                    <wp:posOffset>-256540</wp:posOffset>
                                </wp:positionH>
                                <wp:positionV relativeFrom="paragraph">
                                    <wp:posOffset>0</wp:posOffset>
                                </wp:positionV>
                                <wp:extent cx="2360930" cy="1404620"/>
                                <wp:effectExtent l="0" t="0" r="22860" b="11430"/>
                                <wp:wrapSquare wrapText="bothSides"/>
                                <wp:docPr id="217" name="Textfeld 2"/>
                                <wp:cNvGraphicFramePr>
                                    <a:graphicFrameLocks/>
                                </wp:cNvGraphicFramePr>
                                <a:graphic>
                                    <a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
                                        <wps:wsp>
                                            <wps:cNvSpPr txBox="true">
                                                <a:spLocks noChangeArrowheads="true"/>
                                            </wps:cNvSpPr>
                                            <wps:spPr bwMode="auto">
                                                <a:xfrm>
                                                    <a:off x="0" y="0"/>
                                                    <a:ext cx="2360930" cy="1404620"/>
                                                </a:xfrm>
                                                <a:prstGeom prst="rect">
                                                    <a:avLst/>
                                                </a:prstGeom>
                                                <a:solidFill>
                                                    <a:srgbClr val="FFFFFF"/>
                                                </a:solidFill>
                                                <a:ln w="9525">
                                                    <a:solidFill>
                                                        <a:srgbClr val="000000"/>
                                                    </a:solidFill>
                                                    <a:miter lim="800000"/>
                                                    <a:headEnd/>
                                                    <a:tailEnd/>
                                                </a:ln>
                                            </wps:spPr>
                                            <wps:txbx>
                                                <w:txbxContent>
                                                    <w:p w:rsidR="00BD5B37" w:rsidRDefault="00BD5B37">
                                                        <w:proofErr w:type="spellStart"/>
                                                        <w:r>
                                                            <w:t>GetThisContent</w:t>
                                                        </w:r>
                                                        <w:proofErr w:type="spellEnd"/>
                                                    </w:p>
                                                </w:txbxContent>
                                            </wps:txbx>
                                            <wps:bodyPr rot="0" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" anchor="t" anchorCtr="false">
                                                <a:spAutoFit/>
                                            </wps:bodyPr>
                                        </wps:wsp>
                                    </a:graphicData>
                                </a:graphic>
                                <wp14:sizeRelH relativeFrom="margin">
                                    <wp14:pctWidth>40000</wp14:pctWidth>
                                </wp14:sizeRelH>
                                <wp14:sizeRelV relativeFrom="margin">
                                    <wp14:pctHeight>20000</wp14:pctHeight>
                                </wp14:sizeRelV>
                            </wp:anchor>
                        </w:drawing>
                    </mc:Choice>
                    <mc:Fallback>
                        <w:pict>
                            <v:shapetype o:spt="202.0" path="m,l,21600r21600,l21600,xe" coordsize="21600,21600" id="_x0000_t202">
                                <v:stroke joinstyle="miter"/>
                                <v:path gradientshapeok="t" o:connecttype="rect"/>
                            </v:shapetype>
                            <v:shape o:gfxdata="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" type="#_x0000_t202" style="position:absolute;margin-left:-20.2pt;margin-top:0;width:185.9pt;height:110.6pt;z-index:251659264;visibility:visible;mso-wrap-style:square;mso-width-percent:400;mso-height-percent:200;mso-wrap-distance-left:9pt;mso-wrap-distance-top:3.6pt;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:3.6pt;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;mso-width-percent:400;mso-height-percent:200;mso-width-relative:margin;mso-height-relative:margin;v-text-anchor:top" id="Textfeld 2" o:spid="_x0000_s1026">
                                <v:textbox style="mso-fit-shape-to-text:t">
                                    <w:txbxContent>
                                        <w:p w:rsidR="00BD5B37" w:rsidRDefault="00BD5B37">
                                            <w:proofErr w:type="spellStart"/>
                                            <w:r>
                                                <w:t>GetThisContent</w:t>
                                            </w:r>
                                            <w:proofErr w:type="spellEnd"/>
                                        </w:p>
                                    </w:txbxContent>
                                </v:textbox>
                                <w10:wrap type="square"/>
                            </v:shape>
                        </w:pict>
                    </mc:Fallback>
                </mc:AlternateContent>
            </w:r>
        </w:p>
        <w:sectPr w:rsidRPr="009670CB" w:rsidR="00CF457B" w:rsidSect="00BD5B37">
            <w:type w:val="continuous"/>
            <w:pgSz w:w="11907" w:h="8391" w:orient="landscape" w:code="11"/>
            <w:pgMar w:top="1418" w:right="1418" w:bottom="1418" w:left="1134" w:header="709" w:footer="709" w:gutter="0"/>
            <w:cols w:space="708"/>
            <w:docGrid w:linePitch="360"/>
        </w:sectPr>
    </w:body>
</w:document>

I need to select the textfields, to do a mail merge and my plan would be to copy and move the fields. If there is a better way to do that, I'm open to try it out :)


EDIT:

I am currently trying to do a full page copy, it works with merge fields but the problem is that I when I try this with textfields I get an error on line 369, column 0, I decided to upload the XML here. I tried different things and changed some stuff, I allways get the error in the line of a Choice element.

Can I debug this in some way or have I implemented it wrong?

private static void generatePagesFromTemplate(final MainDocumentPart document)
  {
    //      final String xpath = "//mc:AlternateContent";
    //      final List<Object> pageContent = document.getJAXBNodesViaXPath(xpath, false);
    final List<Object> pageContent = document.getContent();

    /** This is needed if you don't want a endless loop, 
      otherwise it will increase with adding new objects **/
    final int nrOfElements = pageContent.size();
    final int nrOfSheets = 2;

    // Make a copy of the first sheet, to the nr of pages that exist
    for (int sheetNr = 1; sheetNr < nrOfSheets; sheetNr++)
    {
      addPageBreak(document);

      for (int i = 0; i < nrOfElements; i++)
      {
        final Object tmp = pageContent.get(i);
        document.addObject(tmp);
        System.out.println("Added object: " + tmp.toString());
      }
    }
  }
Schmebi
  • 355
  • 2
  • 16
  • Just so I understand what you are trying to do, you have a page (or pages) of content which contains text boxes, which you are treating as a template, and you want to duplicate this content, then replace the variables in the text boxes? Since you are duplicating the content, I guess you might want to do this many times in the single document? Is there a reason you are using text boxes? Continued in answer below... – JasonPlutext May 06 '21 at 08:22
  • That's exactly what I want to do yes. If textboxes don't work I will try to format normal text on the right places but textboxes give me the freedom that i can drag them around, the next step would be to move the textboxes, what I don't know how to do this at the moment. I also thought about to make a full page copy if this is possible, because I need to copy all the content on every page. – Schmebi May 06 '21 at 09:00
  • If the entire docx is your template, then you can copy all its contents. If not, you'll need to know where the source content starts and ends. You can do this by putting it in a content control (preferred), or by using a bookmark or bookmarks. The main issue here is the special handling more complex content might require eg images – JasonPlutext May 06 '21 at 20:37

3 Answers3

0

Probably a namespace issue... The txbx element is in xmlns:v="urn:schemas-microsoft-com:vml" So maybe just change it to: (I don't know how you declare namespaces in docx4j)

//v:txbx/w:txbxContent/w:p/w:r

This will select all w:r's nut the actual text-nodes.

Siebe Jongebloed
  • 3,906
  • 2
  • 14
  • 19
  • Thank you for your quick answer! I realised that this wasn't really a problem. Sorry for the confusion I feel bad about it. I edited the post maybe this is now to specific for docx4j, that you could help me out. – Schmebi May 03 '21 at 09:01
0

You'll see that a single text box is represented twice in your XML above (in the Choice element and in the Fallback element).

When you copy a text box, you should be copying either the ancestor mc:AlternateContent element or the contents of the Choice element or the Fallback element. And you should be copying it into w:p/w:r.

If you take just the w:r inside the textbox, you'll lose the text box positioning etc.

And you can't just take the w:txbxContent element, since it must live inside the structures found above.

JasonPlutext
  • 15,352
  • 4
  • 44
  • 84
  • Thanks a lot for helping me Jason, I make slowly progress now. Maybe you can take a look on the edit I did if you have some time :) I hope understand it right what you are meaning. – Schmebi May 07 '21 at 11:38
  • wp:docPr/@id has to be unique (our commercial product takes care of such things). After changing one of them (and removing the header|footerReferences), Word can handle your document xml – JasonPlutext May 09 '21 at 20:32
  • That was the problem, thanks a lot! :) The only I still wonder is why the mail merge don't work like I expect. (look at the my answer) – Schmebi May 10 '21 at 11:19
0

Like @JasonPlutext pointed out in the last comment of his answer, my problem why I cant do a full page clone was that the id from docPr is staying the same, so you have to manually change it. Thanks a lot!

A simple solution for that is selecting all elements with XPath and change it to random IDs, after making the copy of all elements.

private static void setRandomIdsForDocPr(final MainDocumentPart document)
      throws JAXBException, XPathBinderAssociationIsPartialException
  {
    final String xpath = "//wp:docPr";
    final List<Object> docPr = document.getJAXBNodesViaXPath(xpath, false);

    CTNonVisualDrawingProps props;
    final Random random = new Random();
    final int min = 1000;
    final int max = 9999;

    for (int i = 0; i < docPr.size(); i++)
    {
      props = (CTNonVisualDrawingProps) docPr.get(i);
      props.setId(random.nextInt((max - min) + 1) + min);
    }
  }

The only thing that still don't works is doing a mail merge, i have a List List<Map<DataFieldName, String>> data with two maps in it, when I use MailMerger.performMerge(...) it's overwriting both sheets I think.

When I am using the same data with MailMergerWithNext.performLabelMerge(..) it's just using the first Map, but nothing more.

So I have the same content on every page, is this also a issue that the elements aren't unique?

Schmebi
  • 355
  • 2
  • 16
  • MailMergerWithNext operates on a single copy of the document template content (ie it duplicates it for each instance of data; you don't need to do this). After using it, you'll need to make your wp:docPr ids unique. (Do you have a NEXT field? If not, use MailMerger instead.) – JasonPlutext May 10 '21 at 21:02
  • Okay I will use MailMerger then, but it doesn't resolves my problem. I still have the same content on each file. It doesn't matter if I change the ids before or after the mail merge. – Schmebi May 11 '21 at 06:51
  • You'll need to create another question then, with sample code, sample data, and sample input docx – JasonPlutext May 11 '21 at 22:19
  • Okay, I created a [new question](https://stackoverflow.com/q/67499910/13163366) maybe you can take a look – Schmebi May 12 '21 at 08:35