【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)

news2025/1/7 0:08:52

背景需求:

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/2584107682icon-default.png?t=O83Ahttps://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,实现快速合并,大大优化和提高准确率,减少返工。

今年带班后,很多条线任务都没有提早做、也没有准时完成,都是延后的,搞得很焦虑。下次还是要逼自己抓紧时间!抓紧时间!抓紧时间!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity学习4:git和SVN的使用差别

目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时,提交文件之外的其他文件需要pull 2.1.2 commit时,发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …

【数据库初阶】MySQL数据类型

🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL…

kubernetes学习-Service

kubernetes学习-Service 1. Service说明2. 功能3.Service类型3.1 NodePort3.1.1 创建web-service.yaml3.1.2 创建web-pod.yaml3.1.3 部署3.1.4 验证 3.2 ClusterIP3.2.1 创建web-clusterIp-service.yaml3.2.2 创建web-clusterIp-pod.yaml3.2.3 部署3.2.4 验证 3.3 LoadBalancer…

滤波器的主要参数

为什么选择高阶: 滤波器的主要参数通常包括以下几个方面: 截止频率 (Cutoff Frequency): 这是滤波器能够有效通过或抑制信号的频率点。对于低通滤波器,信号低于截止频率的部分会被通过,高于截止频率的部分会被衰减。高…

设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保某个类在应用程序的生命周期内只有一个实例,并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…

290-3U VPX i7 刀片计算机

一、产品概述 该产品是一款基于第三代Intel i7双核四线程的高性能3U VPX刀片式计算机。产品提供了多个高速PCIe总线接口,其中3个x4 PCIe 3.0接口,1个x4 PCIe 2.0接口。x4 PCIe 2.0接口可灵活配置为4个x1 PCIe接口,因此产品具有很强的扩展性&a…

【从零开始入门unity游戏开发之——C#篇41】C#迭代器(Iterator)——自定义类实现 foreach 操作

文章目录 前言一、什么是迭代器?二、标准迭代器的实现方法1、自定义一个类CustomList2、让CustomList继承IEnumerable接口3、再继承IEnumerator接口4、完善迭代器功能5、**foreach遍历的本质**:6、在Reset方法里把光标复原 三、用yield return语法糖实现…

win32汇编环境,对话框程序中通过资源显示bmp图像

;运行效果 ;win32汇编环境,对话框程序中通过资源显示bmp图像 ;通过资源的方式,会把图像固定在exe文件里,会变大。通过读取文件的方式,没有固定在exe文件里,也可以随时换图像文件,所以exe文件较小 ;直接抄进RadAsm可编译…

MATLAB画柱状图

一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小,[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图,宽度1 h1…

java 搭建一个springboot3.4.1项目 JDK21

环境准备 idea:2021 springboot:3.4.1 JDK:21 maven:3.6.3 新建项目 点击new->project->spring initializr 选择springboot版本 1.选择springboot版本,因为JDK版本是21因此对应springboot3.X Spring Boot 2.6.x:适用于JDK 8到17&#xff0c…

第R3周:RNN-心脏病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、前言二、代码流程1、导入包,设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境:…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读: 多点 DMALL 成立于2015年,持续深耕零售业,为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座,大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…

华为消费级QLC SSD来了

近日,有关消息显示,华为的消费级SSD产品线,eKitStor Xtreme 200E系列,在韩国一家在线零售商处首次公开销售,引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年,但直到今年6月才正式推出面向…

StableDiffusionWebUI本地部署指南(WIN)

最近接手了一个需要使用 Stable Diffusion 的项目,要重新部署一套 SD 环境。这跟我之前的SD部署又不太一样,部署过程中遇到一些问题,总结出一个比较完美的安装方案,在这里和大家分享一下。 项目地址:https://github.c…

运动控制探针功能详细介绍(CODESYS+SV63N伺服)

汇川AM400PLC和禾川X3E伺服EtherCAT通信 汇川AM400PLC和禾川X3E伺服EtherCAT通信_汇川ethercat通信-CSDN博客文章浏览阅读1.2k次。本文详细介绍了如何使用汇川AM400PLC通过EtherCAT总线与禾川X3E伺服进行通信。包括XML硬件描述文件的下载与安装,EtherCAT总线的启用,从站添加…

ELK日志平台搭建 (最新版)

一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包: sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 import random import pygame WIND…

应用架构模式

设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…

el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割

需求&#xff1a;一个输入框字段需要支持多次输入&#xff0c;最后传输给后台的字段值以逗号分割 解决方案&#xff1a;结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…