将文档转换为图像(使用 GroupDocs.Watermark Java)

生成多页文档的轻量级图像预览是门户、内容管理系统和云存储服务的常见需求。通过 convert document to image,您可以为最终用户提供快速的视觉提示,而无需加载完整文件。GroupDocs.Watermark Java 库不仅可以添加水印,还提供高性能的预览引擎,能够 java generate thumbnails 在一次遍历中为每页生成缩略图。

在本教程中,您将学习如何设置库、创建自定义页面流、安全释放资源,最终为源文档的每一页生成图像预览。说明面向熟悉 Java 和面向对象概念的开发者,并包含处理大批量文件的最佳实践提示。

快速答案

  • What is the first step? 添加 GroupDocs.Watermark Maven 依赖并使用源文件路径初始化 Watermarker。
  • How are preview images created? 实现 ICreatePageStream 为每页打开输出流,然后使用适当的选项调用 generatePreview()。
  • Do I need a license? 试用版可用于基本场景,但完整许可证可去除水印并解锁批处理功能。
  • Can I process PDFs larger than 200 pages? 可以——库采用流式处理页面,即使是 500 页文件也能保持低内存使用。
  • What image formats are supported? PNG、JPEG、BMP 和 TIFF 开箱即用。

什么是 convert document to image?

convert document to image 描述了将源文件(PDF、DOCX、PPTX 等)的每一页渲染为栅格图像(如 PNG 或 JPEG)的过程。此转换对于缩略图画廊、预览窗格和移动友好型文档查看器非常有用。

为什么使用 GroupDocs.Watermark 进行预览生成?

GroupDocs.Watermark 支持 30+ 输入格式,并可为多达 500 页 的文档生成预览,而无需将整个文件加载到内存中。内部采用顺序处理页面的方式,使 Java 堆使用量即使在大型 PDF 下也保持在 50 MB 以下。库还提供内置图像优化,您可以指定 DPI、颜色深度和压缩级别,生成的缩略图通常比普通栅格化小 70 %。

前置条件

在开始之前,请确保具备以下条件:

  • Java Development Kit (JDK) 11 或更高 – 库编译于 Java 8+,但 JDK 11 提供长期支持和更佳性能。
  • Maven 3.6+ – 用于依赖管理。
  • GroupDocs.Watermark for Java 版本 24.11 – 撰写本文时的最新稳定版。
  • 基本的 Java I/O 流知识 – 您将为每个预览页面创建 FileOutputStream 对象。
  • 许可证密钥(生产环境可选) – 试用版将预览大小限制为每个文档 5 MB。

如何为 Java 设置 GroupDocs.Watermark

要设置 GroupDocs.Watermark,首先添加 Maven 仓库,然后在项目的 pom.xml 中将库作为依赖引入。这确保 Maven 能下载正确的构件,并使类在编译和运行时可用。

添加 Maven 依赖

库通过 Maven Central 分发。将以下代码片段添加到 pom.xml 的 <dependencies> 块中:

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-watermark</artifactId>
    <version>24.11</version>
</dependency>

Pro tip: 将版本号保存在属性 (<groupdocs.watermark.version>24.11</groupdocs.watermark.version>) 中,便于后续升级。

直接下载(替代方案)

如果您更喜欢手动安装,可以从官方发布页面下载 JAR: GroupDocs.Watermark for Java releases。

如何获取并应用许可证

将许可证应用于 GroupDocs.Watermark 可去除试用限制并禁用默认的水印覆盖。将许可证文件放在已知位置并让 API 指向它,或在任何其他调用之前在代码中直接嵌入许可证路径。加载后,所有后续操作均以完整功能模式运行。

您可以:

  • Request a free trial 从 GroupDocs 门户获取——提供 30 天的许可证文件。
  • Generate a temporary licence 通过在线许可证生成器获取评估环境的临时许可证。
  • Purchase a commercial licence 用于无限制的生产使用并获得优先支持。

将许可证文件 (GroupDocs.Watermark.lic) 放在项目根目录,或使用 Watermarker.setLicense("path/to/license.file") 以编程方式指定其路径。

如何初始化 Watermarker

通过提供源文档路径来初始化 Watermarker,如有受保护文件可选地提供密码。构造函数会验证格式并准备内部解析器,使您能够立即调用预览或水印方法。创建后,保留实例引用以便在需要时重复使用。

Watermarker 类是 GroupDocs.Watermark 的核心对象,负责加载文档并公开诸如水印插入和预览生成等操作。

Watermarker watermarker = new Watermarker("YOUR_DOCUMENT_DIRECTORY/diagram.vdx");
  • inputDocumentPath – 指向源文件的绝对或相对路径。
  • 构造函数会验证文件格式并准备内部解析器。

