Python实现为pdf添加水印功能

目录
  • 创建需要的水印模板
    • wps创建
    • 输出pdf
    • 水印pdf
  • 实现步骤
    • 安装依赖
    • 代码
  • 问题
    • 使用pypdf2出现编码问题
    • 解决方法
  • 感悟

创建需要的水印模板

wps创建

输出pdf

水印pdf

实现步骤

安装依赖

pip install PyPDF2

代码

import os
from PyPDF2 import PdfFileReader as pr
from PyPDF2 import PdfFileWriter as pw

def write_watermark(watermark_pdf_path: str, target_pdf_path: str):
    result_pdf = pw()
    pdf_file_name = os.path.basename(target_pdf_path)
    f_target = open(target_pdf_path, 'rb')
    f_watermark = open(watermark_pdf_path, 'rb')
    target_pdf = pr(f_target)
    watermark_page = pr(f_watermark).getPage(0)
    for page in range(target_pdf.getNumPages()):
        try: # 这一段try except是一个让我超级麻烦的bug,让我解决了一天。
            target_pdf.getPage(page).mergePage(watermark_page)
            result_pdf.addPage(target_pdf.getPage(page))
        except Exception as e:
            result_pdf.addPage(watermark_page)
    if not os.path.exists("output"):
        os.makedirs("output")
    result_pdf.write(open("output/已添加水印_" + pdf_file_name, 'wb'))
    f_target.close()
    f_watermark.close()

def folder_pdf_files(folder: str) -> list[str]:  # 一个文件夹里面有多少pdf文件
    file_list = []
    for a, b, c in os.walk(folder):
        if b == []:
            for filename in c:
                if filename[-3:].lower() == 'pdf':
                    file_path = os.path.join(a, filename)
                    file_list.append(file_path)
    print(folder, ": 有", len(file_list), "个pdf文件")
    return file_list

def group_write_watermark(path_array: list[str], watermark_pdf_path: str):  # 一组pdf文件添加水印
    for pdf_path in path_array:
        print(pdf_path, "添加水印中...")
        write_watermark(watermark_pdf_path, pdf_path)
    print("完成")

if __name__ == '__main__':
    watermark_pdf_path = "水印文件.pdf"
    folder_pdf = "目录"  # 需要添加水印的pdf的目录
    pdf_list = folder_pdf_files(folder_pdf)
    group_write_watermark(pdf_list, watermark_pdf_path)

问题

UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 8-9: ordinal not in range(256)

如果出现该错误,可以参考以下内容。

使用pypdf2出现编码问题

报错信息

‘latin-1’ codec can’t encode characters in position 8-11: ordinal not in range(256)

通常这情况是出现了中文字符编码问题

以下是使用pypdf2复制 pdf 时报错信息

//报错信息
<ipython-input-1-4f7e1b354328> in <module>()
     14      output.addPage(p)
     15 with open('D:\\Program Files\\2.pdf', 'wb') as f:
---> 16     output.write(f)

D:\Program Files (x86)\anaconda\lib\site-packages\PyPDF2\pdf.py in write(self, stream)
    499                 md5_hash = md5(key).digest()
    500                 key = md5_hash[:min(16, len(self._encrypt_key) + 5)]
--> 501             obj.writeToStream(stream, key)
    502             stream.write(b_("\nendobj\n"))
    503 

D:\Program Files (x86)\anaconda\lib\site-packages\PyPDF2\generic.py in writeToStream(self, stream, encryption_key)
    547             key.writeToStream(stream, encryption_key)
    548             stream.write(b_(" "))
--> 549             value.writeToStream(stream, encryption_key)
    550             stream.write(b_("\n"))
    551         stream.write(b_(">>"))

D:\Program Files (x86)\anaconda\lib\site-packages\PyPDF2\generic.py in writeToStream(self, stream, encryption_key)
    470
    471     def writeToStream(self, stream, encryption_key):
--> 472         stream.write(b_(self))
    473
    474     def readFromStream(stream, pdf):

D:\Program Files (x86)\anaconda\lib\site-packages\PyPDF2\utils.py in b_(s)
    236             return s
    237         else:
--> 238             r = s.encode('latin-1')
    239             if len(s) < 2:
    240                 bc[s] = r

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-11: ordinal not in range(256)

解决方法

1、修改pypdf2包中的generic.py文件

由于我使用的是anaconda,路径为anaconda\Lib\site-packages\PyPDF2\generic.py

