在构建预览生成器或移动查看器时,程序化地将 OneNote 页面转换为图片文件是常见需求。The Conholdate.Total for Java SDK 使得在 Java 中将 Onenote 转换为图像变得轻松,无需在服务器上安装 Microsoft Office。在本指南中,您将看到完整的线程安全实现、PNGJPEG 输出选项以及内存中处理的技巧。

在 Java 中将 Onenote 转换为图像 - 步骤指南

  1. 初始化转换工作流: 将 OneNote 文件加载到 InputStream 中并创建 Converter 实例——这是在 Java 中将 OneNote 转换为图像的核心工作流。

    InputStream fileStream = new BufferedInputStream(new FileInputStream("sample.one"));
    Converter converter = new Converter(fileStream);
    
  2. 确定需要转换的页数: 从 Converter 检索总页数。

    int pageCount = converter.getPageCount();
    
  3. 为每页配置图像选项: 使用 ImageConvertOptions 设置输出格式、质量以及基于零的页索引。

    ImageConvertOptions options = new ImageConvertOptions();
    options.setFormat(ImageSaveOptions.ImageFormat.PNG);
    options.setQuality(90);
    options.setPageNumber(pageIndex);
    
  4. 并行转换页面:使用 ExecutorService 并发运行转换,将每页写入单独的 PNG 文件。

    ExecutorService executor = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors());
    executor.submit(() -> {
        // conversion logic per page
    });
    
  5. 可选的内存转换:对于需要直接获取图像字节的场景(例如,通过网络发送),将第一页转换为 ByteArrayOutputStream

ImageConvertOptions memOptions = new ImageConvertOptions();
memOptions.setFormat(ImageSaveOptions.ImageFormat.JPEG);
memOptions.setPageNumber(0);
ByteArrayOutputStream memoryStream = new ByteArrayOutputStream();
converter.convert(memoryStream, memOptions);

有关 Converter 类及其方法的更多详细信息,请参阅官方 API 参考

完整的 Java 将 OneNote 转换为图像的示例 - 并行页面处理

以下代码展示了如何在 Java 中使用 Conholdate.Total 将 Onenote 转换为图像的完整实现。

import com.groupdocs.conversion.Converter;
import com.groupdocs.conversion.options.convert.ImageConvertOptions;
import com.groupdocs.conversion.options.convert.ImageSaveOptions;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ConvertOneNoteToImage {
    public static void main(String[] args) {
        String inputPath = "sample.one";
        String outputPattern = "output_page_%d.png";
        int imageQuality = 90; // 0-100

// Thread pool for parallel page conversion
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

try (InputStream fileStream = new BufferedInputStream(new FileInputStream(inputPath));
             Converter converter = new Converter(fileStream)) {

int pageCount = converter.getPageCount();

for (int i = 0; i < pageCount; i++) {
                final int pageIndex = i;
                executor.submit(() -> {
                    ImageConvertOptions options = new ImageConvertOptions();
                    options.setFormat(ImageSaveOptions.ImageFormat.PNG);
                    options.setQuality(imageQuality);
                    options.setPageNumber(pageIndex); // zero‑based page index

String outputPath = String.format(outputPattern, pageIndex + 1);
                    try (OutputStream outStream = new BufferedOutputStream(new FileOutputStream(outputPath))) {
                        converter.convert(outStream, options);
                        System.out.println("Page " + (pageIndex + 1) + " saved to " + outputPath);
                    } catch (Exception e) {
                        System.err.println("Failed to convert page " + (pageIndex + 1) + ": " + e.getMessage());
                    }
                });
            }

// Example of in‑memory conversion for the first page
            ImageConvertOptions memOptions = new ImageConvertOptions();
            memOptions.setFormat(ImageSaveOptions.ImageFormat.JPEG);
            memOptions.setQuality(imageQuality);
            memOptions.setPageNumber(0);
            try (ByteArrayOutputStream memoryStream = new ByteArrayOutputStream()) {
                converter.convert(memoryStream, memOptions);
                byte[] imageBytes = memoryStream.toByteArray();
                System.out.println("In‑memory conversion produced " + imageBytes.length + " bytes for page 1.");
                // imageBytes can now be sent over network, stored in DB, etc.
            } catch (Exception e) {
                System.err.println("In‑memory conversion error: " + e.getMessage());
            }

} catch (IOException e) {
            System.err.println("File access error: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Conversion initialization error: " + e.getMessage());
        } finally {
            executor.shutdown();
            try {
                if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                    executor.shutdownNow();
                }
            } catch (InterruptedException ie) {
                executor.shutdownNow();
                Thread.currentThread().interrupt();
            }
        }
    }
}

Note: 这段代码示例演示了核心功能。在将其用于项目之前,请确保更新文件路径(sample.oneoutput_page_%d.png 等)以匹配实际文件位置,验证所有必需的依赖已正确安装,并在开发环境中彻底测试。如果遇到任何问题,请参阅官方文档或联系支持团队获取帮助。

安装和配置 Conholdate.Total for Java

将 Conholdate Maven 仓库和 SDK 依赖添加到您的 pom.xml 中:

<repositories>
    <repository>
        <id>conholdate-repo</id>
        <name>Conholdate Maven Repository</name>
        <url>https://repository.conholdate.com/repo/</url>
    </repository>
</repositories>

<dependency>
    <groupId>com.conholdate</groupId>
    <artifactId>conholdate-total</artifactId>
    <version>24.9</version>
    <type>pom</type>
</dependency>

下载最新的二进制包,请前往下载页面。SDK 需要 Java 8 或更高版本,并可在任何标准 JVM 上运行。生产环境使用时,请从定价页面获取许可证,并使用临时许可证页面提供的临时密钥进行激活。

结论

通过遵循本指南,您现在已经拥有了使用 Conholdate.Total for Java 在 Java 中将 OneNote 转换为图像的坚实基础。示例演示了逐页 PNG 输出、并行处理以提升速度,以及内存中选项以实现灵活集成。请记得配置 ImageConvertOptions 以匹配所需的图像格式和质量,并按照示例使用 try‑with‑resources 块来处理资源。对于商业项目,请通过定价页面获取适当的许可证,并使用真实的 OneNote 文件测试转换,以确保所有内容正确渲染。SDK 丰富的 API 和文档使得将此解决方案扩展到批处理或基于云的服务变得直截了当。

常见问题

  • 我可以在 Java 中将 Onenote 转换为图像而无需安装 Microsoft Office 吗?
    是的。Conholdate.Total SDK 在内部执行所有渲染,因此服务器上不需要安装 Office。

  • 转换支持哪些图像格式?
    您可以通过设置 ImageSaveOptions.ImageFormat 属性导出为 PNG、JPEG、BMPGIFTIFF

  • 如何提升大型笔记本的性能?
    使用示例中展示的内置线程池,并在仅需要图像字节时优先使用内存转换,避免磁盘 I/O。

  • 我在哪里可以找到更多示例和 API 详细信息?
    官方文档 提供了大量指南,且 API 参考 列出了所有类和方法。

阅读更多