gpt4 book ai didi

java - 我正在尝试使用 docx4j 将图像添加到新的 word 文档

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:59 26 4
gpt4 key购买 nike

我正在尝试使用 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:检查图像格式时出错。

这是“ 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");
}

感谢任何帮助,谢谢

新信息


我将应用程序作为可运行的 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;
}
}

例子.docx:

enter image description here

关于java - 我正在尝试使用 docx4j 将图像添加到新的 word 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21873479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com