一日一技:如何批量给PDF添加水印?
我们有时候需要把一些机密文件发给多个客户,为了避免客户泄露文件,会在机密文件中添加水印。每个客户收到的文件内容相同,但是水印都不相同。这样一来,如果资料泄露了,通过水印就知道是从谁手上泄露的。今天,一个做市场的朋友找我咨询一个加水印的问题,如下图所示:他有一个Excel文件,文件里面有10000个经销商的名字,他要把价目表PDF发给这些经销商,每个经销商收到的PDF文件上面的水印都是这个经销商自己的名字。这个需求手动操作肯定要累死人。但是如果用Python来做,就非常简单。代码不超过30行。准备环境要完成这个需求,需要安装两个模块,分别叫做reportlab和pikepdf。使用Pip安装就可以了:1python3 -m pip install reportlab pikepdf然后,需要找到一个.ttf..
更多如何在 ESP8266 上选用合适的引脚
本文是“攻玉计划”的一部分,翻译自 https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/本文旨在介绍 ESP8266 的引脚定义、引脚功能及如何使用它们。ESP-12E 模块拥有 17 个 GPIO 引脚。但在各个开发板上,ESP8266 芯片的 GPIO 引脚并不一定全部引出,而且某些引脚不建议使用,某些引脚有非常特殊的功能。本文将指导你如何正确使用 ESP8266 的各个 GPIO,避免用错引脚而浪费时间。ESP12-E 模块引脚定义下图阐述了 ESP-12E 模块的引脚定义。当你的项目使用裸 ESP-12E/F 模块的时候,可以参考此图。🔵注意:某些开发板可能不能使用全部的引脚,但相同的引脚在不同的开发板上,功能肯定是一样的..
更多【读书笔记】数据结构与算法分析 - C 语言描述 - 第五部分 - 图算法
第十七章 图的性质图的定义:元素的集合 + 元素之间连接的集合图论是组合数学的一个主要分支图的应用例子:地图;超文本;电路;调度;事务;匹配;网络;程序结构任何链式结构都是图的一种表示树和链表的算法都是图算法的特例算法的开销:元素集性质 + 连接集性质术语:图:顶点集 + 边集约定:V:顶点数;E:边数边将一对不同的顶点连接在一起,每对顶点间至多有一条边连接重复边(平行边):每对顶点间可有任意边相连(多重图)自环:顶点连接到自身的边简单图:无重复边 + 无自环带自环的多重图边数:V 个顶点至多有 V(V-1)/2 条边称谓:点:顶点、结点(数据结构)边:边、链接(数据结构)、弧关系:一条边连接两个顶点两个顶点是相互邻接的:A、B 相互邻接这条边是依附于这两个顶点的:C 依附于 A、B顶点的度:依附于这个顶..
更多【读书笔记】数据结构与算法分析 - C 语言描述 - 第四部分 - 搜索
第十二章 符号表和二叉搜索树符号表:操作:插入:插入一个数据项搜索:搜索一个具有给定关键字的数据项(或若干数据项)删除:删除一个特定数据项选择:选出第 k 个最小数据项排序:按关键字顺序访问所有数据项连接:连接两个符号表有相同关键字时:不同关键字的数据项 + 对于每个关键字有一条链表用于指向相同关键字相同关键字不隐藏,在一次搜索中返回所有唯一标识每个数据项手指搜索(Finger search):搜索可从以前结束的地方开始范围搜索:统计或访问落入某个区间的节点近邻搜索:查找距离某点最近的关键字(数据项)计数(Count)操作:懒方法:Count() 函数积极方法:局部变量关键字索引搜索:适用于关键字的值是不同的小整数原理:对数组中的数据项排序,然后按关键字进行索引无任何数据项(只有关键字)时:可使用位表:把..
更多【读书笔记】数据结构与算法分析 - C 语言描述 - 第三部分 - 排序
第六章 基本排序方法基本的意思是:适用于小规模或特殊结构基本排序方法之间的时间复杂度只相差常数因子:都与 N^2 成正比可用来改进更复杂算法的效率不占用额外的内存空间排序:内部排序:任意访问元素外部排序:必须顺序访问数组:适合顺序分配链表:适合链式分配非适应性:所执行的操作序列独立于数据顺序(只使用了比较-交换操作),适于硬件实现自适应性:操作序列与比较结果有关,大部分算法都是这类减少开销:换成更高效的算法缩短内部循环额外内存空间:原位排序:小堆栈或表引用数据:N足够空间:副本稳定的:相同关键字排序后位置不变不稳定的:相同关键字排序后位置改变强制稳定:改用稳定排序较好排序前为各关键字添加小索引加长关键字访问的元素过大:使用间接排序选择排序:选出最小(最大)元素,与第一个元素交换,然后对除第一个元素外的其余..
更多【读书笔记】数据结构与算法分析 - C 语言描述 - 第二部分 - 数据结构
第三章 基本数据结构客户-接口-实现数组:固定有序存储空间相邻:适合访问而不是操纵两种常见错误:引用了无意义的 a[i] 内容没有保证 i 非负且小于数组大小查找(索引):在链表中需要遍历,效率不高与向量(矢量)对应二维数组:矩阵 + 主序链表:逻辑有序高效重排数据项:适合操纵而不是访问可优雅地增大和缩小自引用结构 + 循环结构末尾节点的实现细节:不指向任何节点的空链接指向不包含元素节点的哑元节点循环链表:指向第一个节点(首节点)在开头保留头节点:无数据域链域指向真正的第一个节点好处:把链表指针作为参数,使函数可修改链表,可接受或返回一个空表不保留头节点时:把指向输入链表的指针作为参数,返回输出链表的指针。这种方法适合递归链表插入:在数组中需要移动元素,效率不高删除:遍历两种常见错误:引用了未定义的指针使..
更多【读书笔记】数据结构与算法分析 - C 语言描述 - 第一部分 - 基础知识
第一章 引言连通性问题:两个操作:查找(find)、并集(union)快速-查找(quick-find):N 个对象,M 次合并:MN快速-合并(quick-union):N 个对象,M 对:MN/2加权快速-合并(weighted quick-union):遍历 2lgN 个指针:线性带等分路径压缩的加权快速-合并:保证线性在线算法(online):能处理的数据没有限制第二章 算法分析的原理算法分析的种类:最坏情况(Worst Case):任意输入规模的最大运行时间(Usually)在任何输入下运行时间的一个上界平均情况(Average Case):任意输入规模的期待运行时间(Sometimes)最佳情况(Best Case):通常最佳情况不会出现(Bogus)基本思路:忽略掉那些依赖于机器的常量关注运..
更多【读书笔记】Go 程序设计语言
第一章 入门分号注入规则:编译器会将特定符号后的换行符(\n)转换成分号(;){ 必须和 func 在同一行x + y合法:1 2 x + y非法:1 2 x + y所有子序列操作都使用半开区间:包含第一个索引(省略则为0),不包含第二个索引(省略则为len(s)),也可以都省略 s[:]三索引切片:在现有数组或切片下,使用第二个冒号来指示新生成的切片的容量gofmt 会按照字母顺序表(字典顺序)对 import 中导入的包排序初始化:s := "" 显式初始化说明初始值的重要性var s string 隐式初始化说明初始值不重要map 包含一个引用,当传参时按值传递(副本),但因为是引用类型所以可以在函数体内修改并外部可见结构体类型转换忽略标签:结构体类型转换时,标签会被忽略。也就是说,标签不同的结构体..
更多【读书笔记】刻意练习 - 如何从新手到大师
前言长时工作记忆正是区分卓越者与一般人的一个重要能力,它才是刻意练习的指向与本质。刻意练习的任务难度要适中,能收到反馈,有足够的次数重复练习,学习者能够纠正自己的错误。长时工作记忆的培养要点:赋予意义,精细编码:(准)专家们能非常快地明白自己领域的单词与术语,在存储信息的时候,可以有意识地采取元认知的各项加工策略;提取结构或模式:往往需要将专业领域的知识,提取结构或模式以更好地方式存储;加快速度,增加连接:通过大量重复的刻意练习,专家在编码和提取过程方面比新手都快很多,增加了长时记忆与工作记忆之间的各种通路。认知复杂性高与认知复杂性低的学习活动的差异在很大程度上表现为隐性知识的多少与比重。认知复杂度高的人具有高度复杂化的思维能力,更善于同时使用互补与互不相容的概念来理解客观世界。人的学习受到情境的制约和促..
更多【读书笔记】国富论
前言作者着眼于他所观察到的尚未出现工业革命的世界经济,首次系统分析了国民财富产生、分配与持续运转的内在规律。他认为人类利己的动机就像一只看不见的手,在暗中推动一切经济行为,同时强调政府应尽可能少地干预,并给予贸易自由的发展。近代以来,一个国家真正的崛起,更多取决于它是否在经济上崛起,纯粹靠军事征服和领土扩张而实现的崛起,很难长久维系。以劳动价值论为基础,以增加国民财富为主线,以资本主义社会3个阶级的3种收入理论为核心,总结出国民财富增长的两种途径:分工与劳动生产率的提高;增加劳动者人数和资本积累。重要观点:分工的重要性劳动价值理论自由贸易的主张“看不见的手”规范政府的职责第一篇 论劳动生产力增进的原因,以及劳动生产物自然分配给各阶级人民的顺序第1章 论分工凡是能够分工的工作,一旦使用分工制,就能够相应地增..
更多