java poi给word(2007及以上)的书签动态替换文字、图片(可浮于文字上方)

本文介绍了如何使用Java POI库处理2007及以后版本的Word文档,修复了XWPFDocument插入图片的bug,并展示了如何在书签位置动态替换文字和图片。通过创建自定义的CustomXWPFDocument类,实现了图片的正确显示。此外,还详细说明了如何将图片设置为浮于文字上方,以及提供了完整的代码示例和所需Maven依赖。
摘要由CSDN通过智能技术生成

一、因为原本的XWPFDocument类插入图片方法有bug,要么打不开word,要么打开了不显示图片,所以新建一个CustomXWPFDocument类继承XWPFDocument,重写插入图片方法。

二、插入到指定位置(书签)是获取所有段落、所有表格,遍历获取到的每一个段落(表格可以获取到cell后再获取cell里的段落),段落通过paragraph.getCTP().getBookmarkStartList()获得所有的书签,匹配需要的书签创建run,然后把图片添加到创建的run中。

三、插入图片默认为嵌入型,这里提供浮于文字上方方法(把anchor标签下的behindDoc属性设为0,同时添加一个<wp:wrapNone/>的空标签)。

四、其中main方法里为启动方式

五、完整代码如下:

package com.enter.net.fhbusiness.construction.service.impl;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

/**
 * poi在指定书签位置添加图片
 */
public class CustomXWPFDocument extends XWPFDocument {
	public CustomXWPFDocument() {
		super();
	}

	public CustomXWPFDocument(OPCPackage opcPackage) throws IOException {
		super(opcPackage);
	}

	public CustomXWPFDocument(InputStream in) throws IOException {
		super(in);
	}

	public void addPictureToRun(XWPFRun run, String blipId, int id, int width, int height) {
		final int EMU = 9525;
		width *= EMU;
		height *= EMU;

		String picXml = "" +
				"<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +
				"   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
				"      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
				"         <pic:nvPicPr>" +
				"            <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" +
				"            <pic:cNvPicPr/>" +
				"         </pic:nvPicPr>" +
				"         <pic:blipFill>" +
				"            <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
				"            <a:stretch>" +
				"               <a:fillRect/&g
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值