Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Docx4j用XML中的图片替换文本_Java_Xml_Docx4j - Fatal编程技术网

Java Docx4j用XML中的图片替换文本

Java Docx4j用XML中的图片替换文本,java,xml,docx4j,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 =

我想用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();
}
List List=this.getDocumentPart().getJAXBNodesViaXPath(xpath,false);
org.docx4j.wml.ObjectFactory=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));
试一试{
这个.getWordMLPackage().save(新的java.io.File(“C:\\user\\result.docx”);
}捕获(Docx4j异常e){
e、 printStackTrace();
}

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

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

首先,你需要知道,我们将在图形中添加一个内联,所以我们需要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;
}
并在下一步将内联添加到图形中:

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));

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

首先,你需要知道,我们将在图形中添加一个内联,所以我们需要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;
}
并在下一步将内联添加到图形中:

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));