背景需求:
2023区级大课题《运用Python优化3-6岁幼儿学习运动质料的实践研究》需要做阶段资料
原来应该2024年6月就提交电子稿和打印稿。可是python学具的教学实验着实太多了,不断生成,我忙着做教学,都没有精力去整理。
2025年1月3日,是2024区级大课题阶段资料上交的时期,科研主任让我必须上交存档了。
于是我花了一周终于把资料贴好了(成果太多了,都不知道用那份好),提交电子稿。同时需要打印成纸稿。
存在问题:
1.需要打印的每个Word文件都在单独的文件夹里,每次打印都需要打开一个文件夹,然后打开Word,再打印,打印时要选择参数(双面打印等)
2.最后还需要把打印出来的纸稿按照次序排列。调解正反面。这需要查对目录。也泯灭时间。
解决思绪
写的已经很累了,不想在打印整理上费脑子。我想做成一个PDF归并打印。直接就获取整理好次序的纸稿。
1、把单个Word转成pdf
2、把所有pdf按照次序归并在一个pdf内
解决方式:
1、Word都是doc文件,需要转成docx。
2、每个文件夹里的docx有1个(课题文档),或多个(一些参考资料),但只有1个docx是需要的
因此,需要将doc转docx,我盼望只读取二级文件夹里我需要的那个docx。(实际最后,一级文件里所有的doc都转成docx了。不是只转换二级文件夹里的docx。)
给docx文件前面写上序号01,确保PDF也能排序(厥后发现一些参考文件的doc也转pdf了,所以必须写上01序号,才能让这些PDF排列在前面,便于选择前11个pdf归并)
3、确保每个DOCX都是双数页(,这样PDF归并后,每个word的标题照旧都能在奇数页上。来不及写代码了,我都是手动添加换页符)
(1)所有DOCX打开,
(2)如果是单数页,再最后一页手动按一个换页符。CTrl+Enter
(3)如果是双数页,就关闭
这样就能确保归并打印时,每个有标题的页面都在奇数页上
代码展示:
这是上学期的代码 03 第一学期,读取前11个pdf归并
- import os
- from docx import Document
- from reportlab.lib.pagesizes import letter
- from reportlab.pdfgen import canvas
- from PyPDF2 import PdfFileMerger, PdfFileReader
- import time
- from docx2pdf import convert
- import comtypes.client
- # 初始化 Word 应用程序
- word = comtypes.client.CreateObject('Word.Application')
- word.Visible = False
- # 指定包含 DOC 文件的文件夹路径
- path=r"D:\课题"
- m="3"
- n="一"
- input_folder =path+fr"\0{m} 第{n}学期"
- # input_folder =path+r"04 第二学期"
- # 遍历输入文件夹中的所有文件和子文件夹
- for root, dirs, files in os.walk(input_folder):
- for file in files:
- if file.endswith('.doc'):
- doc_file = os.path.join(root, file)
- docx_file = os.path.join(root, f"{os.path.splitext(file)[0]}.docx")
-
- # 打开 DOC 文件并保存为 DOCX 文件
- doc = word.Documents.Open(doc_file)
- doc.SaveAs(docx_file, FileFormat=16) # FileFormat=16 表示 DOCX 格式
- doc.Close()
- print(f"Converted {doc_file} to {docx_file}")
- # 关闭 Word 应用程序
- word.Quit()
- import os
- import time
- from docx2pdf import convert
- # 指定包含 DOCX 文件的文件夹路径
- # input_folder = r"D:\课题\03 第一学期"
- # 指定输出 PDF 文件的文件夹路径
- output_folder = input_folder+r"\12 PDF合集"
- # 确保输出文件夹存在
- os.makedirs(output_folder, exist_ok=True)
- # 遍历输入文件夹中的所有文件和子文件夹
- for root, dirs, files in os.walk(input_folder):
- docx_files = [file for file in files if file.endswith('.docx')]
- if docx_files:
- for docx_file in docx_files:
- docx_file_path = os.path.join(root, docx_file)
- pdf_file_name = f"{os.path.splitext(docx_file)[0]}.pdf"
- pdf_file_path = os.path.join(output_folder, pdf_file_name)
- convert(docx_file_path, pdf_file_path)
- print(f"Converted {docx_file_path} to {pdf_file_path}")
- time.sleep(3) # 给转换一些时间间隔,避免过快导致失败
- # 最后把PDF合并
- import os,time
- from PyPDF2 import PdfMerger, PdfFileReader
- # 创建一个PdfMerger对象
- merger = PdfMerger()
- # 获取输出文件夹中的所有PDF文件
- pdf_files = [f for f in os.listdir(output_folder) if f.endswith('.pdf')]
- # 遍历所有的PDF文件并合并()
- for filename in pdf_files[:11]:
- pdf_path = os.path.join(output_folder, filename)
- with open(pdf_path, 'rb') as pdf_file:
- pdf_reader = PdfFileReader(pdf_file)
- merger.append(pdf_reader)
- # 保存合并后的PDF文件
- output_path = os.path.join(input_folder,f"0{m} 第{n}学期合并打印.pdf")
- merger.write(output_path)
- merger.close()
- print("PDF文件合并完成!")
- import shutil
- shutil.rmtree(output_folder)
复制代码 归并后我发现,除了我需要的二级文件夹里的docx,在一级文件夹里的docx(与二级文件夹同级,赤色部分文件)也被PDF了。
所以我给每个需要的docx文件进行编号(01-11)只提取有序号的前11个PDF文件归并(文件名的数字首字排在前面,字母首字排中间,汉字首字最后)
(第一个学期的所有PDF,只提取有序号的前11个pdf归并)
提取前11个pdf归并(就是有数字序号的11个)
最后效果
--------------题外话---------------
我发现括号排在数字前面,但是归并前11个文档时,并没有这个括号首字的文件。
那么数字、字母、汉字和符号怎么排序呢?
以下这篇文章提到了一些排法。
https://www.zhihu.com/question/20227012/answer/2584107682https://www.zhihu.com/question/20227012/answer/2584107682
符号首字简直在数字首字前面。但是为什么最后没有被算成第一个PDF文件?
后续再研究看看怎么回事
--------------------------------------------------------------------------------------------
(第二学期的所有PDF,提取有序号的前10个pdf归并,没有申请书了。所以少一个)
提取前10个PDF归并(有数字序号的)
打印情况
桌面文件
第一学期PDF
108页。正反54张(01的申请书不用打印,实际打印86张)
第二学期PDF102页。正反51张
打印和作品展示:
彩色双面打印机(不用翻页真的好方便)
说明:
1、word转PDF打印后的笔墨边距会比用word直接打印的纸张小0.2CM的边距,但是不细致看,看不出差别。
2、由于PDF板式固定,不用担心图片移动,破坏布局,打印便利。
最后放在文件袋里上交
拖了好久的任务终于完成了,大大松口气!(* ̄︶ ̄)
感悟:
1.python技能提升时间效率,节省人工消耗。
2.python能反复调试生成pdf,实现快速归并,大大优化和进步精确率,减少返工。
今年带班后,很多条线任务都没有提早做、也没有准时完成,都是延后的,搞得很焦虑。下次照旧要逼自己抓紧时间!抓紧时间!抓紧时间!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |