用Python自动获取PDF图纸的图纸大小,并依此分类整理

在建筑行业,设计师用CAD设计完建筑图纸后,常常需要上传到市、省二级图审平台上,故需要将每张图纸转成PDF文档,并盖电子章(出图章、建造师章和结构章),然后上传图审系统。如果设计师在CAD转PDF时没标明图幅大小(A0,A1,A3,A4?),盖章的人就不得不一张张地打开来查看并盖章,没办法用“批量盖章”的方式。由于图纸量大,往往累成狗。

电子章要批量盖章的前提条件就是:同一批图纸的图幅是相同的,这样,电子章盖在相同的地方才不会错位。

为了解决这个问题,我用Python编了一个脚本,它可以自动识别PDF文档的尺寸(size),也就是“图幅”,并将相同图幅的PDF文档归纳到同一个目录中,以方便批量盖电子章。

该代码经多次实践,方便可靠。

以下是源代码:

'''第一步:
批量获取PDF文档的第一页的页面大小,并将其添加到该PDF文档文件名的最后面
'''
#打开PDF图纸所在的文件夹,将其文件路径复制到剪贴板中
#先指定要处理的图纸目录,注意:反斜杠“\“要改为斜杠"/"#------------------将复制在剪贴板中的文件路径中的“\”替换成"/",并重新复制到剪贴板中------------------
import pyperclip# 获取剪贴板中的文本
file_path = pyperclip.paste()# 将 "\\" 替换为 "/"
file_path = file_path.replace("\\", "/")# 将修改后的文本复制到剪贴板
pyperclip.copy(file_path)#将修改后的文件夹路径赋予变量
目录 = pyperclip.paste()
#------------------import os
import fitz  # PyMuPDF库def get_pdf_page_sizes(pdf_path):page_sizes = {}try:doc = fitz.open(pdf_path)for page_num in range(doc.page_count):page = doc[page_num]width = page.rect.width  # 获取页面宽度height = page.rect.height  # 获取页面高度size = (width, height)page_sizes.setdefault(size, []).append(page_num + 1)  # 将页面大小和页码添加到字典中except Exception as e:print(f"Error processing {pdf_path}: {e}")finally:if doc:doc.close()return page_sizesdef rename_files_with_page_size(pdf_folder):# 遍历文件夹中的所有PDF文件for filename in os.listdir(pdf_folder):if filename.endswith(".pdf"):pdf_path = os.path.join(pdf_folder, filename)print(f"Processing {pdf_path}...")page_sizes = get_pdf_page_sizes(pdf_path)for size, pages in page_sizes.items():if len(pages) > 0:  # 如果有页面大小信息# 构建新的文件名new_filename = f"{os.path.splitext(filename)[0]}_Page_{pages[0]}_Size_{size[0]}x{size[1]}.pdf"new_path = os.path.join(pdf_folder, new_filename)# 重命名文件try:os.rename(pdf_path, new_path)print(f"Renamed {filename} to {new_filename}")except Exception as e:print(f"Error renaming {filename} to {new_filename}: {e}")# 指定包含PDF文件的文件夹路径
pdf_folder_path = 目录# 将“Page 1 Size:”后面的内容添加到原文件名的最后面(重命名文件)
rename_files_with_page_size(pdf_folder_path)#------------------------------------------------------------------------------------------------
'''第二步:
将文件名后面从“Page_1_Size_"开始到后缀名之前的内容相同的文件(就是页面大小相同的文件)归类到同一目录
'''
import os
import shutildef move_files_with_common_part(directory):# 获取目录中的所有文件files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]# 创建字典来存储共同部分和目标目录的对应关系common_parts = {}for file_name in files:# 查找文件名中的共同部分start_index = file_name.find("Page_1_Size_") + len("Page_1_Size_")end_index = file_name.find(".", start_index)common_part = file_name[start_index:end_index]# 构建目标目录路径target_directory = os.path.join(directory, common_part)# 创建目录(如果不存在)if not os.path.exists(target_directory):os.makedirs(target_directory)# 构建原文件路径和目标文件路径source_path = os.path.join(directory, file_name)target_path = os.path.join(target_directory, file_name)# 移动文件到目标目录shutil.move(source_path, target_path)print(f"移动文件: {file_name} -> {target_path}")# 更新字典中的目标目录路径common_parts[common_part] = target_directory# 输出每个共同部分的目标目录路径for common_part, target_directory in common_parts.items():print(f"共同部分: {common_part},目标目录: {target_directory}")if __name__ == "__main__":# 指定目录路径target_directory = 目录# 调用函数移动具有相同共同部分的文件move_files_with_common_part(target_directory)

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

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

相关文章

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

找不到openjdk-1.8-tools和openjdk-1.8-jconsole

每次打包都报找不到openjdk-1.8-tools和openjdk-1.8-jconsole,但是在项目中并没有用到。 这个是在maven仓库下的druid下的pom文件中。根本没有用到,于是把这两行注释调。解决 .m2\repository\com\alibaba\druid\1.2.6\druid-1.2.6.pom

内网穿透!如何配置frp新版0.56.0的配置文件.toml:提供web、samba、ssh远程连接示例

最新版本的frp在配置上与之前有很大不同,需要使用.toml文件进行配置。其中主要问题出现在toml文件内部。因此,本文将专门讨论这个问题。 一、服务端配置 下载并解压(以debian系统为例): sudo apt update sudo apt i…

钡铼IOy系列模块在无人值守智能仓库中的成功运用,提升仓储物流效率

