吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3832|回复: 13
收起左侧

[Python 转载] python写个合并pdf的小工具

[复制链接]
Kris_Shin 发表于 2020-11-5 17:55
本帖最后由 Kris_Shin 于 2020-11-5 20:47 编辑

pdf合并工具

最近需要合并大量的pdf, 找了几个工具,要么收费,要么不好用,然后就自己写了简单功能的小工具.
特点就是把当前目录及子目录下的所有pdf文件合并成一个merged.pdf (比如你直接放在D盘根目录会把你D盘里面的所有pdf全部合并成一个, 会很占内存和时间)
除了方便打印我也不知道有什么其他的作用, 反正我就是拿来打印的

已知BUG
1. 某些特殊编码的pdf合并会失败(没找到解决办法), 而且也无法确定是哪一个文件---整个文件保存失败也就是完全无法合并
2. 某些pdf会因为不知道什么原因无法读取xref,无法打开  --- 解决办法 : 使用浏览器或者其他什么可以打开pdf的程序确定程序可以打开, 然后点击打印, 通过虚拟打印机再保存出来, 就可以修复了.

如果你嫌弃他会输出很多警告信息的话可以去pypdf4包的源码中把那些警告输出注释掉, 具体方法就不讲了, 如果有需要可以私信我

本来想直接上传打包后的exe, 大小超了, 只提供天翼网盘连接:https://cloud.189.cn/t/A73QzqmQRjMz (访问码:kpo0)

写的很简单, 高手勿喷

为大佬提供源码:
[Python] 纯文本查看 复制代码
import re
from PyPDF4.pdf import PdfFileReader as pr, PdfFileWriter as pw


def MergePDF(dir_path):
    pdf_files = list()
    merged_file = pw()
    for path, _, files in os.walk(dir_path):
        pdf_files.extend([os.path.join(path, f)
                          for f in files if f.lower().endswith('.pdf')])  # 遍历当前文件夹下所有pdf文件并组合成相对路径

    pdf_files.sort(key=lambda i: int(re.findall(r'(\d+).*?', i)
                                     [0]) if re.findall(r'(\d+).*?', i) else -1)  # 按照路径排序(没有数字的在前面, 有数字的从小到大排序)

    for pdf_file in pdf_files:
        print(pdf_file)
        try:
            pdf = pr(open(pdf_file, "rb"))
        except:
            print(f'{pdf_file}无法解析')
            continue
        if pdf.isEncrypted:
            print(f'{pdf_file} 是加密文件')
            res = input('输入密码(回车键跳过)')
            while res:
                try:
                    pdf.decrypt(res)  # pdf 解密
                    break
                except:
                    print('密码错误')
                res = input('输入密码(回车键跳过)')
            if not res:
                continue
        pageCount = pdf.getNumPages()
        # 分别将page添加到输出output中
        for iPage in range(pageCount):
            merged_file.addPage(pdf.getPage(iPage))
    with open('merged.pdf', "wb") as outputfile:
        # 注意这里的写法和正常的上下文文件写入是相反的
        merged_file.write(outputfile)
    print('Done')
    input()


if __name__ == '__main__':
    # 设置存放多个pdf文件的文件夹
    dir_path = r'.'
    MergePDF(dir_path)

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
j00395 + 1 + 1 谢谢@Thanks!
ys随风飘散 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

FeiyuYip 发表于 2022-1-5 00:01
你好,我正好也写了一个图片合并pdf的工具,有相似的思路,所以发现您代码第12行可能存在不明显的bug。
第12行代码是选择路径+文件名中的第一个数字进行排序,假设有多处数字,第一个数字是相同,后面的数字出现1-10的情况,则他们不能进行排序(大概是1/10/11/2/20/22这样的顺序)
我的思路是将第12行可以这么改动。所有数字合并成一串,再排序。不一定正确,请指正。
[Python] 纯文本查看 复制代码
pdf_files.sort(key=lambda i: int(''.join(re.findall(r'(\d+).*?', i) ))  if re.findall(r'(\d+).*?', i) else -1)
 楼主| Kris_Shin 发表于 2020-11-10 17:43
v.n.lee 发表于 2020-11-9 20:17
我自己写过类似的,但是合并出来的pdf都是堆叠的,源文件多大合并后就多大,目前合并pdf就Adobe Acrobat合 ...

是这样  但是没有办法啊  拿钱换存储空间

如果是经常用到那肯定是acrobat好用  但是就偶尔用一下就没必要了啊  毕竟这个软件也不便宜
枫叶荻花 发表于 2020-11-5 18:07
中国好媳妇 发表于 2020-11-5 18:07
厉害厉害,小白感谢
ys随风飘散 发表于 2020-11-5 19:01
感谢   虽然不怎么用PDF
j00395 发表于 2020-11-5 19:27
挺实用的,谢谢
ciker_li 发表于 2020-11-5 19:58
感谢分享
江南水煮鱼 发表于 2020-11-5 20:01
感谢!! 很有用
qdfxy 发表于 2020-11-5 20:16
好用  好用   收藏了
 楼主| Kris_Shin 发表于 2020-11-5 20:16

32位的可能需要自己打包
hshcompass 发表于 2020-11-6 08:04
谢谢分享。
小白看不大懂。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表