-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
docx4j version, Java used
8.3.14 + JAXB-MOXy on Java 8
The issue
Some versions of Word 365 produce a numbering.xml docx4j can’t process. Should docx4j save the resulting document, it cannot be opened by Word again.
Analysis showed the reason to be Word placing an AlternateContent inside a <w:numPicBullet>.
JaxbXmlPartXPathAware.unmarshal(InputStream, boolean), line 594, discovers the alternate content and reduces it to the fallback branch containing a drawing, ignoring the pict in the choice branch. However, the docx4j class for NumPicBullet currently only supports pict. Drawing gets ignored. On resaving, this leaves the <w:numPicBullet w:numPicBulletId="0"/> empty, corrupting the file.
Reproduction
I found this on a document after it got re-saved with Word 365. It contained an embedded image as a numbering symbol. In general, this is how to reproduce this issue: Define numbering with image as symbol. However, even Word 365 does not do this all the time, messing things up.
To speed up things I attached a ready-to-use reproduction maven project containing such a document as well as a Word 2019 counterpart without the issue.
My current solution
Can also be found and enabled in resources folder in the maven repro project
I created a copy of org.docx4j.jaxb.mc-preprocessor.xslt, then below
<xsl:template match="mc:AlternateContent"> I added an instruction to keep the choice path of numPicBullet (-> the pict docx4j supports) instead of defaulting to fallback.
<xsl:when test="parent::w:numPicBullet">
<xsl:variable name="message"
select="concat('Selecting ', name(mc:Choice/*[1]) )" />
<xsl:variable name="logging"
select="java:org.docx4j.utils.XSLTUtils.logWarn($message)" />
<xsl:copy-of select="mc:Choice/*"/>
</xsl:when>Then referenced this copy inside docx4j.properties as
docx4j.jaxb.JaxbValidationEventHandler=myworkaround.xslt
Suggestion
Could this xsl:when be integrated into default mc-preprocessor.xslt?
Thank you😊