Java 使用POI将word中的占位符替换为图片应该怎么操作?

目前使用的是通过遍历word中的table、row、cell获取到占位符,然后用cell.addParagraph().createRun().addPicture(in, pictureType, "", 10, 10)的方式添加图片,但是没有生效,占位符被去掉了 但是图片没有插入,有人遇到这种现象吗?或者我这种方式靠谱吗?

试试我的代码,测试是正确的。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class AddPicToWord {

    private static final File BASE_DIR = new File("D:/");
    private static final File DOCX_FILE = new File(BASE_DIR, "1.docx");
    private static final File DOCX_FILE_NEW = new File(BASE_DIR, "2.docx");
    private static final File PIC_FILE = new File(BASE_DIR, "音视频开源库.png");

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        InputStream is = new FileInputStream(DOCX_FILE);
        XWPFDocument docx = new XWPFDocument(is);
        XWPFParagraph paragraph = docx.createParagraph();

        InputStream pic_is = new FileInputStream(PIC_FILE);
        BufferedImage image = ImageIO.read(PIC_FILE);

        XWPFRun run = paragraph.createRun();
        run.addPicture(pic_is, org.apache.poi.xwpf.usermodel.Document.PICTURE_TYPE_PNG, "",
                Units.pixelToEMU(image.getWidth()), Units.pixelToEMU(image.getHeight()));
        
        OutputStream os = new FileOutputStream(DOCX_FILE_NEW);
        docx.write(os);
        os.close();
        
        docx.close();
        is.close();
    }
}
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class AddPicToWord {

    private static final File BASE_DIR = new File("D:/");
    private static final File DOCX_FILE = new File(BASE_DIR, "1.docx");
    private static final File DOCX_FILE_NEW = new File(BASE_DIR, "2.docx");
    private static final File PIC_FILE = new File(BASE_DIR, "音视频开源库.png");

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        InputStream is = new FileInputStream(DOCX_FILE);
        XWPFDocument docx = new XWPFDocument(is);
        List<XWPFParagraph> paragraphs = docx.getParagraphs();

        InputStream pic_is = new FileInputStream(PIC_FILE);
        BufferedImage image = ImageIO.read(PIC_FILE);

        XWPFParagraph paragraph = null;
        List<XWPFRun> runs = null;
        XWPFRun run = null;
        XWPFRun prevRun = null;
        int runPos = -1;

        for (int i = 0, size1 = paragraphs.size(); i < size1; ++i) {
            paragraph = paragraphs.get(i);
            runs = paragraph.getRuns();
            boolean found = false;

            for (int j = 0, size2 = runs.size(); j < size2; ++j) {
                run = runs.get(j);
                if ("${pic}".equals(run.text())) {
                    found = true;
                    prevRun = (j == 0 ? null : runs.get(j - 1));
                    runPos = j;
                    break;
                }
            }

            if (found)
                break;
        }

        if (runPos >= 0) {
            if (prevRun == null)
                prevRun = paragraph.createRun();

            prevRun.addPicture(pic_is, org.apache.poi.xwpf.usermodel.Document.PICTURE_TYPE_PNG, "",
                    Units.pixelToEMU(image.getWidth()), Units.pixelToEMU(image.getHeight()));
            paragraph.removeRun(runPos);

            OutputStream os = new FileOutputStream(DOCX_FILE_NEW);
            docx.write(os);
            os.close();
        }

        docx.close();
        is.close();
    }
}

img


img