【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("一键交叉合并完成")
如果本文解决了您遇到的问题请点赞哈!
转载请联系作者!!!!
谢谢!