Reputation: 337
I am trying to read a docx file and replace the author names with a constant string.
This is the code in my main function.
import jakarta.xml.bind.JAXBException;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.CTTrackChange;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class App {
public static void main(String[] args) throws IOException, Docx4JException {
try {
// Replace "path/to/your/document.docx" with the actual file path
String inputFilePath = "src/main/java/shapes.docx";
String outputFilePath = "output_no_user_info.docx";
// Load the document
WordprocessingMLPackage wmlPackage = WordprocessingMLPackage.load(new File(inputFilePath));
// Remove user information
removeUserInfo(wmlPackage);
// Save the modified document
FileOutputStream fos = new FileOutputStream(outputFilePath);
wmlPackage.save(fos);
fos.close();
System.out.println("User information removed successfully. Saved as: " + outputFilePath);
} catch (Docx4JException | JAXBException e) {
e.printStackTrace();
System.err.println("Error processing the document: " + e.getMessage());
}
}
public static void removeUserInfo(WordprocessingMLPackage wmlPackage) throws Docx4JException, JAXBException {
MainDocumentPart documentPart = wmlPackage.getMainDocumentPart();
List<Object> trackedChanges = documentPart.getJAXBNodesViaXPath("//w:ins | //w:del", true);
for (Object change : trackedChanges) {
if (change instanceof CTTrackChange) {
CTTrackChange trackChange = (CTTrackChange) change;
trackChange.setAuthor("External");
}
}
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Docx4jTest</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Archetype - Docx4jTest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<version>11.4.9</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-MOXy</artifactId>
<version>11.4.5</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>4.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
The error i'm observing is the below one and it's coming up when there are any shapes in the document. I see CTWordprocessingShape and org.eclipse.persistence.internal.oxm.Root are different classes to be cast and code is breaking in this line of (AbstractMarshalRecordImpl:211).
Root xr = (Root) originalObject;
Link to code for AbstractMarshalRecordImpl:- https://github.com/eclipse-ee4j/eclipselink/blob/7457271b1829f56746c91197a4d3a643b1da9e60/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/AbstractMarshalRecordImpl.java
I'm fairly new to library and please let me know if there is any work around to bypass the issue.
I tried using ReferenceImpl instead of Moxy, ReferenceImpl doesn't cause the below issue.
Exception in thread "main" java.lang.ClassCastException: class org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape cannot be cast to class org.eclipse.persistence.internal.oxm.Root (org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape is in module org.docx4j.openxml_objects of loader 'app'; org.eclipse.persistence.internal.oxm.Root is in module [email protected] of loader 'app')
at [email protected]/org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecordImpl.addXsiTypeAndClassIndicatorIfRequired(AbstractMarshalRecordImpl.java:211)
at [email protected]/org.eclipse.persistence.oxm.record.XMLRecord.addXsiTypeAndClassIndicatorIfRequired(XMLRecord.java:406)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:462)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.writeFromObjectIntoRow(XMLCompositeCollectionMapping.java:463)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:441)
at [email protected]/org.eclipse.persistence.oxm.XMLBinder.updateXML(XMLBinder.java:189)
at [email protected]/org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:145)
at [email protected]/org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:133)
at org.docx4j.core/org.docx4j.XmlUtils.getJAXBAssociationsForXPath(XmlUtils.java:1611)
at org.docx4j.core/org.docx4j.XmlUtils.getJAXBNodesViaXPath(XmlUtils.java:1556)
at org.docx4j.core/org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.getJAXBNodesViaXPath(JaxbXmlPartXPathAware.java:211)
at core.example.sf/core.example.sf.App.removeUserInfo(App.java:44)
at core.example.sf/core.example.sf.App.main(App.java:27)
Upvotes: 2
Views: 87
Reputation: 15863
The problem is @XmlAnyElement(lax = true)
in
public class GraphicData implements Child
{
@XmlAnyElement(lax = true)
protected List<Object> any = new ArrayListDml<Object>(this);
It would work if it instead said:
@XmlElements({
@XmlElement(name = "wsp", namespace = "http://schemas.microsoft.com/office/word/2010/wordprocessingShape", type = CTWordprocessingShape.class),
})
protected List<Object> any = new ArrayListDml<Object>(this);
Upvotes: 1
Reputation: 15863
org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape and org.eclipse.persistence.internal.oxm.Root are in unnamed module of loader 'app'
suggests a possible JPMS (modularisation) config issue at your end.
Works for me using docx4j-JAXB-MOXy and a module-info.java
file which includes:
requires org.docx4j.JAXB_MOXy;
See example at https://github.com/plutext/docx4j/blob/VERSION_11_5_2/docx4j-samples-docx4j/src/main/java/module-info.java
Please note you only need docx4j-JAXB-MOXy
; no need to also be adding docx4-core
and org.eclipse.persistence.moxy
. Also don't mix differing versions (you have 11.4.5 mixed with 11.4.9).
I tested with 11.5.1 on Java 17.
EDIT Doesn't work if org.eclipse.persistence.jaxb.JAXBBinder.updateXML is invoked.
Upvotes: 0