搞定 PDF“膨胀”难题:Python + Java 的超实用压缩秘籍

搞定 PDF"膨胀"难题:Python + Java 的超实用压缩秘籍

哈喽小伙伴们!今天想和大家唠唠 PDF 文件压缩那些事儿,这可是办公族的常遇到的"头疼事"。就拿我上次帮朋友处理合同文件来说吧,一份超长超高清的合同 PDF,动辄几百兆,发邮件老是提示附件太大,存到云盘也占地方得心疼。我琢磨着,要是能把这 PDF"瘦身"一下,那该多好呀!

为啥要用 Python + Java 来搞定 PDF 压缩?

先和大家说说,为啥不单独用 Python 或 Java 呢?其实吧,光靠 Python 现有的压缩包,效果真心不太理想,压缩后的文件还是有点"胖"。而 Java 里有个叫 spire.pdf.free 的库,压缩 PDF 那叫一个厉害,能把图像啥的压缩得恰到好处。可它也有个小缺点,就是处理 PDF 超过 10 页就有点"吃力"(需要收费)。所以呀,我琢磨着先把 PDF 拆开,再用 Java 压缩,最后再把它们合起来,这就引出了我们今天的"三步走"策略啦!

第一步:用 Python 给 PDF"分家"

这第一步,就是把一个大 PDF 文件拆成几个小块儿。我选了 Python 的 PyPDF2 库,这玩意儿操作 PDF 简单又方便。下面就是代码啦:

python 复制代码
import os
from PyPDF2 import PdfReader, PdfWriter

def split_pdf(input_pdf_path, output_folder, pages_per_split=10):
    # 打开输入的 PDF 文件
    with open(input_pdf_path, 'rb') as file:
        reader = PdfReader(file)
        num_pages = len(reader.pages)
        split_count = 0

        for i in range(0, num_pages, pages_per_split):
            writer = PdfWriter()
            end = min(i + pages_per_split, num_pages)

            # 将页面添加到新的 PDF 写入器中
            for page_num in range(i, end):
                writer.add_page(reader.pages[page_num])

            # 生成输出文件路径
            output_filename = os.path.join(output_folder, f'split_{split_count}.pdf')
            split_count += 1

            # 保存拆分后的 PDF 文件
            with open(output_filename, 'wb') as output_file:
                writer.write(output_file)

if __name__ == "__main__":
    # 替换为你的输入 PDF 文件路径
    input_pdf = r'C:\Users\bugMaker\Desktop\untitled\input.pdf'
    # 替换为你想要保存拆分后文件的文件夹路径
    output_folder = r'C:\Users\bugMaker\Desktop\pdf'

    # 创建输出文件夹(如果不存在)
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    split_pdf(input_pdf, output_folder)

这段代码呢,就是把 PDF 按照每 10 页一组拆开,放到指定的文件夹里。你要是觉得 10 页不合适,改改 pages_per_split 这个参数就行啦!是不是超简单?就像给文件做了一次"分工",把大任务变成小任务,方便后面处理。

第二步:让 Java 给 PDF"瘦身"

拆完之后,就轮到 Java 出场啦!我用的是 spire.pdf.free 库,它对 PDF 里的图像啥的压缩效果超棒。看代码:

java 复制代码
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>5.1.0</version>
</dependency>
java 复制代码
package org.example;

import com.spire.pdf.PdfCompressionLevel;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.exporting.PdfImageInfo;
import com.spire.pdf.graphics.PdfBitmap;

public class CompressPDFImage {
    public static void main(String[] args) {
        // 创建 PdfDocument 类的对象
        PdfDocument doc = new PdfDocument();
        // 加载 PDF 文档
        doc.loadFromFile("C:\\Users\\bugMaker\\Desktop\\untitled1\\input.pdf");
        // 将增量更新设置为false
        doc.getFileInfo().setIncrementalUpdate(false);
        // 将压缩级别设置为最佳
        doc.setCompressionLevel(PdfCompressionLevel.Best);
        // 循环遍历文档中的页面
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            // 获取特定页面
            PdfPageBase page = doc.getPages().get(i);
            // 获取每个页面的图像信息集合
            PdfImageInfo[] images = page.getImagesInfo();
            // 遍历集合中的项目
            if (images != null && images.length > 0)
                for (int j = 0; j < images.length; j++) {
                    // 获取指定图像
                    PdfImageInfo image = images[j];
                    PdfBitmap bp = new PdfBitmap(image.getImage());
                    // 设置压缩质量,数字越小,压缩越彻底,但是小心颜色失真哦,太小的话,会使图片灰度化
                    bp.setQuality(8);
                    // 用压缩后的图片替换原始图片
                    page.replaceImage(j, bp);
                }
        }
        // 保存文件
        doc.saveToFile("output.pdf");
        doc.close();
    }
}

这段代码呢,就是把拆开的 PDF 文件里的图像质量调低一点(当然也不会太低,保证能看清),然后把压缩后的图像换上去,这样 PDF 就能"瘦身"啦!是不是很神奇?就像给文件做了个"减肥操",把不必要"脂肪"都减掉啦!

第三步:用 Python 把 PDF 合体

最后一步,就是把压缩后的 PDF 小块儿再合起来。还是用 Python 的 PyPDF2 库,方便快捷。看代码:

python 复制代码
from PyPDF2 import PdfReader, PdfWriter
import os

def merge_pdfs(input_folder, output_file):
    pdf_writer = PdfWriter()

    # 获取文件夹中所有的 PDF 文件并按名称排序
    pdf_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.pdf')]
    pdf_files.sort()

    for pdf_file in pdf_files:
        pdf_path = os.path.join(input_folder, pdf_file)
        pdf_reader = PdfReader(pdf_path)
        for page in pdf_reader.pages:
            pdf_writer.add_page(page)

    with open(output_file, 'wb') as out:
        pdf_writer.write(out)

if __name__ == "__main__":
    # 修改这里的路径为包含要合并的 PDF 文件的文件夹路径
    input_folder = r'C:\Users\bugMaker\Desktop\新建文件夹' 
    # 修改这里的路径为合并后的输出文件路径
    output_file = r'合并后的输出文件路径.pdf'
    merge_pdfs(input_folder, output_file)

这段代码就是把拆开的 PDF 按顺序合到一起,生成一个新的 PDF 文件。就像把拆开的乐高积木再拼成一个完整的玩具,最后就得到一个"瘦身"成功又完整的 PDF 啦!

总结一下这个超实用套路

用 Python 把 PDF 拆开,再用 Java 给它"瘦身",最后再用 Python 把它合起来,这个方法是不是很绝?以后要是再遇到 PDF 文件太大这种烦心事,就可以用这个套路轻松解决啦!而且呢,这个方法也可以根据自己的需要调整,比如在 Java 压缩的时候,把图像质量调高一点或者调低一点,或者在 Python 拆分的时候,把页数改改,这样就能灵活应对各种情况啦!是不是感觉办公技能又提升啦?赶紧试试吧!

相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
舒一笑1 小时前
我的开源项目-PandaCoder迎来史诗级大更新啦
后端·程序员·intellij idea
@昵称不存在3 小时前
Flask input 和datalist结合
后端·python·flask
zhuyasen3 小时前
Go 分布式任务和定时任务太难?sasynq 让异步任务从未如此简单
后端·go
东林牧之3 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
AntBlack4 小时前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉
Pomelo_刘金5 小时前
Clean Architecture 整洁架构:借一只闹钟讲明白「整洁架构」的来龙去脉
后端·架构·rust
双力臂4045 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
midsummer_woo6 小时前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端