鉴于有人回复说合成的PDF打开报错,我测试了下都是不正确的使用导致的。于是我更新了下代码并附上新版下载地址。
 复制代码 隐藏代码
import osimport ntpathimport sysimport PyPDF2class File:    def __init__(self, path: str):        if not ntpath.exists(path):
            print('文件不存在')
            raise FileNotFoundError
        self.abspath = ntpath.abspath(path)
        self.filetype = ntpath.splitext(self.abspath)[1]
        self.filename = ntpath.splitext(ntpath.basename(self.abspath))[0]
        self.dirpath = ntpath.dirname(self.abspath) + '\\'def merge(file1, file2):    a = File(file1)
    b = File(file2)
    if a.filetype != '.pdf' or b.filetype != '.pdf':
        print('文件类型错误')
        os.system('pause')
        exit(1)
    f1 = open(a.abspath, 'rb')
    f2 = open(b.abspath, 'rb')
    reader1 = PyPDF2.PdfFileReader(f1)
    reader2 = PyPDF2.PdfFileReader(f2)
    writer = PyPDF2.PdfFileWriter()
    if reader1.numPages != reader2.numPages:
        print('页数不相等')
        os.system('pause')
        exit(2)
    for i in range(reader1.numPages):
        writer.addPage(reader1.getPage(i))
        writer.addPage(reader2.getPage(-(i + 1)))
    newf = open(a.dirpath + a.filename + '+' + b.filename + '.pdf', "wb")
    writer.write(newf)
    f1.close()
    f2.close()
    newf.close()def print_help():    help_str = '''
    帮助:
    把要合并的文件选中拖到软件图标上打开即可。
    软件用途:适用于 单面扫描仪 扫描 双面文件 产生的 两个PDF文件 的合并。
    详细帮助:
    假设,文件为3页的双面文件,使用单面扫描仪扫描出来的两个PDF文件分别为A.PDF和B.PDF。
    其中A文件中的页数为1、3、5。B文件中的页数为6、4、2.
    把A、B两个文件同时选中,拖动到本程序图标上即可,显示“用正反面扫描合并打开”时松开鼠标。
    '''    print(help_str)
    os.system('pause')def main():    args: list = sys.argv[1:]
    i = len(args)
    if i >= 2 and i % 2 == 0:
        args.sort()
        for j in range(0, i, 2):
            merge(args[j], args[j + 1])
    else:
        print_help()
    exit(0)if __name__ == '__main__':
    main()上次有一份很多页的正反面文件需要扫描,但是公司打印机只支持单面扫描,所以就自己研究了这个小工具。
假设一个文件有3张纸6页,A1 A2 B1 B2 C1 C2
使用打印机单面进纸器扫描正面,第一个文件包含页数分别为A1 B1 C1
然后把文件反过来扫描背面,此时文档顺序是反的。所以第二个文件包含的页数为 C2 B2 A2
用python处理PDF实现合并。
 复制代码 隐藏代码
import PyPDF2
fileName1 = "f1.pdf"fileName2 = "f2.pdf"newFileName = "new.pdf"with open(fileName1, 'rb') as f1, open(fileName2, 'rb') as f2, open(newFileName, "wb") as newf:
    reader1 = PyPDF2.PdfFileReader(f1)
    reader2 = PyPDF2.PdfFileReader(f2)
    writer = PyPDF2.PdfFileWriter()
    if reader1.numPages != reader2.numPages:
        print('页数不相等')
        exit(1)
    for i in range(reader1.numPages):
        writer.addPage(reader1.getPage(i))
        writer.addPage(reader2.getPage(-(i + 1)))
    writer.write(newf)今天有个同事有十几份正反面文件要扫描,为了降低使用门槛,我更新了代码并且用pyinstaller进行了封装
 复制代码 隐藏代码
import osimport ntpathimport sysimport PyPDF2def merge(file1, file2):    if not (file1.endswith(".pdf") and file2.endswith(".pdf")):
        print('文件类型错误')
        raise FileExistsError
    if not (ntpath.exists(file1) and ntpath.exists(file2)):
        print('文件不存在')
        raise FileNotFoundError
    with open(file1, 'rb') as f1, \
            open(file2, 'rb') as f2, \
            open(ntpath.dirname(file1) + "\\" + ntpath.splitext(ntpath.basename(file1))[0] + "+" + ntpath.splitext(
                ntpath.basename(file2))[0] + ".pdf",
                 "wb") as newf:
        reader1 = PyPDF2.PdfFileReader(f1)
        reader2 = PyPDF2.PdfFileReader(f2)
        writer = PyPDF2.PdfFileWriter()
        if reader1.numPages != reader2.numPages:
            print('页数不相等')
            raise FileExistsError
        for i in range(reader1.numPages):
            writer.addPage(reader1.getPage(i))
            writer.addPage(reader2.getPage(-(i + 1)))
        writer.write(newf)def print_help():    help_str = '''
帮助信息:
可双击打开后手动输入路径
也可以把要合并的文件路径以参数形式传入(数量必须为偶数)
合并是以文件名排序的
'''    print(help_str)def main():    args: list = sys.argv[1:]
    args.sort()
    if len(args) == 0:
        file_a = input('第一个文件')
        file_b = input('第二个文件')
        merge(file_a, file_b)
    elif len(args) == 1:
        print_help()
        # if args[0] in ['-h', '--help', '/?']:        #     print_help()        # else:        #     print_help()    elif len(args) % 2 == 0:
        for i in range(0, len(args), 2):
            merge(args[i], args[i + 1])
        print('合并完成')
    else:
        print_help()
    os.system('pause')if __name__ == '__main__':
    main()