编程语言
首页 > 编程语言> > java – 我正在尝试使用docx4j将图像添加到新单词doc

java – 我正在尝试使用docx4j将图像添加到新单词doc

作者:互联网

我正在尝试使用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);
        }
    });
}

解决方法:

这是一个简单的例子,你可以把它作为基础.

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

Example.docx:

标签:java,image,docx4j
来源: https://codeday.me/bug/20190624/1279984.html