gpt4 book ai didi

Java Apache-POI XWPF 如何复制或输出位图?

转载 作者:行者123 更新时间:2023-11-30 04:01:25 29 4
gpt4 key购买 nike

对此进行了一些研究,过去似乎存在与此相关的错误,我不确定它们是否在最新版本中得到解决。

我正在阅读一个 docx 模板,进行一些修改并输出它。我正在复制文档的所有元素,除了位图之外,位图应包含文本的位置会出现一个标记,“当前无法显示此图像”。我已经尝试过几次了。

将位图从一个文档复制到另一个文档的推荐方法是什么?

我可以获取图像如下:

List piclist = template.getAllPictures();

XWPFPictureData picture = (XWPFPictureData)piclist.get(i);

但我不知道如何将其复制到我的新文档中。

我尝试过从文件中添加单个位图的测试,此代码创建的 Word 文档出现错误并且无法加载到 Word 中:

InputStream pic = new FileInputStream("filename.gif");

outputDoc.addPictureData(pic, outputDoc.PICTURE_TYPE_GIF);

非常感谢任何帮助。 Apache-POI 给人留下了深刻的印象。

最佳答案

答案很晚了,但谁知道呢..如果您想将一个文档的图片复制到另一个文档,请尝试以下操作:

public void copyAllImages( XWPFDocument sourceDocument, XWPFDocument targetDocument ) {
Map<String, Integer> extractedImages = new HashMap<String, Integer>();
XWPFPictureData pictureData = null;

// 1. Writing all found images to the disk (to the same folder as your source document)
for ( XWPFParagraph par : sourceDocument.getParagraphs() ) {
for ( XWPFRun run : par.getRuns() ) {
for ( XWPFPicture picture : run.getEmbeddedPictures() ) {
pictureData = picture.getPictureData();
byte[] img = pictureData.getData();
String fileName = pictureData.getFileName();
int imageFormat = pictureData.getPictureType();
writeByteArrayToFile( img, fileName );
extractedImages.put( fileName, imageFormat );
}
}
}

// 2. Writing images from the disk to the final document,
// creating 1 new paragraph with 1 run for each image.
for ( String imageFileName : extractedImages.keySet() ) {
XWPFParagraph newParagraph = targetDocument.createParagraph();
XWPFRun newRun = newParagraph.createRun();
copyImageToRun( imageFileName, newRun, extractedImages.get( imageFileName ) );
}
}

private static void writeByteArrayToFile( byte[] byteArray, String fileName ) {
FileOutputStream out = null;
try {
out = new FileOutputStream( new File( fileName ) );
out.write( byteArray );
} catch ( Exception e ) {
e.printStackTrace();
} finally {
try {
out.close();
} catch ( Exception e ) {
e.printStackTrace();
}
}
}

private void copyImageToRun( String imageFileName, XWPFRun run, int format ) {
run.setText( imageFileName );
run.addBreak();

try {
run.addPicture( new FileInputStream( imageFileName ), format, imageFileName,
Units.toEMU( 200 ), Units.toEMU( 200 ) ); // 200x200 pixels

} catch ( Exception e ) {
e.printStackTrace();
}

run.addBreak( BreakType.PAGE );
}

因此,您只需两个 XWPFDocument 对象,将它们传递给第一个函数 (copyAllImages),然后像往常一样使用 document.write(out) 保存这些文档。根据您的需要,您还可以添加到步骤 1 的代码,该代码将复制段落的所有内容(而不仅仅是图像)。也许人们可以跳过将图像写入磁盘,将该图片数据直接插入到新创建的运行中。然而,我没能成功(图像根本没有出现)。但采用两步法,终于给出了结果。

希望对你有帮助!

附注现在的问题是使用哪个尺寸的图像?目前我只看到了 addPicture 函数,它要求您传递宽度和高度,而且还可以重新缩放图像。因此,我们需要一些技巧来提取原始文档中每个图像的大小(以像素为单位)(不一定是原始图像大小,因为它可以由用户重新缩放)。

灵感来自here .

关于Java Apache-POI XWPF 如何复制或输出位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912422/

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