java - docx4j ejemplo
docx4j-eliminar el elemento wml P (1)
Estoy usando docx4j para trabajar con una plantilla de Microsoft Word. Quiero saber cómo eliminar u ocultar un elemento P en la plantilla. Puedo recorrer el código para obtener un elemento P específico, ahora necesito saber cómo eliminar u ocultar ese elemento P. ¿Alguien puede ayudar? Obtengo todos los elementos P usando el siguiente código:
private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
List<Object> result = new ArrayList<Object>();
if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();
if (obj.getClass().equals(toSearch))
result.add(obj);
else if (obj instanceof ContentAccessor) {
List<?> children = ((ContentAccessor) obj).getContent();
for (Object child : children) {
result.addAll(getAllElementFromObject(child, toSearch));
}
}
return result;
}
private void replaceTextValue_P(WordprocessingMLPackage template ) throws Exception{
List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), P.class);
// List<Object> pCon = new ArrayList<Object>();
for (Object text : texts) {
P textElement = (P) text;
template.getMainDocumentPart().getContent().remove(textElement); // DOES NOT WORK!
writeDocxToStream(template, "C://Temp//Target.docx");
}
}
private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {
File f = new File(target);
template.save(f);
}
Si desea eliminar una P (es decir, una instancia de texto de P), simplemente elimínela de la lista de contenido, es decir,
template.getMainDocumentPart().getContent().remove(textElement )
Pero creo que te refieres a eliminar el contenido de texto.
Eso funciona de la misma manera, es decir:
p.getContent().remove(textElement )
Mirando a:
public void replaceElement(Object current, List insertions) {
int index = content.indexOf(current);
if (index > -1 ) {
content.addAll(index+1, insertions);
Object removed = content.remove(index);
// sanity check
if (!current.equals(removed)) {
log.error("removed wrong object?");
}
} else {
// Not found
log.error("Couldn''t find replacement target.");
}
}
ese método tal como está no funcionaría si la corriente de Objeto que está pasando solo coincide con algo envuelto en JAXBElement. Necesita una pequeña solución para abordar ese caso.