0

我需要能够将 .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)

我对此进行了一些研究,但是相对缺乏我能找到的文档造成了一些限制。例如,这个页面:

https://github.com/groupdocs/groupdocs-conversion-java-maven-sample/blob/master/src/main/java/com/groupdocs/conversion/maven/converters/ToImageSampleConversion.java

...在这个片段中积极地表明这是可能的,至少在理论上如何:

/** * 将 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?

4

1 回答 1

0

我离开了一段时间,但今天又回到了它。

这是我的解决方案:

public class RenderImages {
private static final Log log = LogFactory.getLog(RenderImages.class);

public static void generateRenderedImages(Datastore datastore,
    InputStream inputStream,
    String fileName,
    ConversionHandler conversionHandler,
    SystemProperties systemProperties,
    Logger logger) {

    int thumbnailHeight = systemProperties.getAsInteger("RENDER_THUMBNAIL_HEIGHT");
    int thumbnailWidth = systemProperties.getAsInteger("RENDER_THUMBNAIL_WIDTH");
    String contentTypePreview = systemProperties.get("RENDER_CONTENT_TYPE_PREVIEW");
    String contentTypeThumbnail = systemProperties.get("RENDER_CONTENT_TYPE_THUMBNAIL");

    try {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, outputStream);
        byte[] imageBytes = outputStream.toByteArray();
        inputStream.close();

        ImageSaveOptions imageSaveOptions = new ImageSaveOptions();
        imageSaveOptions.setSaveFileType(ImageSaveOptions.JPEG);
        imageSaveOptions.setPage(1);

        ByteArrayOutputStream previewStream = conversionHandler.convertToImage(new ByteArrayInputStream(imageBytes),
            fileName + ".pdf",
            imageSaveOptions);

        saveToDatabase(datastore, previewStream, contentTypePreview, fileName);
        previewStream.close();

        imageSaveOptions.setHeight(thumbnailHeight);
        imageSaveOptions.setWidth(thumbnailWidth);

        ByteArrayOutputStream thumbnailStream = conversionHandler.convertToImage(
            new ByteArrayInputStream(imageBytes),
            fileName + ".pdf",
            imageSaveOptions);

        saveToDatabase(datastore, thumbnailStream, contentTypeThumbnail, fileName);
        thumbnailStream.close();
    } catch (Exception e) {
        e.printStackTrace();
        log.error("Image rendering failed); error = " + e.getMessage());
        logger.writeLog("Image rendering failed); error = " + e.getMessage());

    } finally {
        // maybe need something here, not sure yet
    }
}

private static void saveToDatabase(Datastore datastore,
    ByteArrayOutputStream image, String contentType, String fileName) throws IOException {

    RenderedImage renderedImage = datastore.find(RenderedImage.class)
        .filter("attachmentId", fileName)
        .filter("contentType", contentType)
        .get();

    if (renderedImage == null) {
        renderedImage = new RenderedImage();
        renderedImage.setAttachmentId(fileName);
        renderedImage.setContentType(contentType);
        renderedImage.setContent(image.toByteArray());
        datastore.save(renderedImage);
    }
}

}

于 2015-09-09T20:05:06.363 回答