当前位置: 首页 > news >正文

【办公类-115-05】20250920职称资料上传04——PDF和PDF合并PDF、图片和PDF合并PDF(十三五PDF+十四五图片)

背景需求:

将教师培训十三五证书(结业证书,已完成)和十四五证书(表格形式,没有结束)合并成PDF

两个证明下载时都是PDF

'''
职称04 ,PDF与PDF合并(学分)
deepseek,阿夏
20250920
'''import os
from PyPDF2 import PdfMerger
from pathlib import Pathdef merge_all_pdfs_in_folder(folder_path, output_filename="merged.pdf"):"""合并指定文件夹中的所有PDF文件Args:folder_path (str): 文件夹路径output_filename (str): 输出文件名"""if not os.path.exists(folder_path):print(f"文件夹不存在: {folder_path}")return# 获取文件夹中的所有PDF文件pdf_files = []for file in Path(folder_path).iterdir():if file.suffix.lower() == '.pdf' and file.is_file():pdf_files.append(str(file))if not pdf_files:print("文件夹中没有找到PDF文件!")return# 按文件名排序pdf_files.sort()print(f"找到 {len(pdf_files)} 个PDF文件:")for pdf_file in pdf_files:print(f"  - {os.path.basename(pdf_file)}")# 合并PDFtry:merger = PdfMerger()for pdf_file in pdf_files:merger.append(pdf_file)# 确保输出路径正确output_path = os.path.join(folder_path, output_filename)merger.write(output_path)merger.close()print(f"PDF合并完成!输出文件: {output_path}")except Exception as e:print(f"合并PDF时出错: {e}")# 使用示例
if __name__ == "__main__":path=r'E:\03教师职务培训证书原件扫描件(十三五证书)'folder_path = path+r"\十四五打印盖章"output_pdf = path+r"\十三五结业证书+十四五证明.pdf"merge_all_pdfs_in_folder(folder_path, output_pdf)

做出来的是合并PDF

但是我想起来上一次做职称资料的时候,十四五的证明是要去教育局师训部盖章的。

果然要盖章。

我把十四五的PDF打印出来,两张纸,送到教育局盖章证明已经培训过。

然后把这两张打印纸扫描成图片。

所以现在我需要把1个PDF和两个jpg图片合并成一个PDF。

用deepseek写代码,同时注意把PDF和图片名称排序,PDF是001,图片是002、003。

'''
职称04 ,图片与PDF合并
deepseek,阿夏
20250920
'''
import os
import sys
from PIL import Image
from PyPDF2 import PdfMerger, PdfReaderdef convert_images_to_pdf(image_folder):"""将文件夹中的所有图片转换为PDF文件,保持原始方向"""# 支持的图片格式image_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp')# 获取所有图片文件image_files = [f for f in os.listdir(image_folder) if f.lower().endswith(image_extensions)]if not image_files:print("未找到图片文件")return None# 按文件名排序image_files.sort()# 转换图片为PDFpdf_pages = []for img_file in image_files:try:img_path = os.path.join(image_folder, img_file)image = Image.open(img_path)# 转换为RGB模式(针对RGBA等模式)if image.mode != 'RGB':image = image.convert('RGB')# 创建临时PDF文件,保持原始方向temp_pdf_path = os.path.join(image_folder, f"temp_{img_file}.pdf")image.save(temp_pdf_path, "PDF", resolution=100.0)pdf_pages.append(temp_pdf_path)print(f"已转换图片: {img_file}")except Exception as e:print(f"转换图片 {img_file} 时出错: {str(e)}")return pdf_pagesdef merge_pdfs(pdf_list, output_path):"""合并多个PDF文件"""merger = PdfMerger()for pdf in pdf_list:try:# 检查文件是否存在且有效with open(pdf, 'rb') as f:reader = PdfReader(f)if len(reader.pages) > 0:merger.append(pdf)print(f"已添加: {os.path.basename(pdf)}")except Exception as e:print(f"添加 {pdf} 时出错: {str(e)}")# 写入合并后的PDFmerger.write(output_path)merger.close()print(f"已生成合并后的PDF: {output_path}")def main(folder_path, output_pdf_path):"""主函数:处理文件夹中的图片和PDF文件"""# 检查文件夹是否存在if not os.path.exists(folder_path):print(f"错误:文件夹 '{folder_path}' 不存在")return# 获取所有PDF文件(不包括由图片生成的临时PDF)pdf_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith('.pdf') and not f.startswith('temp_')]pdf_files.sort()# 转换图片为PDFtemp_image_pdfs = convert_images_to_pdf(folder_path)# 合并所有PDF(先PDF后图片)all_pdfs = []if pdf_files:all_pdfs.extend(pdf_files)  # 先添加原始PDFif temp_image_pdfs:all_pdfs.extend(temp_image_pdfs)  # 再添加图片转换的PDFif not all_pdfs:print("未找到可处理的图片或PDF文件")return# 合并PDFmerge_pdfs(all_pdfs, output_pdf_path)# 清理临时文件if temp_image_pdfs:for temp_pdf in temp_image_pdfs:try:os.remove(temp_pdf)except:passprint("处理完成!")if __name__ == "__main__":# 设置默认文件夹和输出路径folder_path = r"\03教师职务培训证书原件扫描件(十三五证书)\十四五打印盖章"  # 要处理的文件夹output_pdf_path = os.path.join(folder_path[:-7], "十三五结业证书+十四五证明.pdf")  # 输出PDF文件名# 如果提供了命令行参数,使用它们if len(sys.argv) > 1:folder_path = sys.argv[1]if len(sys.argv) > 2:output_pdf_path = sys.argv[2]main(folder_path, output_pdf_path)

扫描图片大,所以所以大小和PDF差不多

同样的方法可以做其他PDF和PDF的合并、图片与PDF的合并。

http://www.dtcms.com/a/478767.html

相关文章:

  • MySQL分库分表方案及优缺点分析
  • 存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
  • 星外网站开发苏州网络推广
  • 怎么做网站横幅建设工程协会网站查询系统
  • 1NumPy 常用代码示例
  • 【工业场景】用YOLOv8实现行人识别
  • 新手玩Go协程的一些小坑
  • STM32的VDD和VSS,VDDA和VSSA,REF+与REF-。
  • 基于STM32的智能门禁系统(论文+源码)
  • 新乡网站建设价格怎么做网站模块
  • 中小企业建设网站补贴企业网站推广的重要性
  • 信息比率诊断工具开发量化评估ETF网格择时能力有效性
  • 栏位索引超过许可范围:4,栏位数:3。; nested exception is org.postgresql.util.PSQLException
  • 厦门网站建设哪家强徐州58同城网
  • 如何进行新产品的推广网站seo技术
  • Dioxus状态管理
  • 微调高级推理大模型(COT)的综合指南:从理论到实践
  • 做美食分享网站源码wordpress网址一大串
  • 深圳做网站的人百度竞价点击软件奔奔
  • uniapp学习【整体实践】
  • Rabbitmq如何避免消息丢失
  • 建设一个朋友的网站工商局注册公司网站
  • wap网站建设免费关于网站建设费用的报告
  • asp网站开发实训报告亚马逊开店需要什么条件
  • cms管理手机网站制作网站的页面设计怎么做
  • 湖北工程公司建设公司网站腾讯云服务器免费体验
  • 面试问题—你接受加班吗?
  • 使用Asp.Net WebApi(.net 8)托管Unity WebGL
  • 用凡科做网站需要花钱吗localhostwordpress打不开
  • 15 【C++11 新特性】统一的列表初始化和变量类型推导