generic.py文件第488行原文

try:
   return NameObject(name.decode('utf-8'))
   except (UnicodeEncodeError, UnicodeDecodeError) as e:
   # Name objects should represent irregular characters
   # with a '#' followed by the symbol's hex number
   if not pdf.strict:
      warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
      return NameObject(name)
   else:
      raise utils.PdfReadError("Illegal character in Name Object")

改成

try:
     return NameObject(name.decode('utf-8'))
 except (UnicodeEncodeError, UnicodeDecodeError) as e:
     try:
         return NameObject(name.decode('gbk'))
     except (UnicodeEncodeError, UnicodeDecodeError) as e:
         # Name objects should represent irregular characters
         # with a '#' followed by the symbol's hex number
         if not pdf.strict:
             warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
             return NameObject(name)
         else:
             raise utils.PdfReadError("Illegal character in Name Object")

2、修改pypdf2包中的utils.py文件

utils.py238行原文

 r = s.encode('latin-1')
 if len(s) < 2:
   		bc[s] = r
 return r

修改为

try:
    r = s.encode('latin-1')
    if len(s) < 2:
        bc[s] = r
    return r
except Exception as e:
    print(s)
    r = s.encode('utf-8')
    if len(s) < 2:
        bc[s] = r
    return r

问题解决

感悟

此代码的创新点在于可以实现文件夹遍历添加水印。

其实第一点也没有什么,我感觉我最有成功感的就是write_watermark函数里那段try except语句处,这个一段代码解决pdf空白页而发送的错误。解决了一天,网络上都没有解决方法。我摸着石头过河。

有一个问题就是,这个代码对于图片pdf的水印效果不好,因为图片pdf的也页面大小比普通的文字pdf大一些,难以控制水印的位置。我想的是在创建水印pdf的时候就把pdf的大小放大。

