相关文章推荐
大气的手电筒  ·  spring ...·  1 年前    · 
  • 昨天想给 pdf 添加个水印,结果 wps 居然需要收费,果断选择写一个 pdf 文件水印添加工具
  • 本工具能够自适应的为 pdf 文件每页添加水印
  • 本工具完全由 Python 编写,支持脚本运行和编译器内执行
  • 同时支持如下自定义
    • 水印文字 (text)
    • 水印透明度 (alpha)
    • 水印字体 (font)
    • 水印字体大小 (size)
    • 水印旋转角度 (angle)
  • Python: 3.7.0
  • pypdf2: 3.0.1
  • reportlab: 3.6.12

核心代码分析

创建水印函数
  • 函数的签名如下
def create_watermark(content, width, height, args)
  • 函数需传入四个参数
    • content: 水印文字
    • width: pdf 当前页的宽
    • height: pdf 当前页的高
    • args: 命令行参数
  • 为了自适应 pdf 每页,使得在不同大小的页面添加水印时均能够以合适的大小添加水印文字
  • 代码中计算了当前页面与标准 A4 页面宽高的比例
# 比例,用于自适应 pdf 页面大小
width = float(width) * 0.0352
height = float(height) * 0.0352
ratio_w = width / 21
ratio_h = height / 29.7
  • 并在设置字体字号和绘制文本部分对相应数值进行修正
# 设置字体,默认采用 SimSun 字体
c.setFont(args.font, args.size * (ratio_w + ratio_h) / 2)
# 画几个文本,注意坐标系旋转的影响
for i in range(5):
    for j in range(10):
        # 使用 比例 自适应水印文字位置
        a = 10 * (i - 1) * ratio_w
        b = 5 * (j - 2) * ratio_h
        c.drawString(a * cm, b * cm, content)
添加水印函数
  • 函数的签名如下
def add_watermark(pdf_file_in, pdf_file_out, args)
  • 函数需传入三个参数

    • pdf_file_in: 需添加水印文件的路径
    • pdf_file_out: 添加水印后文件的输出路径
    • args: 命令行参数
  • 使用 pypdf2 库中的 PdfWriter 类创建 pdf 文件写出对象

  • 根据 pdf_file_in 读取 pdf 文件,并使用 PdfReader 类创建 pdf 文件对象

pdf_output = PdfWriter()
input_stream = open(pdf_file_in, 'rb')
pdf_input = PdfReader(input_stream, strict=False)
  • 对每一页 pdf 分别添加水印
  • 每次获取每页的实际宽高,与前一页对比,若不一致则重新根据当前页面生成水印文件
# 给每一页打水印
for i in range(pageNum):
    page = pdf_input.pages[i]
    # 获取当前页面实际宽高
    width = pdf_input.pages[i].mediabox.width
    height = pdf_input.pages[i].mediabox.height
    if width != last_width or height != last_height:
        pdf_file_mark = create_watermark(watermark_text, width, height, args)  # 生成水印文件
        pdf_watermark = PdfReader(open(pdf_file_mark, 'rb'), strict=False)  # 读入水印pdf文件
        last_width = width
        last_height = height
    page.merge_page(pdf_watermark.pages[0])
    page.compress_content_streams()  # 压缩内容
    pdf_output.add_page(page)
pdf_output.write(open(pdf_file_out, 'wb'))
  • 为实现脚本方式执行,使用 argparse 库定义命令行解析器对象并添加命令行参数
# 定义命令行解析器对象
parser = argparse.ArgumentParser(description='WaterMarker of argparse')
# 添加命令行参数
parser.add_argument('--text', default='watermark', help="Text to add watermark")
parser.add_argument('-F', '--file', default='', help="The path to the file to add the watermark to")
parser.add_argument('--font', default='SimSun', help="Font used for watermark text")
parser.add_argument('--size', type=int, default=30, help="Font size used for watermark text, defaults to 30, "
                                                         "the size will adjust itself as the page changes")
parser.add_argument('--alpha', type=float, default=0.1, help="Transparency of watermark text, between 0.0 and 1.0")
parser.add_argument('--angle', type=int, default=30, help="Rotate the canvas by the angle theta (in degrees)")
parser.add_argument('-O', '--output', default='', help="File output path after adding watermark (including the "
                                                       "file name), the default is the original file directory")
# 从命令行中结构化解析参数
args = parser.parse_args()
  • 对命令行参数进行分析,以避免用户重复输入水印文字或者需添加水印的 pdf 文件
# 检查命令行参数 text 的值是否为默认值,是则要求用户输入水印文字,若用户输入空,则采用命令行参数的默认值
# 若命令行参数的值不为默认值,则跳过用户输入水印文字
text = ''
if args.text == 'watermark':
    text = input("请输入水印文字:")
watermark_text = args.text if text == '' else text
# 处理方式与上类似
pdf_file_in = ''
if args.file == '':
    pdf_file_in = input("请输入文件路径:").strip('"').strip(' ')
else:
    pdf_file_in = args.file
  • 同时对文件进行了限制,以确保传入文件为 pdf 格式
