我需要能够将 .pdf 文档转换为预览/缩略图图像以供以后检索。它现在在我的解决方案中工作,目前涉及将新文件转储到监视文件夹中,将转换后的文件写入磁盘,然后将它们推送到 MongoDB 集合中。但我想在不将任何文件写入磁盘的情况下做到这一点。(图像文件本身将进入 MongoDB 集合,生成图像文件的内容来自不同的 MongoDB 集合。)我正在使用 groupdocs 转换来执行此操作。
我有一个类检索内容并将其作为 InputStream 传递给另一个类,其感兴趣的方法如下所示:
public void generateRenderedImages(InputStream inputStream, String fileName, ConversionHandler conversionHandler) {
File previewImage = null;
File thumbnailImage = null;
File parent = null;
try {
ImageSaveOptions imageSaveOptions = new ImageSaveOptions();
imageSaveOptions.setSaveFileType(ImageSaveOptions.JPEG);
imageSaveOptions.setPage(1);
imageSaveOptions.setHeight(THUMBNAIL_HEIGHT);
imageSaveOptions.setWidth(THUMBNAIL_WIDTH);
imageSaveOptions.setSavePath(null);
// generate preview image
imageSaveOptions.setSaveName("blah.jpg");
OutputStream outputStream = conversionHandler.convertToImage(inputStream, fileName, imageSaveOptions);
saveToDatabase(outputStream, CONTENT_TYPE_PREVIEW, fileName);
imageSaveOptions.setHeight(THUMBNAIL_HEIGHT);
imageSaveOptions.setWidth(THUMBNAIL_WIDTH);
outputStream.close();
outputStream = conversionHandler.convertToImage(inputStream, fileName, imageSaveOptions);
saveToDatabase(outputStream, CONTENT_TYPE_THUMBNAIL, fileName);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
log.error("Image rendering failed); error = " + e.getMessage());
resLogger.writeLog("Image rendering failed); error = " + e.getMessage());
} finally {
// maybe need something here, not sure yet
}
}
问题是我在conversionHandler.convertToImage(...) 行抛出了一个NullPointerException——堆栈跟踪的相关部分将跟随——即使conversionHandler 及其任何参数都不是空的。
com.groupdocs.conversion.converter.a.(ConversionHelper.java:31) 处的 java.lang.NullPointerException com.groupdocs.conversion.handler.ConversionHandler.convertToImage(ConversionHandler.java:127)
我对此进行了一些研究,但是相对缺乏我能找到的文档造成了一些限制。例如,这个页面:
...在这个片段中积极地表明这是可能的,至少在理论上如何:
/** * 将 1 个文档页面转换为图像
* 在这种类型的转换中,convertToImage 返回带有转换文件的 OutputStream
* 注意:转换后的文件不保存在本地目录中
* 要使用这种类型的转换,必须使用 'page' 和 'saveToStream' 参数在 ImageSaveOptions 中设置
* convertToImage 方法也可以接收 InputStream 作为参数
* 有关更多信息,请参阅 JavaDoc。
* @param conversionHandler ConversionHandler 实例 * @param page 页码 */ public void convertToStream(ConversionHandler conversionHandler, int page){ ImageSaveOptions imageSaveOptions = new ImageSaveOptions(); imageSaveOptions.setSaveFileType(ImageSaveOptions.PNG); imageSaveOptions.setPage(page);
OutputStream outputStream = conversionHandler.convertToImage(PDF_FILE, imageSaveOptions);
//do something with the stream
不幸的是,没有 setSaveToStream() 方法,但我从这个页面找到:
http://groupdocs.com/Community/files/9/java-libraries/groupdocs_conversion_for_java/entry5343.aspx
在以前的版本中,这已被删除:
公共 Api 更改 ... com.groupdocs.conversion.option.SaveOptions 方法 setSaveToStream 已被删除以简化选项参数。现在要将结果文档保存到流输出,只需不要设置 SaveOptions.setSavePath 或将其设置为 null。
所以我不必显式设置 saveToStream 属性,我只需确保 savePath 为空。我已经完成了,但问题仍然存在。我已经尝试了设置/不设置属性的所有其他组合,结果都相同。
我正在使用 1.2.0 版的 groupdocs 转换。任何人以前都见过这个,并且知道为什么当没有任何内容为空时我可能会得到 NPE?