【python】批量扫描仅支持单面扫描也想阻止打工人?

【python】批量扫描仅支持单面扫描也想阻止打工人?

#python #pdf #自动化办公 #文件合并 #单面扫描仪 #批量扫描文件

同质问题:双面文件单面扫描如何搞?

今天遇到了个问题,单位的扫描仪批量扫描居然只支持单面扫描。

看着500多页,假如要是单面一张一张来的话,那今天一天估计是打不住了。

打工人留下了痛苦的眼泪。

先是找了一下各种乱七八糟的软件,都有一定的手动操作。

不如直接上python

于是二话不说,一顿需求分析+代码编写,一键合并奇偶单面扫描的程序写好了!!

**问题描述:**某些扫描仪是单面扫描仪,仅支持单面扫描,故得到的是奇数页文档和倒序偶数页文档。

**问题解决思路:**通过正反扫描获得全部的扫描文档,将工作量放在文档处理上。

**需求:**现在需要一个python程序,将俩个pdf文档合并成一个完整顺序PDF文档。

**分析:**输入1:奇数页PDF文档 输入2:偶数页PDF文档 输出:完整顺序PDF文档,

通过分析可以看出是一个文档交叉合并问题。

算法流程:

步骤一:将A文件拆分为单个文件,并按奇数命名。

步骤二:将B文件拆分为单个文件,先倒序,再按偶数命名。

步骤三:将所有单个文件放在一起并排序。

步骤四:将排序后的文件合并为一个PDF文件。

用例:

假设有102页,

A文件页码顺序:1、3、5、7、9…97、99、101

B文件页码顺序:102、100、98、96…6、4、2、

用例输出结果:

C文件(输出文件)页码顺序:1、2、3、4、5、6、7、8…100、101、102

由于要对文件批量操作,所以需要os模块,然后操作的文件类型是PDF,所以这里采用pypdf2

下面是程序代码

#作者:方遒
#时间:2022/8/16
#项目:PDF奇偶数文档合并
import os,shutil
from PyPDF2 import PdfFileReader, PdfFileWriter
from tqdm import tqdm  # 加进度条


def split_pdf(file_name, start_page, end_page, output_pdf):   
    '''
    定义一个PDF分割函数
    :param file_name:待分割的pdf文件名
    :param start_page: 执行分割的开始页数
    :param end_page: 执行分割的结束位页数
    :param output_pdf: 保存切割后的文件名
    '''
    # 读取待分割的pdf文件
    input_file = PdfFileReader(open(file_name, 'rb'))
    # 实例一个 PDF文件编写器
    output_file = PdfFileWriter()
    # 把分割的文件添加在一起
    for i in range(start_page, end_page):
        output_file.addPage(input_file.getPage(i))
    # 将分割的文件输出保存
    with open(output_pdf, 'wb') as f:
        output_file.write(f)

def get_num_pages(file_path):
    """
    获取文件总页码
    :param file_path: 文件路径
    :return:
    """
    reader = PdfFileReader(file_path)
    # 不解密可能会报错:PyPDF2.utils.PdfReadError: File has not been decrypted
    if reader.isEncrypted:
        reader.decrypt('')
    page_num = reader.getNumPages()
    return page_num


def pdf_cut(path,file_name,path_add):
    """定义一个PDF单页分割函数"""
    filepath=path
    filename=file_name
    #进入所切割文件夹下
    os.chdir(filepath)
    os.mkdir(path+path_add)
    path=path+path_add
    #获取pdf页数
    num=get_num_pages(filename)
    for i in range(num):  #页数获取也是一部分程序
        split_pdf(filename, i , i+1 , path +r"\file_"+ str(i) + ".pdf")
        
        
def pdf_rename(path,arguments):
    """定义一个PDF批量重命名函数"""
    filepath =path
    os.chdir(filepath)
    #获取全部文件名称(注:需要一定格式,否则报错)
    filenames = os.listdir(filepath)
    
    #对文件名称进行排序
    filenames.sort(key=lambda x: int(x.split(".")[0].split("_")[-1]))
    
    if arguments == "odd":  #按照奇数重命名
        #对文件名称进行按奇数批量命名
        for i in range(len(filenames)):
            os.rename(filenames[i],str(i*2+1) + ".pdf")
#         print("奇数",filenames)
    elif arguments == "even": #按照偶数重命名
        #对文件名称进行按偶数批量命名
        filenames.reverse()  #反转倒序
        for i in range(len(filenames)):
            os.rename(filenames[i],str(i*2+2) + ".pdf")
#         print("偶数",filenames)
    else:
        print("参数错误")
#     print(filenames)
        
        
def file_combine(path1,path2):
    """定义一个文件夹合并函数
    path1:需要合并的文件夹1
    path2:需要合并的文件夹2
    """
    sourceDir=path1
    targetDir=path2
    for root, dirs, files in os.walk(sourceDir):
        for file in tqdm(files,desc="Waiting..."):
            # 需求1的执行复制操作
            shutil.copy(os.path.join(root,file),targetDir) 
            # 需求2的执行重命名操作
            if file.endswith('.pdf.pdf'):
                os.rename(os.path.join(root,file),os.path.join(root,file[:-4]))
                
                
def merge_pdf(merge_list, output_pdf):
    """
    定义一个pdf合并函数
    merge_list: 需要合并的pdf列表
    output_pdf:合并之后的pdf名
    """
    # 实例一个 PDF文件编写器
    output = PdfFileWriter()
    for ml in merge_list:
        pdf_input = PdfFileReader(open(ml, 'rb'))
        page_count = pdf_input.getNumPages()
        for i in range(page_count):
            output.addPage(pdf_input.getPage(i))
 
    output.write(open(output_pdf, 'wb'))

def main(file_path,A_file_name,B_file_name):
    """定义一个一键执行函数
    file_path:PDF文件所在路径
    A_fil_ename:正面PDF文件(奇数页)名称
    B_fil_ename:反面PDF文件(偶数页)名称
    """
#     path = file_path
#     A_name = A_file_name
#     B_name = B_file_name
    A_file_path_add=r"\cut1"
    B_file_path_add=r"\cut2"
        
    A_file_path=file_path+A_file_path_add
    B_file_path=file_path+B_file_path_add
    
    
    #文档分割
    #A文档分割
    pdf_cut(file_path,A_file_name,A_file_path_add)
    #B文档分割
    pdf_cut(file_path,B_file_name,B_file_path_add)
   

    #文档批量重命名
    #奇数排序重命名
    pdf_rename(A_file_path,"odd")
    #偶数排序重命名
    pdf_rename(B_file_path,"even")
    
    #文档批量合并

    file_combine(A_file_path,B_file_path)
    
    
    #合并后的路径
    combine_path=B_file_path
    
    #批量合并PDF
    os.chdir(combine_path)
    merge_list=os.listdir()
    
    merge_list.sort(key=lambda x: int(x.split(".")[0]))
#     print(merge_list)
    output_pdf="output.pdf"   #最终文档在B文件夹下,名称为"output.pdf"
    merge_pdf(merge_list, output_pdf)
    
    
if __name__ == '__main__':
    path = r"C:\Users\Administrator\Desktop\工作\文档"
    A_file = r"Scan2022-08-15_134655.pdf"
    B_file = r"Scan2022-08-15_142039.pdf"
    main(path,A_file,B_file)
    print("一键交叉合并完成")

如果本文解决了您遇到的问题请点赞哈!

转载请联系作者!!!!

谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值