Java将彩色PDF转为灰度

本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即:将PDF文档里面的彩色图片或者文字等通过调用PdfGrayConverter.toGrayPdf()方法转为文档页面为灰色调、无彩色效果的文档,可实现缩小文档大小的目的。下面的程序运行环境及代码示例。

本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即:将PDF文档里面的彩色图片或者文字等通过调用PdfGrayConverter.toGrayPdf()方法转为文档页面为灰色调、无彩色效果的文档,可实现缩小文档大小的目的。下面是程序运行环境及代码示例。

配置程序环境

关于如何引入jar文件:

1.通过Maven仓库下载,如下配置Pom.xml:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
            <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
<dependencies>
    <dependency>
        <groupId> e-iceblue </groupId>
        <artifactId>spire.pdf</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>

2.手动添加jar

下载jar包到本地,然后解压,找到lib文件夹下的Spire.Pdf.jar。然后在IDEA中打开如下界面,将本地路径下的jar文件添加至Java程序。

转彩色PDF为灰度

这里转换只需用到以下两个步骤:

使用 PdfGrayConverter类加载PDF文件。

调用 PdfGrayConverter.toGrayPdf() 方法将 PDF 转换为灰度。

Java

import com.spire.pdf.conversion.*;

public class ToGrayPDF {
    public static void main(String[] args) {
        //创建一个PdfGrayConverter实例并加载PDF文档
        PdfGrayConverter converter = new PdfGrayConverter("Booklet.pdf");

        //将彩色PDF转换为灰度
        converter.toGrayPdf("ToGray.pdf");
        converter.dispose();
    }
}

转换结果:

★推荐阅读: C# 将彩色PDF转为灰度

—END— 

要将彩色 PDF 转换灰度矢量 PDF,可以使用 Apache PDFBox 库进行处理。以下是一个示例代码: ```java import org.apache.pdfboxdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray; import org.apache.pdfbox.pdmodel.graphics.image.PDImage; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDInlineImage; import org.apache.pdfbox.pdmodel.graphics.image.PDInlineImageCreator; import org.apache.pdfbox.pdmodel.graphics.image.PDInlineImageCreatorFromImage; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ColorToGrayscalePDFConverter { public static void main(String[] args) { try { // 加载彩色 PDF 文档 PDDocument document = PDDocument.load(new File("input.pdf")); // 创建一个 PDFRenderer 对象 PDFRenderer pdfRenderer = new PDFRenderer(document); // 遍历每一页,将彩色图像转换灰度图像并替换原图像 for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) { PDPage page = document.getPage(pageIndex); // 渲染当前页为图像 BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300, ImageType.RGB); // 将图像转换灰度 BufferedImage grayscaleImage = convertToGrayscale(image); // 创建灰度图像对象 PDImageXObject grayscaleImageXObject = createImageXObject(document, grayscaleImage); // 替换原图像为灰度图像 replaceImage(page, grayscaleImageXObject); } // 保存灰度矢量 PDF document.save("output.pdf"); // 关闭文档 document.close(); } catch (Exception e) { e.printStackTrace(); } } private static BufferedImage convertToGrayscale(BufferedImage colorImage) { BufferedImage grayscaleImage = new BufferedImage(colorImage.getWidth(), colorImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY); grayscaleImage.getGraphics().drawImage(colorImage, 0, 0, null); return grayscaleImage; } private static PDImageXObject createImageXObject(PDDocument document, BufferedImage image) throws Exception { PDColorSpace colorSpace = PDDeviceGray.INSTANCE; PDImageXObject imageXObject; if (image.getType() == BufferedImage.TYPE_BYTE_GRAY) { imageXObject = LosslessFactory.createFromImage(document, image); } else { PDImage pdImage = LosslessFactory.createFromImage(document, image); PDImageXObject pdImageXObject = new PDImageXObject(pdImage, null); PDInlineImageCreator creator = new PDInlineImageCreatorFromImage(colorSpace, pdImageXObject); PDInlineImage inlineImage = creator.createInlineImage(); imageXObject = inlineImage.createXObject(document); } return imageXObject; } private static void replaceImage(PDPage page, PDImageXObject grayscaleImageXObject) throws Exception { for (PDStream contentStream : page.getContentStreams()) { contentStream.getTokens().forEach(token -> { if (token instanceof PDImageXObject) { PDImageXObject imageXObject = (PDImageXObject) token; if (!imageXObject.getCOSObject().equals(grayscaleImageXObject.getCOSObject())) { imageXObject.getCOSObject().setItem("Subtype", grayscaleImageXObject.getCOSObject().getItem("Subtype")); imageXObject.getCOSObject().setItem("Width", grayscaleImageXObject.getCOSObject().getItem("Width")); imageXObject.getCOSObject().setItem("Height", grayscaleImageXObject.getCOSObject().getItem("Height")); imageXObject.getCOSObject().setItem("ColorSpace", grayscaleImageXObject.getCOSObject().getItem("ColorSpace")); imageXObject.getCOSObject().setItem("BitsPerComponent", grayscaleImageXObject.getCOSObject().getItem("BitsPerComponent")); imageXObject.getCOSObject().setItem("Filter", grayscaleImageXObject.getCOSObject().getItem("Filter")); imageXObject.setSoftMask(null); } } }); } } } ``` 请确保您已在项目中添加了 Apache PDFBox 的依赖。这个示例代码将加载名为 "input.pdf" 的彩色 PDF 文件,将每一页的图像转换灰度图像,并替换原始的彩色图像为灰度图像。最后,它保存为名为 "output.pdf" 的灰度矢量 PDF 文件。 请注意,此代码仅处理单页的彩色 PDF。如果您的 PDF 包含多个页面,您可以根据需求进行循环处理。 希望这可以帮助到您!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值