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;
	}