使用JAVA转换为缩略图,尽然如此简单!

为什么要将文档转换为缩略图?

    将文档“转换”为缩略图图像(即,以编程方式从文档内容生成缩略图图像)可以创建轻量级内容预览,文档收件人可以毫不费力地快速查看这些预览。

3eb9bec73cfa1b0f4cdddeb575fbae11.png

    我过去曾在这里写过将文件转换为图像数组(例如 PNG 和 JPG)的好处,这些概念与生成缩略图背后的想法之间存在一些交叉,以及一些关键差异。

    从本质上讲,这两个图像转换过程都旨在生成轻量级图像结果,并且它们都尝试在多个系统/平台上以一致、可预测的方式表示内容。虽然通常会生成 PNG/JPG 文档图像数组来替换原始的预转换文档格式(例如 DOCX、PDF、XLSX 等),但缩略图图像则相反,旨在永久地伴随原始内容,使具有文档访问权限的人有机会查看其内容并快速吸收其相关性。由于缩略图旨在伴随文件而不是替换文件,因此它们的大小通常要小得多,并且不太专注于提供清晰的图像质量。调整图像大小也成为该过程的重要组成部分。

为什么要自动化此过程?

    一般来说,将我们认为最终将在文件处理系统下游进行的任何工作流程自动化都是一个好主意,尤其是在我们有一种现成的、有效的方法来做到这一点的情况下。我们可以通过用一致、可靠的编程输出仁慈地取代繁琐的手动流程来主动增加系统的价值。

    例如,文件处理系统在 PDF 文档和 PowerPoint 演示文稿通过自动电子邮件将这些文件发送给外部网络中的收件人之前,先为这些文件创建缩略图图像的情况并不少见。PDF 和 PowerPoint 往往非常大,并且在电子邮件预览工具中打开速度很慢(尤其是当它们包含多个页面/幻灯片和多媒体时),并且与大多数文件一样,当它们来自“不受信任的”外部网络时,它们往往会在电子邮件应用程序中引发标记,因为它们在技术上有可能执行恶意代码和利用漏洞在文档查看器中。通过为这些文件提供缩略图,我们可以帮助向收件人保证他们收到的内容符合他们的期望并且可以安全打开。

    还值得注意的是,我们会发现许多流行的视频流媒体平台都存在自动缩略图生成功能。通常,系统会自动从视频文件中提取一帧或两帧,视频上传者可以选择在视频平台的图库中使用这些帧来表示其内容。映像托管平台也是如此;我们经常会注意到画廊中较大的 PNG、JPG 或矢量图形文件附带的图像的小型预览版本。

在 Java 中生成缩略图

生成缩略图图像需要两个基本步骤:

  1. 将原始内容的至少一页(或框架,通常是其中的第一页)转换为轻量级图像格式(例如 JPG 或 PNG)

  2. 将生成的图像大小调整为适合上下文的宽度和高度尺寸集

我们可以使用一些值得注意的开源解决方案来在 Java 中生成文档缩略图。

    例如,如果我们设想一个只处理 PDF 文档的工作流程,我们可以使用 Apache PDFBox,这是一个相当成熟且支持良好的库。我们可以使用此库从 PDF 文档中创建、操作和提取内容,包括直接将 PDF 页面呈现为图像并随后调整其大小。

    同样,如果我们只专注于为 DOCX 文件(另一种非常流行的文件类型)生成缩略图,我们可以使用 Apache POI(我在过去的几篇文章中推荐过一个库)。这是一个很棒的库,可以处理各种 Microsoft Office 文档,我们可以将它与图像库结合使用,例如提取、渲染为图像和调整 DOCX 文件第一页的大小。如果我们从 JPG、PNG、GIF 等图像格式生成缩略图,我们可以使用 Java 的内置和 API,这两者都是 Java SE 的一部分。它们是用于图像处理的标准 API,是适用于有限规模工作流的良好解决方案。Apache BatikImageIOBufferedImage

示范

    下面,我们将学习如何利用专门的 Web API,该 API 从各种输入文档类型(包括 PDF、Office 文档和数十种图像格式)生成 PNG 缩略图。我们将能够通过免费的 API 密钥使用此解决方案。

    通过使用 Web API 解决方案,我们会将转换和 PNG 大小调整操作中的内存抽象到外部服务器,并将两个必要的步骤合并到一个操作中,从而减少我们总体上需要的代码量。完成转换后,我们将返回一个包含缩略图的原始 PNG 图像数据的结果。byte[]

    现在,我们将使用 Java 代码示例来构建 API 调用。

首先,我们将客户端添加到我们的 Maven 项目中。我们首先在 :pom.xml

XML 格式

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

然后,我们将在 :pom.xml

XML 格式

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

接下来,我们将导入 API 客户端设置和文档转换所需的类:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ConvertDocumentApi;

    现在,我们将通过设置默认客户端并指定密钥(如果需要,我们可以选择为密钥设置前缀)来使用 API 密钥进行配置:ApiClient

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

    最后,我们将创建一个实例,指定输入文件,并(可选)定义最大尺寸和输入文件扩展名。默认宽度和高度值均为 128 像素,两者的最大值为 2,048 像素:ConvertDocumentApi

ConvertDocumentApi apiInstance = new ConvertDocumentApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
Integer maxWidth = 56; // Integer | Optional; Maximum width of the output thumbnail - final image will be as large as possible while less than or equal to this width. Default is 128.
Integer maxHeight = 56; // Integer | Optional; Maximum height of the output thumbnail - final image will be as large as possible while less than or equal to this width. Default is 128.
String extension = "extension_example"; // String | Optional; Specify the file extension of the inputFile. This will improve the response time in most cases. Also allows unsupported files without extensions to still return a corresponding generic icon.
try {
    byte[] result = apiInstance.convertDocumentAutodetectToThumbnail(inputFile, maxWidth, maxHeight, extension);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertDocumentApi#convertDocumentAutodetectToThumbnail");
    e.printStackTrace();
}

    我们现在可以实现自己的代码,以各种方式处理响应,并且我们可以通过记录错误和堆栈跟踪来诊断任何异常。byte[]

    在本文中,我们讨论了创建缩略图图像背后的想法,并回顾了在文件处理系统中自动生成缩略图的好处。然后,我们介绍了一些在 Java 中创建缩略图的开源选项,随后学习了如何使用专门的 Web API 将该过程整合为一个有效的步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨曦_子画

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值