如何在Docx4J中设置图片位于指定文本前方(书签定位场景)
在Docx4J中将图片置于指定文本前方的实现方法
核心思路
定位到目标文本所在的段落或文本运行(R)对象,将图片的内联元素插入到目标元素的前方位置。
具体实现步骤
定位书签对应的段落
通过书签名称找到目标段落,代码示例:// 已初始化的WordprocessingMLPackage对象 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("原文档路径.docx")); String targetBookmark = "你的书签名称"; Bookmark bookmark = wordMLPackage.getMainDocumentPart().getBookmark(targetBookmark); // 获取书签所在的段落 P targetPara = (bookmark != null) ? (P) bookmark.getParent() : null;创建图片内联对象
将图片嵌入文档并生成可插入的内联元素,代码示例:File imgFile = new File("图片路径.png"); BinaryPartAbstractImage imgPart = BinaryPartAbstractImage.createImagePart(wordMLPackage, imgFile); // 设置图片宽高(单位:磅) Inline imgInline = imgPart.createImageInline(null, null, 0, 1, false, 150, 100);插入图片到段落最前方
若目标文本是段落开头,直接将图片插入段落内容列表的首位:if (targetPara != null) { List<Object> paraContent = targetPara.getContent(); // 插入到列表第一个位置 paraContent.add(0, imgInline); }针对段落内指定文本的精细插入
如果目标文本在段落中间,需先找到对应的文本运行(R)对象,再插入图片:if (targetPara != null) { List<Object> paraContent = targetPara.getContent(); String targetText = "要前置图片的指定文本"; // 遍历段落内的文本运行,找到目标文本所在的R对象 for (int i = 0; i < paraContent.size(); i++) { Object obj = paraContent.get(i); if (obj instanceof R) { R run = (R) obj; String runText = run.getContent().stream() .filter(o -> o instanceof Text) .map(o -> ((Text) o).getValue()) .collect(Collectors.joining()); if (runText.contains(targetText)) { // 在该R对象前插入图片 paraContent.add(i, imgInline); break; } } } }保存修改后的文档
wordMLPackage.save(new File("修改后的文档路径.docx"));
内容的提问来源于stack exchange,提问作者jjosjoahu
相关产品推荐
相关产品推荐

