Docx4j 用图片替换文本 XML
Docx4j replace a text by picture in XML
我想用 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();
}
现在我不知道在draw中放了什么来添加我的图片,在我想打开我的docx的这一步出现了问题。有什么想法吗?
我解决了问题所以我 post 解决方案,也许它会对某人有所帮助。
首先你需要知道我们要在绘图中添加一个Inline,所以我们需要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));
我想用 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();
}
现在我不知道在draw中放了什么来添加我的图片,在我想打开我的docx的这一步出现了问题。有什么想法吗?
我解决了问题所以我 post 解决方案,也许它会对某人有所帮助。
首先你需要知道我们要在绘图中添加一个Inline,所以我们需要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));