【python】批量扫描仅支持单面扫描也想阻止打工人? 您所在的位置:网站首页 python调用扫描仪扫PDF文件 【python】批量扫描仅支持单面扫描也想阻止打工人?

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

2024-07-06 19:51| 来源: 网络整理| 查看: 265

【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("一键交叉合并完成")

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

转载请联系作者!!!!

谢谢!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有