将 PDF 转换为图像格式

Aspose.PDF for Java 允许您使用两种方法将 PDF 文档转换为图像格式,如 BMP、JPEG、GIF、PNG、EMF、TIFF 和 SVG。转换是使用 Device 和 SaveOption 完成的。

库中有几个类允许您使用虚拟设备转换图像。DocumentDevice 适用于转换整个文档,而 ImageDevice 则针对特定页面。

使用 DocumentDevice 类转换 PDF

Aspose.PDF for Java 可以将 PDF 页面转换为 TIFF 图像。

TiffDevice 类 允许您将 PDF 页面转换为 TIFF 图像。 这个类提供了一个名为 Process 的方法,允许您将 PDF 文件中的所有页面转换为单个 TIFF 图像。

将 PDF 页面转换为单个 TIFF 图像

Aspose.PDF for Java 解释了如何将 PDF 文件中的所有页面转换为单个 TIFF 图像:

  1. 创建一个 Document 类的对象。
  2. 调用 Process 方法来转换文档。
  3. 要设置输出文件的属性,请使用 TiffSettings 类。

下面的代码片段显示了如何将所有 PDF 页面转换为单个 TIFF 图像。

// 打开文档
String documentFileName = Paths.get(DATA_DIR.toString(), "PageToTIFF.pdf").toString();
Document document = new Document(documentFileName);

// 创建 Resolution 对象
Resolution resolution = new Resolution(300);

// 创建 TiffSettings 对象
TiffSettings tiffSettings = new TiffSettings();
tiffSettings.setCompression(CompressionType.None);
tiffSettings.setDepth(ColorDepth.Default);
tiffSettings.setShape(ShapeType.Landscape);
tiffSettings.setSkipBlankPages(false);

// 创建 TIFF 设备
TiffDevice tiffDevice = new TiffDevice(resolution, tiffSettings);

// 转换特定页面并将图像保存到流中
tiffDevice.process(document, DATA_DIR + "AllPagesToTIFF_out.tif");

将单页转换为 TIFF 图像

Aspose.PDF for Java 允许将 PDF 文件中的特定页面转换为 TIFF 图像,使用重载版本的 Process(..) 方法,该方法接受页码作为转换参数。以下代码片段展示了如何将 PDF 的第一页转换为 TIFF 格式。

// 打开文档
String documentFileName = Paths.get(DATA_DIR.toString(), "PageToTIFF.pdf").toString();
String tiffFileName = Paths.get(DATA_DIR.toString(), "PageToTIFF_out.tif").toString();
Document document = new Document(documentFileName);

// 创建 Resolution 对象
Resolution resolution = new Resolution(300);

// 创建 TiffSettings 对象
TiffSettings tiffSettings = new TiffSettings();
tiffSettings.setCompression(CompressionType.None);
tiffSettings.setDepth(ColorDepth.Default);
tiffSettings.setShape(ShapeType.Landscape);

// 创建 TIFF 设备
TiffDevice tiffDevice = new TiffDevice(resolution, tiffSettings);

// 转换特定页面并将图像保存到流中
tiffDevice.process(document, 1, 1, tiffFileName);

在转换过程中使用Bradley算法

Aspose.PDF for Java已经支持使用LZW压缩将PDF转换为TIFF,然后使用AForge可以应用二值化。然而,有一个客户要求对于某些图像,他们需要使用Otsu获取阈值,因此他们还希望使用Bradley。

// 打开文档
String documentFileName = Paths.get(DATA_DIR.toString(), "PageToTIFF.pdf").toString();
Document document = new Document(documentFileName);

String outputImageFileName = Paths.get(DATA_DIR.toString(), "resultant_out.tif").toString();
String outputBinImageFileName = Paths.get(DATA_DIR.toString(), "tiff-bin_out.tif").toString();

java.io.OutputStream outputImageFile = new java.io.FileOutputStream(outputImageFileName);
java.io.OutputStream outputBinImageFile = new java.io.FileOutputStream(outputBinImageFileName);

// 创建Resolution对象
Resolution resolution = new Resolution(300);
// 创建TiffSettings对象
TiffSettings tiffSettings = new TiffSettings();
tiffSettings.setCompression(CompressionType.LZW);
tiffSettings.setDepth(ColorDepth.Format1bpp);

// 创建TIFF设备
TiffDevice tiffDevice = new TiffDevice(resolution, tiffSettings);
// 转换特定页面并将图像保存到流中
tiffDevice.process(document, outputImageFile);
outputImageFile.close();

// 创建流对象以保存输出图像
java.io.InputStream inStream = new java.io.FileInputStream(outputImageFileName);
tiffDevice.binarizeBradley(inStream, outputBinImageFile, 0.1);

将PDF页面转换为像素化的TIFF图像

要将PDF文件中的所有页面转换为像素化的TIFF格式,请使用IndexedConversionType的Pixelated选项

// 将PDF页面转换为像素化的TIFF图像
// 要将PDF文件中的所有页面转换为像素化的TIFF格式,请使用IndexedConversionType的Pixelated选项。

// 打开文档
String documentFileName = Paths.get(DATA_DIR.toString(), "PageToTIFF.pdf").toString();
Document document = new Document(documentFileName);

// 创建流对象以保存输出图像
java.io.OutputStream imageStream = new java.io.FileOutputStream("Image.tiff");

// 创建Resolution对象
com.aspose.pdf.devices.Resolution resolution = new com.aspose.pdf.devices.Resolution(300);

// 实例化TiffSettings对象
com.aspose.pdf.devices.TiffSettings tiffSettings = new com.aspose.pdf.devices.TiffSettings();