到此这篇关于Python实现为pdf添加水印功能的文章就介绍到这了,更多相关Python pdf水印内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 2行Python代码实现给pdf文件添加水印

    目录 1. 引言 2.指定水印内容输出到pdf文件 2.1 模块安装 2.2 思路 2.3 代码示例 3.水印内容批量输出到pdf文件 3.1 模块安装 3.2 思路 3.3 代码示例 4.总结 1. 引言 小屌丝:鱼哥,新年快乐! 小鱼:无事不登三宝殿,有啥事,你直说吧… 小屌丝:别说的这么直接,这大过年的… 小鱼:别整没用的,就你那点小心思,我还能不知道. 小屌丝:… 小屌丝:鄙视就鄙视,只要能帮我解决问题,我然你鄙视三连! 小鱼:…还可以这样,那你说吧,啥事? 小屌丝:就是…就是… 小鱼:

  • Python实现给PDF添加水印的方法

    前言 利用 PyPDF2 处理 PDF 文件,相关文档:https://pythonhosted.org/PyPDF2/ 本文针对 仅有 PDF 文件,而无相关 PDF 编辑器的情况下,给 PDF 添加水印. 一.前期准备 安装 PyPDF2 ,命令提示框输入: pip install PyPDF2 新建 watermark.pdf 文件 实际的水印,可以在此文件里修改水印文字的字体和位置. 实现步骤: 新建 watermark.word ,[设计] → \to → [水印][自定义水印] →

  • Python实现批量向PDF文件添加中文水印

    目录 前言 实现步骤 完整代码 前言 可以通过设置批量PDF文件所在的路径及需要添加的水印名称可以实现批量添加PDF水印的效果. 实现思路是这样的,通过在批量PDF文件路径下面生成一个带有水印的PDF模板.最后,将批量文件的每个PDF页面和水印模板进行合并完成批量添加水印的效果. 需要注意的是批量PDF文件必须和PDF模板水印文件的大小尺寸保持一致,这个可以在代码里面调节一下就成了. 实现步骤 首先将需要添加水印的PDF文件准备好放在一个文件夹下面. 在代码中设置好PDF批量文件的路径及水印名称

  • Python实现为pdf添加水印功能

    目录 创建需要的水印模板 wps创建 输出pdf 水印pdf 实现步骤 安装依赖 代码 问题 使用pypdf2出现编码问题 解决方法 感悟 创建需要的水印模板 wps创建 输出pdf 水印pdf 实现步骤 安装依赖 pip install PyPDF2 代码 import os from PyPDF2 import PdfFileReader as pr from PyPDF2 import PdfFileWriter as pw def write_watermark(watermark_pd

  • Python实现html转换为pdf报告(生成pdf报告)功能示例

    本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能.分享给大家供大家参考,具体如下: 1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装python包:pip Install pdfkit 系统安装wkhtmltopdf:参考 https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf mac下的wkhtmltopdf: brew install Caskro

  • 详解Python如何实现批量为PDF添加水印

    目录 准备环境 获得经销商名字对应的列表 生成水印PDF 合并水印与目标PDF 总结 我们有时候需要把一些机密文件发给多个客户,为了避免客户泄露文件,会在机密文件中添加水印.每个客户收到的文件内容相同,但是水印都不相同.这样一来,如果资料泄露了,通过水印就知道是从谁手上泄露的. 今天,一个做市场的朋友找我咨询PDF加水印的问题,如下图所示: 他有一个Excel文件,文件里面有10000个经销商的名字,他要把价目表PDF发给这些经销商,每个经销商收到的PDF文件上面的水印都是这个经销商自己的名字.

  • 两行Python代码实现pdf转word功能

    目录 一.安装依赖包 二.pdf转word 2.1 代码实现 2.2 pdf内容 2.3 转换后的word 补充 一.安装依赖包 pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ python-office 二.pdf转word 2.1 代码实现 import office office.pdf.pdf2docx(file_path = 'test.pdf') 运行过程如下: [1/4] Opening document..

  • Python玩转PDF的各种骚操作

    Portable Document Format(可移植文档格式),或者PDF是一种文件格式,可以用于跨操作系统的呈现和文档交换.尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO)维护的开放标准.你可以通过使用PyPDF2包在Python中处理已先存在的PDF. PyPDF2是一个纯Python包,可用于许多不同类型的PDF操作. 本文将带你了解如何执行以下操作: 从Python中提取PDF中的文档信息 旋转页面 合并PDF 拆分PDF 添加水印 加密PDF 一.pyPdf

  • windows下Python实现将pdf文件转化为png格式图片的方法

    本文实例讲述了windows下Python实现将pdf文件转化为png格式图片的方法.分享给大家供大家参考,具体如下: 最近工作中需要把pdf文件转化为图片,想用Python来实现,于是在网上找啊找啊找啊找,找了半天,倒是找到一些代码. 1.第一个找到的代码,我试了一下好像是反了,只能实现把图片转为pdf,而不能把pdf转为图片... 参考链接:https://zhidao.baidu.com/question/745221795058982452.html 代码如下: #!/usr/bin/e

  • python实现从pdf文件中提取文本,并自动翻译的方法

    针对Python 3.5.2 测试 首先安装两个包: $ pip install googletrans $ pip install pdfminer3k googletrans会提供一个命令translate,这个命令会调用google translate api执行自动翻译: pdfminer3k会提供一个工具脚本pdf2txt.py: $ pdf2txt.py xxx.pdf 从stackoverflow搜索到可以去除页眉和页脚的命令(强烈推荐): 使用Ubuntu提供的pdftotext

  • python 实现批量文件加密功能

    目录 一.源码 1.结果展示 2.源码 二.源码注释 1.所使用依赖包 2.函数功能 3.代码拓展 三.可运行环境 一.源码 1.结果展示   python自动化办公现在可不是一个陌生的词,也随着人们对自己隐私越来越看重,就会出现这样的需求:每人一个PDF文件,因有个人隐私信息,所以需要对文件进行加密且密码为本人身份证后六位.   废话不多说,上结论,程序运行结果如下:   我们去一探究竟,原文件如下:    获取密码如下:   将文件加密以后结果如下:   我们随机打开一个验证一下:   输入

  • Python实现为PDF去除水印的示例代码

    目录 前言 原理 特色 成果 安装依赖 代码 想法 前言 为什么做出这个? 就是有时候从网上下载的资料中的pdf有水印,看着不舒服. 比如说我从网上下载的试卷,然后去打印店打印,打印之后水印看着很不舒服,而去水印wps要会员,而我是一个程序员,为什么不做一个呢,何乐而不为. 虽然最后是做出来的,但是还是有限制. 原理 把pdf转化为图片,然后将图片去水印. 图片去水印,是又条件限制的,必须水印的颜色和pdf中文字的颜色的rgb相差很大,然后把水印的颜色改变成背景颜色. 特色 网上很多和我类似的原

随机推荐