Witam,
mam problem w czasie podmieniania znacznika w dokumencie docx.
Więc tak, mam dwa dokumenty szablony docx, z pierwszego dokumentu odczytuje czy podany znacznik jest taki sam jak podany parametr w kodzie i podmieniam ten znacznik drugim dokumentem docx. Problem tkwi w tym, że jak odczytuje pierwszy dokument i napotka tabele lub obrazek to w dokumencie wynikowym tych tabel i obrazków nie ma. Natomiast ten drugi dokument wstawia odpowiednio.
Oto mój kod do podmiany:
private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
private static void replaceParagraph(String placeholder, WordprocessingMLPackage template,
InputStream s2, OutputStream os) throws IOException, Docx4JException {
List<Object> paragraphs = getAllElementFromObject(template.getMainDocumentPart(), P.class);
MainDocumentPart mainDocument = template.getMainDocumentPart();
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart main = wordMLPackage.getMainDocumentPart();
//AlternativeFormatInputPart as = mainDocument;
for (Object p : paragraphs) {
List<Object> texts = getAllElementFromObject(p, Text.class);
for (Object t : texts) {
Text content = (Text) t;
if (content.getValue().equals(placeholder)) {
AlternativeFormatInputPart afiPart1 = new AlternativeFormatInputPart(
new PartName("/part.docx"));
afiPart1.setContentType(new ContentType(CONTENT_TYPE));
afiPart1.setBinaryData(IOUtils.toByteArray(s2));
Relationship altChunkRel = main.addTargetPart(afiPart1);
CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();
chunk.setId(altChunkRel.getId());
main.addObject(chunk);
p = null;
break;
}
}
if (p != null) {
main.addObject(p);
}
}
wordMLPackage.save(os);
}
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;
}