Definition anchor: Watermarker 是 GroupDocs.Watermark for Java 中所有文档处理操作的入口点。

如何创建用于预览生成的页面流

通过实现 ICreatePageStream 接口来创建自定义页面流,库在渲染每页时会调用该接口。您的实现应生成一个新的 OutputStream(通常是 FileOutputStream),指向基于页码唯一命名的文件。此方式可将每页的输出隔离,防止数据重叠。

要 java generate thumbnails,必须为每个将写入渲染图像的页面提供流。实现 ICreatePageStream 接口;库会在处理每页时调用您的实现。

public class FeatureCreatePageStream implements ICreatePageStream {
    private final String outputDir;
    private final String fileNameTemplate; // e.g. "preview_page_{0}.png"

    public FeatureCreatePageStream(String outputDir, String fileNameTemplate) {
        this.outputDir = outputDir;
        this.fileNameTemplate = fileNameTemplate;
    }

    @Override
    public OutputStream createPageStream(int pageNumber) throws IOException {
        String fileName = fileNameTemplate.replace("{0}", String.valueOf(pageNumber));
        return new FileOutputStream(Paths.get(outputDir, fileName).toFile());
    }
}
  • fileNameTemplate 允许您将页码直接嵌入文件名,便于批量处理。
  • 该方法为每页返回一个新的 OutputStream,确保前一页不会干扰后续写入。

Definition anchor: ICreatePageStream 是一个回调接口,允许您定义如何为每个预览页面创建输出流。

如何在预览生成后释放页面流

页面图像写入完成后,库会调用 IReleasePageStream,让您关闭并清理关联的输出流。实现此回调以安全释放文件句柄、刷新缓冲区并执行额外日志记录。正确的清理可避免描述符泄漏,并确保后续页面能够顺利处理。

适当的资源清理可防止文件句柄泄漏并避免 JVM 耗尽描述符。实现 IReleasePageStream 以在库指示页面完成后关闭流。

public class FeatureReleasePageStream implements IReleasePageStream {
    @Override
    public void releasePageStream(OutputStream stream) throws IOException {
        stream.close();
    }
}

Definition anchor: IReleasePageStream 是一个回调接口,允许您为页面特定的输出资源定义自定义释放逻辑。

如何生成文档预览(convert document to image)

通过在 Watermarker 实例上调用 generatePreview(),并提供定义分辨率、图像格式和页码范围的 PreviewOptions 对象来生成预览。该方法遍历每页,使用您提供的流创建器写入栅格图像,然后释放流。此过程会生成一组表示文档各页的图像文件。

准备好 Watermarker、FeatureCreatePageStream 和 FeatureReleasePageStream 后,即可调用预览引擎。generatePreview() 方法遍历每页,调用您的流创建器,写入图像,最后释放流。

Watermarker watermarker = new Watermarker("YOUR_DOCUMENT_DIRECTORY/diagram.vdx");
ICreatePageStream createPageStream = new FeatureCreatePageStream("output/previews", "preview_page_{0}.png");
IReleasePageStream releasePageStream = new FeatureReleasePageStream();

PreviewOptions previewOptions = new PreviewOptions();
previewOptions.setResolution(150); // DPI, higher = sharper but larger files
previewOptions.setImageFormat(ImageFormat.Png); // PNG is lossless and web‑friendly

watermarker.generatePreview(previewOptions, createPageStream, releasePageStream);
  • Resolution 控制 DPI;150 DPI 对网页缩略图来说是一个不错的平衡。
  • ImageFormat 可选 PNG、JPEG、BMP 或 TIFF,取决于下游需求。
  • 方法顺序处理页面,即使是数百页的文档也能保持低内存消耗。

Definition anchor: generatePreview() 是将已加载文档的每页渲染为图像的 API 调用,使用您提供的流进行输出。

convert document to image 的实际应用

生成图像预览可带来多种可能:

  1. 文档浏览器 – 显示 PNG 缩略图网格,用户无需打开即可快速浏览大型 PDF。
  2. 搜索结果片段 – 为搜索索引条目附加预览图像,提升 UI 丰富度。
  3. 电子邮件附件 – 在邮件正文中嵌入 PDF 附件的小预览图。
  4. 移动应用 – 通过发送 200 KB PNG 预览代替完整 PDF,降低带宽消耗。
  5. 合规门户 – 将法律要求的带水印合同渲染为图像,以便审计追踪。

在 java generate thumbnails 时的性能考虑

在进行批量处理时,请牢记以下优化技巧:

  • 流缓冲 – 将 FileOutputStream 包装在 BufferedOutputStream 中,以减少磁盘 I/O。
  • 并行批处理 – 使用 Java 的 ForkJoinPool 并发处理多个文档;每个任务应创建独立的 Watermarker 实例,以避免线程安全问题。
  • 限制缩略图 DPI – 72–150 DPI 已足够大多数 UI 场景;更高 DPI 仅用于打印级预览。
  • 复用许可证对象 – 在 JVM 启动时加载一次许可证文件,可降低后续开销。
  • 监控内存 – 库仅在内存中保留当前页面。对于极大文件,可适度提升 JVM 堆(如 -Xmx512m)以应对偶发峰值。