// 设置生成的TIFF图像的压缩
tiffSettings.setCompression(com.aspose.pdf.devices.CompressionType.CCITT4);
// 设置生成图像的颜色深度
tiffSettings.setDepth(com.aspose.pdf.devices.ColorDepth.Format4bpp);
// 在将PDF渲染为TIFF时跳过空白页
tiffSettings.setSkipBlankPages(true);
// 设置图像亮度
tiffSettings.setBrightness(.5f);

// 设置IndexedConversion Type,默认值为simple
tiffSettings.setIndexedConversionType(IndexedConversionType.Pixelated);

// 使用特定分辨率创建TiffDevice对象
TiffDevice tiffDevice = new TiffDevice(2480, 3508, resolution, tiffSettings);

// 转换特定页面(第1页)并将图像保存到流中
tiffDevice.process(document, 1, 1, imageStream);

// 关闭流
imageStream.close();

使用 ImageDevice 类转换 PDF

ImageDeviceBmpDeviceJpegDeviceGifDevicePngDeviceEmfDevice 的祖先。

  • BmpDevice 类允许您将 PDF 页面转换为 BMP 图像。

  • EmfDevice 类允许您将 PDF 页面转换为 EMF 图像。

  • JpegDevice 类允许您将 PDF 页面转换为 JPEG 图像。

  • PngDevice 类允许您将 PDF 页面转换为 PNG 图像。

  • GifDevice 类允许您将 PDF 页面转换为 GIF 图像。

让我们看看如何将 PDF 页面转换为图像。

BmpDevice 类提供了一个名为 Process 的方法,允许您将 PDF 文件的特定页面转换为 BMP 图像格式。其他类具有相同的方法。因此,如果我们需要将 PDF 页面转换为图像,我们只需实例化所需的类。

以下代码片段展示了这种可能性:

package com.aspose.pdf.examples.conversion;

import com.aspose.pdf.Document;
import com.aspose.pdf.devices.*;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 将 PDF 转换为图像。
 */
public final class ConvertPDFtoImage {
    private static final Path DATA_DIR = Paths.get("/home/aspose/pdf-examples/Samples");

    private ConvertPDFtoImage() {

    }

    public static void run() throws IOException {
        runConvertPdfUsingImageDevice();
    }

    public static void runConvertPdfUsingImageDevice() throws IOException {
        // 创建分辨率对象
        Resolution resolution = new Resolution(300);
        BmpDevice bmpDevice = new BmpDevice(resolution);
        JpegDevice jpegDevice = new JpegDevice(resolution);
        GifDevice gifDevice = new GifDevice(resolution);
        PngDevice pngDevice = new PngDevice(resolution);
        EmfDevice emfDevice = new EmfDevice(resolution);

        Document document = new Document(DATA_DIR + "ConvertAllPagesToBmp.pdf");

        convertPDFtoImages(bmpDevice, "bmp", document);
        convertPDFtoImages(jpegDevice, "jpeg", document);
        convertPDFtoImages(gifDevice, "gif", document);
        convertPDFtoImages(pngDevice, "png", document);
        convertPDFtoImages(emfDevice, "emf", document);
    }

    public static void convertPDFtoImages(
            ImageDevice imageDevice,
            String ext,
            Document document)
            throws IOException {
        for (int pageCount = 1; pageCount <= document.getPages().size(); pageCount++) {
            java.io.OutputStream imageStream = new java.io.FileOutputStream(
                    DATA_DIR + "image" + pageCount + "_out." + ext);
            // 转换特定页面并将图像保存到流
            imageDevice.process(document.getPages().get_Item(pageCount), imageStream);

            // 关闭流
            imageStream.close();
        }
    }
}

使用 SaveOptions 类转换 PDF

本文的这一部分向您展示如何使用 Java 和 SaveOptions 类将 PDF 转换为 SVG

可扩展矢量图形 (SVG) 是一种基于 XML 的二维矢量图形文件格式的规格家族,包括静态和动态(交互式或动画)的图形。SVG 规范是一个开放标准,自 1999 年以来由万维网联盟 (W3C) 开发。

SVG 图像及其行为在 XML 文本文件中定义。这意味着它们可以被搜索、索引、脚本化,并在需要时进行压缩。作为 XML 文件,SVG 图像可以使用任何文本编辑器创建和编辑,但通常使用诸如 Inkscape 这样的绘图程序来创建它们更为方便。

将 PDF 页面转换为 SVG 图像

Aspose.PDF for Java 支持将 PDF 文件转换为 SVG 格式的功能。 要满足此要求,SvgSaveOptions 类已被引入到 com.aspose.pdf 包中。实例化一个 SvgSaveOptions 对象,并将其作为第二个参数传递给 Document.save(..) 方法。

以下代码片段显示了将 PDF 文件转换为 SVG 格式的步骤。

package com.aspose.pdf.examples.conversion;

import com.aspose.pdf.Document;
import com.aspose.pdf.SvgSaveOptions;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 将 PDF 转换为 SVG。
 */
public class ConvertPDFtoSVG {
    // 文档目录的路径。
    private static final Path DATA_DIR = Paths.get("/home/aspose/pdf-examples/Samples");

    private ConvertPDFtoSVG() {

    }

    public static void run() throws IOException {
        String pdfFileName = Paths.get(DATA_DIR.toString(), "input.pdf").toString();
        String svgFileName = Paths.get(DATA_DIR.toString(), "PDFToSVG_out.svg").toString();

        // 加载 PDF 文档
        Document document = new Document(pdfFileName);

        // 实例化 SvgSaveOptions 对象
        SvgSaveOptions saveOptions = new SvgSaveOptions();

        // 不将 SVG 图像压缩到 Zip 存档
        saveOptions.setCompressOutputToZipArchive(false);

        // 将输出保存到 SVG 文件
        document.save(svgFileName, saveOptions);
        document.close();
    }
}