https://bz.apache.org/bugzilla/show_bug.cgi?id=49765
--- Comment #43 from Stefan Edelbusch <[email protected]> --- When I use the method XWPFRun.addPicture to add images to an word document I got an error message when opening the new document which says that there is some not readable content in the document. Problem is, that it comes to a conflict between drawings (w:drawing) that were already in the word template with the new inserted images. In the XML there are subnodes of drawing of type "wp:docPr" which have identical ID's. I managed to workaround this conflict by testing if the id for the next drawing to insert is already used in the list of known drawings. If so, I increment this next id as long as it is unique so it will not be used twice in the document. For that I expanded the XWPFDocument class as follows. public class ExtendedXWPFDocument extends XWPFDocument { public void makeUniqueNextDrawingId(List<CTDrawing> drawingsAll) { try { Method getDrawingIdManager = getClass().getSuperclass().getDeclaredMethod("getDrawingIdManager", new Class<?>[]{}); getDrawingIdManager.setAccessible(true); IdentifierManager idManager = (IdentifierManager) getDrawingIdManager.invoke(this, (Object[])null); if(idManager != null) { Field field = idManager.getClass().getDeclaredField("segments"); if(field != null){ // make private field accessible field.setAccessible(true); List<?> segmentsList = (List<?>)field.get(idManager); Object segment = segmentsList.get(0); Field fieldStart = segment.getClass().getDeclaredField("start"); fieldStart.setAccessible(true); long nextID = fieldStart.getLong(segment); HashMap<Long, Object> drawingsInUseMap = new HashMap<Long, Object>(); for (CTDrawing drawing : drawingsAll) { List<CTInline> inlineList = drawing.getInlineList(); for (CTInline inline : inlineList) { Long inlineId = inline.getDocPr().getId(); drawingsInUseMap.put(inlineId, inline); } List<CTAnchor> anchorList = drawing.getAnchorList(); for (CTAnchor anchor : anchorList) { Long inlineId = anchor.getDocPr().getId(); drawingsInUseMap.put(inlineId, anchor); } } while (drawingsInUseMap.containsKey(nextID)) { nextID = idManager.reserveNew(); } } } } catch (Exception e) { e.printStackTrace(); } } } When I insert an image I first test, if next id is unique. List<CTDrawing> drawingsAll = getAllDrawings(); document.makeUniqueNextDrawingId(drawingsAll); run.addPicture(inputStream, format, image.getName(), width, height); -- You are receiving this mail because: You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
