【发布时间】:2014-02-19 07:10:23
【问题描述】:
我正在尝试使用 docx4j 将图像添加到新的 word 文档。我从网上获取了这段代码并为我的程序修改了它,但是我收到一个奇怪的错误,我不确定是什么导致它或如何调试它......
这是我的代码
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);
返回的错误是:Docx4JException:检查图像格式时出错。
这是“徽标”的加载方式,
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");
}
感谢任何帮助,谢谢
新信息
我正在将应用程序作为可运行的 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);
}
});
}
【问题讨论】: