Java I';我正试图用docx4j将图像添加到新的word文档中
我正在尝试使用docx4j将图像添加到新的word文档中。我从网上获取了这段代码,并为我的程序修改了它,但是我收到了一个奇怪的错误,我不确定是什么导致了它,也不知道如何调试它 这是我的密码Java I';我正试图用docx4j将图像添加到新的word文档中,java,image,docx4j,Java,Image,Docx4j,我正在尝试使用docx4j将图像添加到新的word文档中。我从网上获取了这段代码,并为我的程序修改了它,但是我收到了一个奇怪的错误,我不确定是什么导致了它,也不知道如何调试它 这是我的密码 private static void test() { WordprocessingMLPackage wordMLPackage = null; try { wordMLPackage = WordprocessingMLPackage.createPackage();
private static void test()
{
WordprocessingMLPackage wordMLPackage = null;
try {
wordMLPackage = WordprocessingMLPackage.createPackage();
} catch (InvalidFormatException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Cannnot create package.");
}
wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Title", "Hello Word! \n\t" + "Try This!");
byte[] bytes = null;
try {
bytes = convertImageToByteArray();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Image file not found.");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Image file exception: " + e1.toString());
}
try {
addImageToPackage(wordMLPackage, bytes);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Cannot add image to package: " + e.toString());
}
try {
wordMLPackage.save(new java.io.File("HelloWord7.docx"));
} catch (Docx4JException e) {
// TODO Auto-generated catch block
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Cannot save image to file.");
}
}
private static void addImageToPackage(WordprocessingMLPackage wordMLPackage,
byte[] bytes) throws Exception {
BinaryPartAbstractImage imagePart =
BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
int docPrId = 1;
int cNvPrId = 2;
Inline inline = imagePart.createImageInline("Filename hint",
"Alternative text", docPrId, cNvPrId, false);
P paragraph = addInlineImageToParagraph(inline);
wordMLPackage.getMainDocumentPart().addObject(paragraph);
}
private static P addInlineImageToParagraph(Inline inline) {
// Now add the in-line image to a paragraph
ObjectFactory factory = new ObjectFactory();
P paragraph = factory.createP();
R run = factory.createR();
paragraph.getContent().add(run);
Drawing drawing = (Drawing) factory.createDrawing();
run.getContent().add(drawing);
((org.docx4j.wml.Drawing) drawing).getAnchorOrInline().add(inline);
return paragraph;
}
private static byte[] convertImageToByteArray() throws IOException {
// get DataBufferBytes from Raster
WritableRaster raster = logo.getRaster();
DataBufferByte data = (DataBufferByte)raster.getDataBuffer();
return (data.getData());
}
我在上得到以下错误
BinaryPartAbstractImage imagePart =
BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
返回的错误为:docx4jeexception:检查图像格式时出错
下面是“logo”的加载方式
try {
BufferedImage logo = ImageIO.read(getClass().getResourceAsStream("/logo.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Cannot load logo for word doc");
}
谢谢你的帮助
新信息
我以runnable jar的形式运行应用程序,我收到了与上面提到的不同图像类型相同的错误,例如:png、jpg。我曾尝试通过从main()调用test()在eclipse中运行应用程序,但应用程序被卡住了,为什么?如何调试它 我对代码做了一些修改,我将文件传递给createImagePart,而不是byte[]数组
public static P newImage(WordprocessingMLPackage wordMLPackage, File file,
String filenameHint, String altText, int id1, int id2) throws Exception {
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, file);
//.createImagePart(wordMLPackage, bytes);
javax.swing.JOptionPane.showMessageDialog(panel, "Created image part");
Inline inline = imagePart.createImageInline(filenameHint, altText, id1, id2, false);
ObjectFactory factory = new ObjectFactory();
P p = factory.createP();
R run = factory.createR();
p.getContent().add(run);
Drawing drawing = (Drawing) factory.createDrawing();
run.getContent().add(drawing);
((org.docx4j.wml.Drawing) drawing).getAnchorOrInline().add(inline);
return p;
}
private static void test() throws Exception
{
File file = new File("logo.png" );
if (!file.canRead())
javax.swing.JOptionPane.showMessageDialog(panel, "Cannot read file");
if (!file.exists())
javax.swing.JOptionPane.showMessageDialog(panel, "File does not exist");
javax.swing.JOptionPane.showMessageDialog(panel, file.getAbsolutePath());
String filenameHint = null;
String altText = null;
int id1 = 0;
int id2 = 1;
P p = newImage(wordMLPackage, file, filenameHint, altText, id1, id2);
wordMLPackage.getMainDocumentPart().addObject(p);
wordMLPackage.save(new File("Example.docx"));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
wordMLPackage = WordprocessingMLPackage.createPackage();
} catch (InvalidFormatException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(panel, "Could not create wordMLPackage: " + e2.toString());
}
new Calculator().setVisible(true);
}
});
}
这里有一个简单的例子,你可以以此为基础
import java.io.*;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.*;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
public class Example {
public static void main(String[] args) throws Exception {
WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();
File file = new File("C://java-duke-logo.jpg" );
InputStream inputStream = new java.io.FileInputStream(file );
long fileLength = file.length();
byte[] bytes = new byte[(int)fileLength];
int offset = 0;
int numRead = 0;
while(offset < bytes.length
&& (numRead = inputStream.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
inputStream.close();
String filenameHint = null;
String altText = null;
int id1 = 0;
int id2 = 1;
P p = newImage(wordprocessingMLPackage, bytes, filenameHint, altText, id1, id2);
wordprocessingMLPackage.getMainDocumentPart().addObject(p);
wordprocessingMLPackage.save(new File("C://Example.docx"));
}
public static P newImage( WordprocessingMLPackage wordMLPackage, byte[] bytes,
String filenameHint, String altText, int id1, int id2) throws Exception {
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
Inline inline = imagePart.createImageInline( filenameHint, altText, id1, id2);
ObjectFactory factory = new ObjectFactory();
P p = factory.createP();
R run = factory.createR();
p.getParagraphContent().add(run);
Drawing drawing = factory.createDrawing();
run.getRunContent().add(drawing);
drawing.getAnchorOrInline().add(inline);
return p;
}
}
import java.io.*;
导入org.docx4j.dml.wordprocessingDrawing.Inline;
导入org.docx4j.openpackaging.packages.WordprocessingMLPackage;
导入org.docx4j.wml.*;
导入org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
公开课范例{
公共静态void main(字符串[]args)引发异常{
WordprocessingMLPackage WordprocessingMLPackage=WordprocessingMLPackage.createPackage();
File File=新文件(“C://java-duke-logo.jpg”);
InputStream InputStream=new java.io.FileInputStream(文件);
long fileLength=file.length();
字节[]字节=新字节[(int)文件长度];
整数偏移=0;
int numRead=0;
while(偏移量=0){
偏移量+=numRead;
}
inputStream.close();
字符串filenameint=null;
字符串altText=null;
int id1=0;
int id2=1;
P=newImage(wordprocessingMLPackage,bytes,filenameint,altText,id1,id2);
wordprocessingMLPackage.getMainDocumentPart().addObject(p);
wordprocessingMLPackage.save(新文件(“C://Example.docx”);
}
公共静态P newImage(WordprocessingMLPackage wordMLPackage,字节[]字节,
字符串filenameint、字符串altText、int-id1、int-id2)引发异常{
BinaryPartAbstractImage imagePart=BinaryPartAbstractImage.createImagePart(wordMLPackage,字节);
Inline Inline=imagePart.createImageInline(filenameint,altText,id1,id2);
ObjectFactory=新的ObjectFactory();
P=factory.createP();
R run=factory.createR();
p、 getParagraphContent().add(运行);
绘图=工厂.createDrawing();
run.getRunContent().add(绘图);
drawing.getAnchorOrInline().add(内联);
返回p;
}
}
Example.docx:
谢谢您的回复。。。我收到了相同的错误:Docx4JException:检查图像格式时出错此错误从BinaryPartAbstractImage imagePart=BinaryPartAbstractImage.createImagePart(wordMLPackage,字节)行弹出;我试过png,jpg图片。。。但还是一样的错误。我对代码做了一点修改,请查看原始帖子。你对我如何调试这个问题有什么想法吗?Alexey已经描述了正确的方法。另请参见,这可能会起作用,但我认为样式设置更容易更改模板。谢谢你的帮助。