随着科技的不断发展,无人值守智能仓库正成为现代物流行业的一个重要趋势。在这个快节奏的时代,提升仓储物流效率是企业追求的目标之一。钡铼IOy系列模块为无人值守智能仓库的成功运作提供了关键支持。本文将探讨钡铼IOy系列模块在无人值守智能仓库中的应…

Java面试之数据类型

在Java中,数据类型用于声明变量并指定变量能够存储的数据类型。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。 一、基本数据类型: 1.1、整型:用于表示整数值,包括byte、short、int和long。 byte&…

java读取过来的文件乱码?指定字符集。操作文件的几种方式

从文件读取字符串的几种方式 1 使用BufferedReader和FileReader(无法指定读取字符集) public static void main(String[] args) {StringBuilder content new StringBuilder();try (BufferedReader reader new BufferedReader(new FileReader("f…

深入Linux下的GCC编译器:从入门到精通

目录标题 1、GCC编译器概述2、安装GCC3、GCC的基本使用4、高级功能4.1 多文件编译4.2 静态和动态链接4.3 什么是链接?4.4 静态链接优点缺点 4.5 动态链接优点缺点 4.6 实际应用4.7 编译优化 GCC(GNU Compiler Collection)是一款免费、开源的编…

Elasticsearch下载

1 最新版下载地址 Download Elasticsearch | Elastic https://www.elastic.co/cn/downloads/elasticsearch 2 其他版本下载地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch 7.9.2:https://artifacts.elastic.co/downloads/elasticsearch/elasticsear…

基于springboot+vue+Mysql的篮球竞赛预约平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

在AD中导出所有用户的信息,修改之后导入

方法一 导出用户的名字,上次登录时间,上次密码重置时间,邮件并以CSV格式保存。 Get-ADUser - Filter * -Properties * -SearchBase " dcsuperdoor,dcco, dcnz" |Select -Object Name, lastlogondate, passwordlastset, mail |…

使用uni-app开发app时遇到mqtt.js不可用的问题

使用uni-app开发app时遇到mqtt.js不可用的问题 1 问题背景 基于 Vue3 版本创建了 uni-app 项目用于开发微信小程序,项目中用到了 mqtt.js(v4.1.0),编译为微信小程序能够正常运行,但是编译为 APP 后,控制台…

【vue功能】多张图片合并

多张图片合并成一张图片 步骤一,多张图片上传步骤二,循环获取所有绘制图片的总高度new FileReader()方法作用new Image()方法作用介绍 步骤三,合并多张图片canvas.toDataURL()作用-dpr作用 步骤四,下载图片 步骤一,多张…

(六)JSP与Servlet的关系

JSP与Servlet的关系 JSP(Java Server Pages)是继Servlet后Sun公司推出的新技术。JSP技术在传统的HTML文件中插入Java程序段和JSP标记,从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Window…

【006期】游戏的开始和结束界面,得分和生命值及其游戏逻辑。

核心代码 int score; int lives;boolean gameOver; void draw() {background(255);if (!gameOver) {/*游戏中的其他所有逻辑写在此处*/displayScoreAndLives(); // 显示得分和生命值} else {displayGameOverScreen(); // 显示游戏结束画面} } void displayScoreAndLives() {fil…

NASA数据集——有源空腔辐射计辐照度监测仪(ACRIM)II 本地格式的 UARS 机载太阳总辐照度(TSI)2022年1月版本

Active Cavity Radiometer Irradiance Monitor (ACRIM) II Total Solar Irradiance (TSI) aboard UARS in Native format 简介 ACRIMII_TSI_UARS_NAT 数据是上层大气研究卫星(UARS)上的有源空腔辐射计辐照度监测仪 II(ACRIM II)…

云安全防御篇:如何识别并做好服务器DDoS防护?

伴随着全球互联网业务和云计算的快速发展,作为一种破坏力巨大的攻击方式,DDoS攻击正以超出服务器承受能力的流量淹没网站,导致服务器宕机、企业营业额下跌,甚至企业品牌形象受损。越是面对复杂的攻击,就需要性能更强的…

C++:缺省函数

目录 缺省函数的概念 缺省函数的类型 全缺省 半缺省 缺省函数的声明 C语言和C中函数的区别 缺省函数的概念 缺省函数是对于有参数的函数而言的,缺省的意思就是在函数的定义的时候对函数的参数进行初始化值;在调用的时候在缺省的参数的位置上可以不进行传参; 缺省函数的…

测试大语言模型在嵌入式设备部署的可能性——模型TinyLlama-1.1B-Chat-v1.0

测试模型TinyLlama-1.1B-Chat-v1.0修改推理参数,观察参数变化与推理时间变化之间的关系。 本地环境: 处理器 Intel Core™ i5-8400 CPU 2.80GHz 2.80 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 集显 Intel UHD Graphics 630 独显 NVIDIA GeForce GTX 1050 主…

2万8金句美句格言签名句子ACCESS\EXCEL数据库

优美句子类的数据已经有《33万多优美句子经典句子ACCESS数据库》、《近2万签名的句子网络签名ACCESS数据库》、《24万QQ伤感签名微信签名ACCESS数据库》、《2万多条QQ签名论坛签名大全ACCESS数据库》,今天又遇到一个,感觉也很不错,发上来看看…

数字科技助力垃圾分类展厅,增强内容交互新体验!

如今,许多行业都开始运用数字技术,探索其在展览展示领域中的应用,其中垃圾分类展厅作为现代城市文明建设的重要一环,也通过这些技术的运用,打造出了更加生动且富有科技感的展示空间,它不仅提升公众对垃圾分…