【PDF处理】java将全图片的pdf压缩,输出新的pdf

该博客介绍了一个使用iText7库压缩PDF文件的方法,通过调整图片的压缩因子实现文件瘦身。同时,它将PDF中的图片转换为黑白,以进一步减小文件大小。代码示例详细展示了如何读取PDF、遍历页面、处理图片并保存结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要的maven依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>io</artifactId>
    <version>7.2.1</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>kernel</artifactId>
    <version>7.2.1</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.2.1</version>
</dependency>

或者直接导入核心包

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.1</version>
    <type>pom</type>
</dependency>

导入的包

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import com.itextpdf.layout.element.Image;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URISyntaxException;
 /**
     * @param srcDir    源 文件/文件夹
     * @param targetDir 目标文件夹
     * @param factor    压缩因子 取值0-1
     * @throws IOException
     */
    protected static void compress(String srcDir, String targetDir, float factor) throws IOException {
        System.out.println("处理进度: ");
        PdfCompress pdfCompress = new PdfCompress();
        File file = new File(srcDir);
        if (file.isFile()) {
            file.createNewFile();
            System.out.println("----------");
            System.out.println("源文件地址:" + file.getPath());
            pdfCompress.manipulatePdf(targetDir, srcDir, factor);
        } else {
            file.mkdirs();
            System.out.println("源文件夹地址:" + file.getPath());
            File[] files = file.listFiles(new FileNameFilter());
            int total = files.length;
            for (int i = 0; i < files.length; i++) {
                System.out.println("----------");
                System.out.println(file.getPath());
                pdfCompress.manipulatePdf(targetDir, files[i].getPath(), factor);
            }
        }
    }

文件名规则

private String createSrcFileName(String target, String src) {
        return target + File.separator + new File(src).getName();
    }

压缩

protected void manipulatePdf(String target, String src, float factor) throws IOException {
        String targetUrl = this.createSrcFileName(target, src);
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(targetUrl));
        int pages = pdfDoc.getNumberOfPages();
        System.out.println("共计" + pages + "页");
        for (int i = 0; i < pages; i++) {
            PdfPage page = pdfDoc.getPage(i + 1);
            PdfDictionary pageDict = page.getPdfObject();
            PdfDictionary resources = pageDict.getAsDictionary(PdfName.Resources);
            PdfDictionary xObjects = resources.getAsDictionary(PdfName.XObject);
            PdfName imgRef = xObjects.keySet().iterator().next();
            PdfStream stream = xObjects.getAsStream(imgRef);
            Image img = convertToBlackAndWhite(new PdfImageXObject(stream), factor);

            xObjects.put(imgRef, img.getXObject().getPdfObject());
            System.out.println("第" + (i + 1) + "页完成******");
        }

        pdfDoc.close();
    }

图片压缩处理

private static Image convertToBlackAndWhite(PdfImageXObject image, float factor) throws IOException {
        BufferedImage bi = image.getBufferedImage();
        int width = (int) (bi.getWidth() * factor);
        int height = (int) (bi.getHeight() * factor);
        BufferedImage newBi = new BufferedImage(width, height, image.getBufferedImage().getType());
        AffineTransform at = AffineTransform.getScaleInstance(factor, factor);
        Graphics2D g = newBi.createGraphics();
        g.drawRenderedImage(bi, at);
        ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(newBi, image.identifyImageType().name(), baos);
        return new Image(ImageDataFactory.create(baos.toByteArray()));
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qlanto

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

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

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

打赏作者

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

抵扣说明:

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

余额充值