Docx4j用XML替换文本

时间:2017-05-11 08:36:23

标签: java xml docx4j

我想用docx文件的XML结构中的图片替换文本。 我尝试过类似的东西: 首先,我在XML中搜索好文本,然后创建绘图对象以将图片放入。

List<Object> list = this.getDocumentPart().getJAXBNodesViaXPath(xpath, false);
org.docx4j.wml.ObjectFactory  factory  =  Context.getWmlObjectFactory();
org.docx4j.wml.P para = factory.createP();
org.docx4j.wml.Drawing draw = factory.createDrawing();
((R)list.get(0)).getContent().clear();
((R)list.get(0)).getContent().add(draw);
para.getContent().add(((R)list.get(0)));
try {
    this.getWordMLPackage().save(new java.io.File("C:\\user\\result.docx") );
} catch (Docx4JException e) {
    e.printStackTrace();
}

现在我不知道在绘制中添加我的图片是什么,在这一步当我想打开我的docx时出现问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我解决了这个问题,所以我发布了解决方案,也许会帮助别人。

首先你需要知道我们要在绘图中添加一个内联,所以我们需要2个功能。 第一个在ByteArray中转换图片;

private static byte[] convertImageToByteArray(File file) throws FileNotFoundException, IOException {
    InputStream is = new FileInputStream(file );
    long length = file.length();
    if (length > Integer.MAX_VALUE) {
        System.out.println("Fichier trop volumineux.");
    }
    byte[] bytes = new byte[(int)length];
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length  && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
        offset += numRead;
    }
    if (offset < bytes.length) {
        System.out.println("Impossible de lire en entier le fichier: " + file.getName());
    }
    is.close();
    return bytes;
}

之后你需要创建内联:

public Inline createInline(File filePict) throws Exception{
    byte[] bytes = convertImageToByteArray(filePict);
    BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(this.getWordMLPackage(), bytes);
    int id1 = 1;
    int id2 = 2;
    Inline inline = imagePart.createImageInline("Filename hint", filePict.getName(), id1, id2, false);
    return inline;
}

在添加内联到绘图时:

File fileLogo = new File(this.cusDir+mappings.get("logo"));
org.docx4j.wml.Drawing draw = factory.createDrawing();
((R)list.get(i)).getContent().clear();
((R)list.get(i)).getContent().add(draw);
draw.getAnchorOrInline().add(createInline(fileLogo));