if os.path.splitext(pdf_file_in)[-1] == ".pdf":
     pdf_file_in = pdf_file_in.replace('\\', '/')
     # 文件输出路径
     if args.output == '':
         pdf_file_out = pdf_file_in.replace('.pdf', '') + '(添加水印).pdf'
     else:
         pdf_file_out = args.output.replace('\\', '/')
     add_watermark(pdf_file_in, pdf_file_out, args)
     print("添加水印成功")
     print("文件路径为: {}".format(pdf_file_out.replace('/', '\\')))
 else:
     print("输入文件不为pdf格式!!!")
  • 由于支持使用脚本运行,以下内容将重点介绍脚本执行方式
脚本具体参数如下
optional arguments:
  -h, --help            show this help message and exit
  --text TEXT           Text to add watermark
  -F FILE, --file FILE  The path to the file to add the watermark to
  --font FONT           Font used for watermark text
  --size SIZE           Font size used for watermark text, defaults to 30, the
                        size will adjust itself as the page changes
  --alpha ALPHA         Transparency of watermark text, between 0.0 and 1.0
  --angle ANGLE         Rotate the canvas by the angle theta (in degrees)
  -O OUTPUT, --output OUTPUT
                        File output path after adding watermark (including the
                        file name), the default is the original file directory
  • 以下为具体使用案例,其中除 -F-O 参数外均为默认值
  • 若未使用 --text-F 参数将会要求用户手动输入
python watermarker.py --text "WaterMarker" -F "C:\test.pdf" --font "SimSun" --alpha 0.1 --size 30 --angle 30 -O "./result.pdf"

                                    PDF水印添加工具使用教程:
	1、示例:https://img-blog.csdnimg.cn/d900fbcec2944948b4dd50bf38a31304.png
	2、《PDF水印添加工具V1.1.exe》 工具双击即可打开,无需安装。
	3、原始PDF文件路径:必填,输入原始PDF文件路径即可,例如:C:\Users\Desktop\PDF水印添加工具.pdf		
	4、带水印PDF文件路径:可以不填,不填则生成的带水印文件路径是"原始PDF文件路径"添加上(带水印)。
	5、需要添加水印的页数:可以不填,传0则代码pdf所有页都添加水印,传5则代码在PDF文件第5页添加水印。
	6、水印横坐标:可以不填,针对页面横向移动距离。
	7、水印纵坐标:可以不填,针对页面纵向移动距离。
	8、水印倾斜角度:可以不填,水印的角度,可以为负数:例如-30。
	9、水印透明度:可以不填,0~1之间的数字,越接近0则越透明,越接近1则水印越明显。
	10、字体大小:可以不填,正整数,数字越大字体越大。
	11、水印内容:可以不填,需要添加水印内容。
	12、点击按钮即可添加。
<!--依赖springboot-start中dependencyManagement的版本-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}&
                                    PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。
最近下了几本pdf电子书,但是讨厌的是里面有水印,而且水印还带有超链接,稍不注意就会打开一个网页,真是烦透了。于是找了几个方法,终于让我成功将水印去除
首先,看看文档有没有加密,如果加密需先用解密软件Advanced PDF Password Recovery解密。
然后,就进行解密操作。
                                    安全问题不能大意,对于一些比较敏感的内容,我们可以通过水印方案,最大程度地给浏览者警示的作用,减少泄密的情况,甚至泄密了,也有可能追踪到泄密者。
watermark-plus,使用简单,可防止手动删除水印;支持Vue、React等JS框架;
支持文本水印;
支持图片水印;
可防止被删除;
可防止重复渲染;
可动态适应超长水印文本;
高清晰度;
支持浏览器端打印;
可配置性强;
支持自定义水印内容(排版、样式、内容);
                                    PDF文件怎么给它添加水印呢?PDF文件相信大家在日常中经常会使用到,因为它的独特优势让我们传输文件都会选择PDF格式。但是我们在传输文件的过程中,或者是打印出来的PDF文件,极有可能会被别人直接拿去使用,我们的合法权利就会收到侵害。如何解决呢?其实我们可以给文件添加水印,今天教大家三种添加水印的方法,一起来学习吧。
                                    在工作中,我们经常都会给一些重要文件加上水印,不过有时候我们要去掉水印就有点麻烦了,很多小伙伴都不知道怎么将文档的水印删除,今天小编就跟大家分享各种水印的删除方法,针对不同情况,我们可以采取不同的方法来去水印~一、Word去水印1、直接删除法如果是用Word添加水印,我们可以这样删除:最简单的方法,点击【设计】——【页面背景】——【水印】——【删除水印】按钮,即可一键删除。2、自定义水印删除另一...
                                    环境准备开发环境java8,SpringBoot 2.1.4,字符集GBK字体宋体--simsun.ttfpom依赖org.springframework.bootspring-boot-starter-freemarkercom.itextpdfkernel7.0.3com.itextpdfio7.0.3com.itextpdfforms7.0.3com.itextpdffont-asian7....
                                    本文实例为大家分享了java pdf水印的具体代码,供大家参考,具体内容如下引入依赖com.itextpdf.toolxmlworker5.5.10com.itextpdfitextpdf5.5.10‘/static/fonts/SIMYOU.TTF' 字体 本机没有的话, 可以百度下载/*** pdf水印** @return*/public byte[] pdfAddWaterMark(b...