Java I';我正试图用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();

我正在尝试使用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);
返回的错误为: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已经描述了正确的方法。另请参见,这可能会起作用,但我认为样式设置更容易更改模板。谢谢你的帮助。