plutext / docx4j

JAXB-based Java library for Word docx, Powerpoint pptx, and Excel xlsx files

Home Page:https://www.docx4java.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

jakarta.xml.bind.UnmarshalException when updating bindings in .docx file

svedin opened this issue · comments

For some docx files I get an UnmarshalException when I try to update bindings in them.
I assume that there is something in my .docx that triggers it, but I have no idea what it is.

My code for updating bindings:

final WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(docxFile);
BindingHandler.getHyperlinkResolver().setHyperlinkStyle("Hyperlink");
final BindingHandler bh = new BindingHandler(wordMLPackage);
bh.applyBindings();
wordMLPackage.save(docxFile);

The stacktrace:

Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Problems applying bindings
	at org.docx4j.model.datastorage.BindingTraverserXSLT.traverseToBind(BindingTraverserXSLT.java:239)
	at org.docx4j.model.datastorage.BindingHandler.applyBindings(BindingHandler.java:292)
	at org.docx4j.model.datastorage.BindingHandler.applyBindings(BindingHandler.java:216)
	at <anonymized>.WordXMLInjector.updateBindings(WordXMLInjector.java:180)
	at <anonymized>.WordXMLInjector.injectXML(WordXMLInjector.java:98)
	... 185 more
Caused by: jakarta.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.openxmlformats.org/wordprocessingml/2006/main", local:"r"). Expected elements are <{http://schemas.openxmlformats.org/wordprocessingml/2006/main}sdt>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}permEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}permStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlMoveFromRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlMoveToRangeStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlMoveToRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}del>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlInsRangeStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveFromRangeStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}commentRangeStart>,<{http://schemas.openxmlformats.org/officeDocument/2006/math}oMathPara>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveFrom>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlDelRangeStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlDelRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveToRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveToRangeStart>,<{http://schemas.openxmlformats.org/officeDocument/2006/math}oMath>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveFromRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}bookmarkStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXml>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlInsRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ins>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}customXmlMoveFromRangeStart>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}bookmarkEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}commentRangeEnd>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}moveTo>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}proofErr>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}tr>
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:701)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:230)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:225)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:92)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.childElement(Loader.java:73)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:236)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:531)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:513)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:46)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:214)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:251)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:220)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:251)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:220)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:251)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:220)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:251)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:220)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:251)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.visit(DOMScanner.java:220)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.scan(DOMScanner.java:97)
	at org.glassfish.jaxb.core.unmarshaller.DOMScanner.scan(DOMScanner.java:80)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:331)
	at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:312)
	at org.docx4j.model.datastorage.BindingTraverserXSLT.unmarshal(BindingTraverserXSLT.java:261)
	at org.docx4j.model.datastorage.BindingTraverserXSLT.traverseToBind(BindingTraverserXSLT.java:221)
	... 189 more

It is saying there is a w:r in the wrong place. To help further, would need to see your input docx (anonymised if sensitve).

Thanks for answering so ! I have created a testing document that reproduces the error
example.docx

I forgot to mention in the initial comment, but I'm using version 11.4.7 of docx4j.

Another more minimal example that reproduces the issue
Minimal_repeating.docx
it seems like the issue might be related to repeatingSections

Repeats and conditionals are handled by the OpenDoPEHandler step.

After that, BindingHandler fills in the variables.

So you need to invoke the OpenDoPEHandler step first. Do this either using the Docx4j facade
https://github.com/plutext/docx4j/blob/VERSION_11_4_8/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/ContentControlBindingExtensions.java , or for ease of debugging, https://github.com/plutext/docx4j/blob/VERSION_11_4_8/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/ContentControlBindingExtensionsOld.java

Please note that the primary use case for this code is processing "OpenDoPE" content control binding extensions, as opposed to plain vanilla Microsoft Word bindings.

That said, in light testing, plain vanilla Microsoft Word bindings do appear to work.

For more, see https://www.docx4java.org/blog/2015/01/word-2013-repeatingsection-content-controls-ready-for-prime-time/

Nice, I had no idea that I needed to that. From my initial testing it seems to work!
Thanks a lot for the help!