审计文件标识作为水印打印在pdf页面边角
目录
- 说明
说明
将审计文件的所需要贴的编码直接作为水印贴在页面四个角落,节省辨别时间
我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本,现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径,先检测该路径是不是已经存在的文件夹,如果不是,再判断是不是txt如果也不是,提示需要txt路径列表或者提供根路径,如果是文件路径,提示该路径下子文件夹的文件也会被做同样处理,做好文件备份隔离防护工作。如果是txt则按行读取,并且提示其中的路径有多少是有效的。
提供一个勾选框,决定是否要将路径中的各种图片格式转化为同名pdf。然后提供两个文本框指定图片转化线程数和水印添加线程数
然后再提供2个参数文本框,第一个文本框内数字为g(成为打印页边距)分别用来调节水印离两个方向页面边界的距离(以%为单位的相对距离,实际距离取决于读取到的页面尺寸,长和宽的乘积取平方根再乘以g%),第2文本框用来指定相对字体大小f%(%为单位,计算一个参考高度等于页面长宽乘积取平方根再乘以5%再乘以f%,然后计算选定字体显示高度与参考高度相等的字号),用标签提示最好在实验文件夹中测试好需要的相对字体大小
font_family根据系统可选提供下拉菜单,改为用户指定,前两个默认为Times New Roman和楷体
水印内容和示例代码中一样根据文件名、当前页数和总页数来确定
由于插入点是文本左上角,而四个角文本的方向不同,为了让文本更好贴合打印边界又不超出打印边界,该代码根据页面尺寸、打印边距和指定字体字号情况下文本显示所占矩形空间来确定插入点的具体位置
点击执行按钮,遍历一次路径如果有图片需要转化又未被转化,先转化图片为pdf(多线程执行),同时记录所有有待处理的pdf文件数(包括图片转化出来的)
再遍历一次路径,将每个pdf的按照设定参数添加水印(用多线程执行),并且替换原文件。按已处理文件数/总文件数显示进度条,完成后弹窗提示import os
import re
import fitz
from PIL import ImageFont
def text_position(w,h,x,y,width,height,gap):if y<=height/2:if x<=width/2:x=max(x,gap)+hy=gap+wreturn [x,y]else:x=width-gap-wy=max(gap,y)+hreturn [x,y]else:if x<=width/2:x=gap+wy=height-max(gap,height-y)-hreturn [x,y]else:x=width-max(gap,width-x)-hy=height-gap-wreturn [x,y]
def text_size(line,font_family,font_size):font = ImageFont.truetype(font_family, font_size, 0)width, height = font.getsize(line)#DeprecationWarning: getsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use getbbox or getlength instead.return [width,height]
def text_insert_once(x1,y1,x2,y2,x3,y3,x4,y4,text,fname,fsize,page):p = fitz.Point(x2,y2)#右上角page.insert_text(p, # bottom-left of 1st chartext, # the text (honors '\n')fontname = fname, # the default fontfontsize = fsize, # the default font sizerotate = 0, # also available: 90, 180, 270)p = fitz.Point(x3,y3)#左下角,从右往左page.insert_text(p, # bottom-left of 1st chartext, # the text (honors '\n')fontname = fname, # the default fontfontsize = fsize, # the default font sizerotate = 180, # also available: 90, 180, 270)p = fitz.Point(x1,y1)#左上角,从下到上page.insert_text(p, # bottom-left of 1st chartext, # the text (honors '\n')fontname = fname, # the default fontfontsize = fsize, # the default font sizerotate = 90, # also available: 90, 180, 270)p = fitz.Point(x4,y4)#右下角,从上到下page.insert_text(p, # bottom-left of 1st chartext, # the text (honors '\n')fontname = fname, # the default fontfontsize = fsize, # the default font sizerotate = 270, # also available: 90, 180, 270)
def pnum_print(pdf,file,flag=1):pagenum=pdf.page_count i=0for page in pdf:content=[]#假定短边留白5%,长边留白3.3%i=i+1width=page.rect.widthheight=page.rect.height[wx,hx]=[0.06,0.04]if width>= height:#w=round(width*wx,0)h=round(height*wx,0)w=helse:w=round(width*wx,0)h=wfs=int(w/4)text=str(i)+'/'+str(pagenum)content.append(os.path.splitext(file)[0])content.append(text) ff=page.insert_font(fontname="HT",fontfile=r"C:\Windows\Fonts\simhei.ttf", fontbuffer=None , set_simple=False )[x1,y1,x2,y2,x3,y3,x4,y4]=[0,0,width,0,0,height,width,height]for c in content:[w,h]=text_size(c,"simhei.ttf",fs)[x1,y1]=text_position(w,h,x1,y1,width,height,0*w)[x2,y2]=text_position(w,h,x2,y2,width,height,0*w)[x3,y3]=text_position(w,h,x3,y3,width,height,0*w)[x4,y4]=text_position(w,h,x4,y4,width,height,0*w)text_insert_once(x1,y1,x2,y2,x3,y3,x4,y4,c,"HT",fs,page)if pdf.can_save_incrementally():if flag==1:pdf.saveIncr()else:pdf.save(os.path.splitext(file)[0]+'(共'+str(pagenum)+'页)'+'.pdf')print(file+"***********processed")pdf.close()if flag!=1:os.remove(file)#os.remove(file)else:print("Can't save Incermentally")#增量保存的文件损坏和签名问题
def path_read(flag,source):path=[]if flag=="父节点":for p in os.listdir(source):if os.path.isdir(source+'\\'+p):path.append(source+'\\'+p)return pathif flag=="列表文件":with open(source,'r') as f :for p in f.readlines():pp=p.replace('\n','')if os.path.isdir(pp):path.append(pp)return pathreturn None
def pic2pdf(file):img_file=['.png','.jpg',',jepg']title=os.path.splitext(file)[0]if os.path.splitext(file)[1] in img_file:imgdoc = fitz.open(file) # 打开图片pdfbytes = imgdoc.convert_to_pdf() # 使用图片创建单页的 PDFimgpdf = fitz.open("pdf", pdfbytes)doc=fitz.open()doc.insert_pdf(imgpdf) # 将当前页插入文档if os.path.exists(title+".pdf"):os.remove(title+".pdf")doc.save(title+".pdf") # 保存pdf文件doc.close()imgdoc.close()os.remove(file)
img_file=['.png','.jpg',',jepg']
img_convert=True #False #True
#path=path_read(flag="列表文件",source=r'E:\huang\Desktop\路径列表.txt')
path=path_read(flag="父节点",source=r'E:\huang\Desktop\浙江通力传动科技股份有限公司\乐总底稿整理\新建文件夹\内控')
print(path)
for p in path:os.chdir(p)print(p)if img_convert:for file in os.listdir():if os.path.splitext(file)[1] in img_file:pic2pdf(file)for file in os.listdir():if os.path.splitext(file)[1]=='.pdf':print(file)if re.search(r'\(共\d+?页\)',file)==None:pdf_book=fitz.open(file)pnum_print(pdf_book,file,0)相关文章:
审计文件标识作为水印打印在pdf页面边角
目录 说明 说明 将审计文件的所需要贴的编码直接作为水印贴在页面四个角落,节省辨别时间 我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本,现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径,先检测该路…...
leetcode416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...
使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用
首先服务器上需要安装docker已经docker-compose,如果没有,可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关,让所有的容器共用此网…...
深度学习中超参数
深度学习中的超参数(hyperparameters)是决定网络结构的变量(例如隐藏层数量)和决定网络训练方式的变量(例如学习率)。超参数的选择会显著影响训练模型所需的时间,也会影响模型的性能。超参数是在训练开始之前设置的,而不是从数据中学习的参数。超参数是模…...
[JavaScript] 运算符详解
文章目录 算术运算符(Arithmetic Operators)注意事项: 比较运算符(Comparison Operators)注意事项: 逻辑运算符(Logical Operators)短路运算:逻辑运算符的返回值…...
Hooks 使用规则
Hooks 使用规则 命名规则 Hook 必须 useXxx 格式来命名。 PS:这种命名规则也很易读,简单粗暴 调用位置 Hook 或自定义 Hook ,只能在两个地方被调用 组件内部其他 Hook 内部 组件外部,或一个普通函数中,不能调用…...
Ubuntu 24.04 LTS 安装 Docker Desktop
Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版(1h速通) Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...
智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来
文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册:算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《AI智能化办公&am…...
从 JIRA 数据到可视化洞察:使用 Python 创建自定义图表
引言 在项目管理和软件开发中,JIRA 是最广泛使用的工具之一,尤其是在追踪问题、任务和团队进度方面。对于开发者和团队来说,能够从 JIRA 中提取并分析数据,以便更好地理解项目状态和趋势,至关重要。虽然 JIRA 本身提供…...
【网络原理】万字详解 HTTP 协议
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. HTTP 前置知识1.1 HTTP 是什么1.2 HTPP 协议应用场景1.3 HTTP 协议工作过程 2. HTTP 协议格式2.1 fiddler…...
PHP企业IM客服系统
💬 企业IM客服系统——高效沟通,无缝连接的智慧桥梁 🚀 卓越性能,释放无限可能 在瞬息万变的商业环境中,我们深知沟通的力量。因此,基于先进的ThinkPHP5框架与高性能的Swoole扩展,我们匠心独运…...
Linux操作系统的灵魂,深度解析MMU内存管理
在计算机的奇妙世界里,我们每天使用的操作系统看似流畅自如地运行着各类程序,背后实则有着一位默默耕耘的 “幕后英雄”—— 内存管理单元(MMU)。它虽不常被大众所熟知,却掌控着计算机内存的关键命脉,是保障…...
PHP代码审计学习01
目录 两种思路 addslashes函数和magic_quotes_gpc配置: 今天来开php代码审计。 PHP无框架项目SQL注入挖掘技巧。 可以看看小迪老师的学习流程或者说是路线吧。 其中,最下面的代码审计工具推荐用下面两款,fortify,seay。 &…...
《数据思维》之数据可视化_读书笔记
文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 数据之道,路漫漫其修远兮,吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准:准确、有…...
深度学习常见术语解释
正例与负例: 在分类任务中,通常将目标类别称为正例(positive),非目标类别称为负例(negative)。 True Positives(TP): 被正确地划分为正例的个数,…...
重温STM32之环境安装
缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…...
使用Flask和Pydantic实现参数验证
使用Flask和Pydantic实现参数验证 1 简介 Pydantic是一个用于数据验证和解析的 Python 库,版本2的性能有较大提升,很多框架使用Pydantic做数据校验。 # 官方参考文档 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…...
python_在钉钉群@人员发送消息
python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南,适用于群机器人接收消息,处理完一系列的动作之后,将消息返回给发消息的人员,同时该人员。 需要在企微后台新建一个自建应用,在自建应用里…...
C语言之装甲车库车辆动态监控辅助记录系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 (一)…...
线性代数概述
矩阵与线性代数的关系 矩阵是线性代数的研究对象之一: 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础,而矩阵运算则简洁地表示和…...
别再死磕Softmax了!清华黄高团队新作Agent Attention,让Transformer在高分辨率图像上也能飞起来
Agent Attention:突破Transformer高分辨率瓶颈的下一代注意力机制 当你在Stable Diffusion中生成一张4K图像时,是否遇到过显存爆满的尴尬?当用DeiT处理医学影像时,是否因计算资源不足而被迫降低分辨率?这些痛点背后&am…...
交换机堆叠技术实战:从原理到配置的全面解析
1. 为什么需要交换机堆叠? 想象一下你管理着一个中型企业的网络,核心机房里有5台独立工作的交换机。每次新增设备都要手动配置每台交换机,故障时得逐台排查,升级系统更是要一台台操作——这种场景下,交换机堆叠技术就像…...
L6470步进电机驱动库:嵌入式高精度运动控制实现
1. L6470驱动库技术深度解析:面向工业级步进电机控制的嵌入式底层实现1.1 芯片级认知:L6470为何成为高精度运动控制的硬件基石L6470是STMicroelectronics推出的智能步进电机驱动芯片,采用QFN32封装,集成双H桥功率级、12位ADC、SPI…...
AI Coding越来越强,我们还有必要学Processing吗? · 创意编程陕
故障表现 发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...
模拟型对讲系统市场洞察:2026-2032年复合增长率(CAGR)为3.9%
在智慧社区与智能家居快速渗透的背景下,全球模拟型对讲系统市场正经历从主流产品向基础安防设备的定位转变。据恒州诚思最新调研数据显示,2025年全球模拟型对讲系统市场规模达115.4亿元,预计2032年将增至153.0亿元,2026-2032年复合…...
VL53L0X ToF测距模块Arduino驱动库详解
1. 项目概述Deneyap Derinlik ler,即 Deneyap ToF Range Finder Sensor,是一款基于 STMicroelectronics VL53L0X 飞行时间(Time-of-Flight, ToF)测距传感器的国产化 Arduino 兼容模块。该模块由土耳其 Deneyap 教育平台推出&#…...
Spirent TestCenter实战:手把手教你用SAPEE回放MySQL流量做性能压测(附完整配置截图)
Spirent TestCenter深度实战:基于SAPEE的MySQL流量回放与极限性能压测方法论 在当今高并发数据库应用场景中,准确评估MySQL服务器的真实处理能力已成为架构设计的关键环节。传统基准测试工具往往难以模拟真实业务流量特征,而基于Spirent Test…...
【实战解析】陌陌开源 LinkWork(灵工):企业级 AI 员工平台,一岗位一镜像的 K8s Agent 架构全拆解
陌陌开源了 LinkWork(灵工),一个企业级 AI Agent 平台。本文从技术架构(一岗位一镜像、三层能力边界、MCP 工具总线)、部署方式(Docker Compose / K8s)、与 Dify 和 DeerFlow 的对比、适用场景等…...
Ubuntu 24.04 上Ollama的部署、模型管理与服务化实战
1. 为什么选择Ollama搭建本地LLM环境 最近两年,大型语言模型(LLM)的火爆程度有目共睹。但很多开发者遇到一个现实问题:云端API不仅费用高,还存在数据隐私和响应延迟的困扰。这时候Ollama就像及时雨一样出现了——这个不…...
如何免费创建防关联浏览器:VirtualBrowser终极指南
如何免费创建防关联浏览器:VirtualBrowser终极指南 【免费下载链接】VirtualBrowser Free anti fingerprint browser, 指纹浏览器, 隐私浏览器, 防识别浏览器, 反识别浏览器, 防关联浏览器, 免费的web3空投专用指纹浏览器 https://virtualbrowser.cc/?srcgithub …...