常见陷阱及避免方法

症状可能原因解决办法
OutOfMemoryError during preview generation使用 ImageFormat.Jpeg 并在 1000 页 PDF 上设置 300 DPI降低 DPI 或改用颜色深度更低的 PNG
Empty preview filesFeatureCreatePageStream 为每页返回相同的 FileOutputStream确保为每个 pageNumber 创建新的流
Preview images are rotated源 PDF 包含未被遵守的旋转元数据调用 previewOptions.setRotatePages(true)(如可用)
License warning appears未找到许可证文件或路径不正确确认 Watermarker.setLicense("path/to/license.file") 在任何其他 API 调用之前执行

常见问题

Q: 能为受密码保护的 PDF 生成预览吗?
A: 可以。将密码传递给 Watermarker 构造函数:new Watermarker("file.pdf", "password")。

Q: 预览输出支持哪些图像格式?
A: 支持 PNG、JPEG、BMP 和 TIFF。推荐使用 PNG 以获得无损缩略图。

Q: 单次调用最多能处理多少页?
A: 库没有硬性限制;您可以预览包含数千页的文档,仅受存储空间和 I/O 吞吐量限制。

Q: 每个服务器实例是否需要单独的许可证?
A: 单个许可证文件可在多个实例间复用,只要总使用量符合许可证条款。

Q: 是否可以生成单张合并缩略图(例如仅首页)?
A: 可以。设置 previewOptions.setPages(new int[]{1}) 即可限制仅生成第一页的预览。

结论

您现在已经掌握了使用 GroupDocs.Watermark 完成 convert document to image 与 java generate thumbnails 的完整生产级工作流。通过配置自定义页面流处理器,保持低内存占用;通过调节 PreviewOptions,控制图像质量和文件大小。这些技术让您能够在任何基于 Java 的应用中嵌入快速、高质量的预览——无论是 Web 门户、桌面客户端还是云原生微服务。


Last Updated: 2026-09-26
Tested With: GroupDocs.Watermark 24.11 for Java
Author: GroupDocs

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/watermark/java/</url>
   </repository>
</repositories>

<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-watermark</artifactId>
      <version>24.11</version>
   </dependency>
</dependencies>
import com.groupdocs.watermark.Watermarker;

public class FeatureInitializeWatermarker {
    public static void main(String[] args) {
        String inputDocumentPath = "YOUR_DOCUMENT_DIRECTORY/diagram.vdx";
        
        // Initialize Watermarker with the specified document
        Watermarker watermarker = new Watermarker(inputDocumentPath);
        
        System.out.println("Watermarker initialized.");
    }
}
import java.io.FileOutputStream;
import com.groupdocs.watermark.options.ICreatePageStream;
import java.io.OutputStream;

public class FeatureCreatePageStream implements ICreatePageStream {
    private final String fileNameTemplate;

    public FeatureCreatePageStream(String outputDirectory) {
        this.fileNameTemplate = outputDirectory + "/page%s.png";
    }

    @Override
    public OutputStream createPageStream(int pageNumber) {
        String fileName = String.format(this.fileNameTemplate, pageNumber);
        try {
            return new FileOutputStream(fileName);
        } catch (Exception ex) 
        {
            throw new RuntimeException(ex);
        }
    }
}
import com.groupdocs.watermark.options.IReleasePageStream;
import java.io.OutputStream;

public class FeatureReleasePageStream implements IReleasePageStream {
    @Override
    public void releasePageStream(int pageNumber, OutputStream pageStream) {
        try 
        {
            pageStream.close();
        } catch (Exception ex)
        {
            throw new RuntimeException(ex);
        }
    }
}
import com.groupdocs.watermark.Watermarker;
import com.groupdocs.watermark.options.PreviewOptions;

public class FeatureGenerateDocumentPreview {
    public static void main(String[] args) {
        String inputDocumentPath = "YOUR_DOCUMENT_DIRECTORY/diagram.vdx";
        
        Watermarker watermarker = new Watermarker(inputDocumentPath);
        
        FeatureCreatePageStream createPageStream = new FeatureCreatePageStream("YOUR_OUTPUT_DIRECTORY");
        FeatureReleasePageStream releasePageStream = new FeatureReleasePageStream();
        
        PreviewOptions previewOptions = new PreviewOptions(createPageStream, releasePageStream);
        
        watermarker.generatePreview(previewOptions);
        
        watermarker.close();
    }
}

相关教程