【问题标题】:Get thumbnail of word in java using Apache POI with XWPF使用带有 XWPF 的 Apache POI 获取 Java 中单词的缩略图
【发布时间】:2016-05-04 13:15:12
【问题描述】:
这个问题涉及使用 HWPF 获取 word 文档的缩略图:
get thumbnail of word in java using Apache POI
我想用 XWPF 来做这件事 - 用于 word xml 文档 (.docx) 的 Apache POI API。没有 getThumbnail() 方法或类似方法。我怎样才能做到这一点?我想使用“另存为...”对话框中的“生成缩略图”选项提取由 Word 生成的嵌入缩略图 - 这适用于带有 HWPF 的 .doc 文档。
【问题讨论】:
标签:
java
ms-word
apache-poi
【解决方案1】:
您需要升级您的 Apache POI 版本!你需要使用Apache POI 3.15 beta 2 or newer
在这些较新的版本中,您会在 POIXMLProperties 上找到一些与缩略图相关的方法,例如 getThumbnailFilename() 和 getThumbnailImage()
要使用 XWPF 将缩略图保存到文件中,您需要执行以下操作:
XWPFDocument wordDocument = new XWPFDocument(new FileInputStream(docxFile));
POIXMLProperties props = workDocument.getProperties();
String thumbnail = props.getThumbnailFilename();
if (thumbnail == null) {
// No thumbnail
} else {
FileOutputStream fos = new FileOutputStream("c:\\temp\\"+thumbnail);
IOUtils.copy(props.getThumbnailImage(), fos);
}
【解决方案2】:
经过深入研究,尤其是关于开放包装约定的研究,我自己找到了答案。 XWPF 文档 API 中没有“getThumbnai()”便捷方法。缩略图必须通过特定的封装关系提取:
XWPFDocument wordDocument = new XWPFDocument(new FileInputStream(docxFile));
ArrayList<PackagePart> packageParts= wordDocument.getPackage().getPartsByRelationshipType
("http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail");
PackagePart packagePart = packageParts.get(0);
FileOutputStream fos = new FileOutputStream("c:\\temp\\thumb.emf");
IOUtils.copy(packagePart.getInputStream(), fos);
【解决方案3】:
有一个用于制作缩略图的 JVM 库,Thumbnails4j(我是维护者,但它归 Elastic 所有),它在 docx 文件的后台使用 POI。
File input = new File("/path/to/my_file.docx");
Thumbnailer thumbnailer = new DOCXThumbnailer();
List<Dimensions> outputDimensions = Collections.singletonList(new Dimensions(100, 100));
BufferedImage output = thumbnailer.getThumbnails(input, outputDimensions).get(0);