算了 ,弟弟长大了 ,看在打不过他的份上 ,就不打他了~
稍加思索 ,我想起了Python不是可以去水印?说搞就搞!
去除水印原理
用 PyMuPDF 打开 pdf 文件 ,将 pdf 的每一页都转换为图片 pixmap
pixmap 有它自己的RGB ,只需要将 pdf 水印中的 RGB 改为(255, 255, 255) ,并保存图片 ;
按照生成的图片 ,插入到pdf文档中;
因为pfd文档无法直接去除水印 ,需要先将pfd文档转换成图片,在逐一对图片进行水印去除操作 ,最后在把图片插入到pdf文档中 。
代码剖析
1 、先查看PDF文档中的水印rgb值是多少
可以看到 ,RGB(179,179,179),因为这里要的是RGB色值总和 ,所以我们就认为 ,超过510,就认为是水印 。
光学三原色是红绿蓝(RGB) ,也就是说它们是不可分解的三种基本颜色 ,其他颜色都可以通过这三种颜色混合而成 ,三种颜色等比例混合就是白色 ,没有光就是黑色。
在计算机中 ,可以用三个字节表示 RGB 颜色 ,1个字节能表示的最大数值是 255 , 所以 ,(255, 0, 0)代表红色 ,(0, 255, 0)代表绿色,(0, 0, 255)代表蓝色 。相应地 ,(255, 255, 255)代表白色 ,(0, 0, 0)代表黑色 。从(0, 0, 0) ~ (255, 255, 255) 之间的任意组合都可以代表一个不同的颜色 。
图片每个位置颜色由四元组表示,前三位分别是 RGB ,第四位是 Alpha 通道 。
2 、pdf转换成图片 ,并去除水印
from PIL import Image
from itertools import product
import fitz
# Python学习交流群:708525271
# 去除pdf的水印
def remove_pdfwatermark():
#打开源pfd文件
pdf_file = fitz.open("源码找落落阿.pdf")
#page_no 设置为0
page_no = 0
#page在pdf文件中遍历
for page in pdf_file:
#获取每一页对应的图片pix (pix对象类似于我们上面看到的img对象,可以读取 、修改它的 RGB)
#page.get_pixmap() 这个操作是不可逆的 ,即能够实现从 PDF 到图片的转换 ,但修改图片 RGB 后无法应用到 PDF 上 ,只能输出为图片
pix = page.get_pixmap()
#遍历图片中的宽和高 ,如果像素的rgb值总和大于510 ,就认为是水印 ,转换成255 ,255,255-->即白色
for pos in product(range(pix.width), range(pix.height)):
if sum(pix.pixel(pos[0], pos[1])) >= 510:
pix.set_pixel(pos[0], pos[1], (255, 255, 255))
#保存去掉水印的截图
pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))
#打印结果
print(f第 {page_no} 页去除完成)
page_no += 1
if __name__ == __main__:
remove_pdfwatermark()
3 、图片转为pdf
from PIL import Image
from itertools import product
import fitz
图片转为pdf
#图片所在的文件夹
pic_dir = F:\123
pdf = fitz.open()
#图片数字文件先转换成int类型进行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split(.)[0]))
for img in img_files:
print(img)
imgdoc = fitz.open(pic_dir + / + img)
#将打开后的图片转成单页pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
#将单页pdf插入到新的pdf文档中
pdf.insertPDF(imgpdf)
pdf.save("源码找落落阿_完成.pdf")
pdf.close()
代码整合
上面的内容都了解以后 ,我们就整合代码 ,直接运行就可以了 。
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
# 打开源pfd文件
pdf_file = fitz.open("源码找落落阿.pdf")
# page_no 设置为0
page_no = 0
# page在pdf文件中遍历
for page in pdf_file:
# 获取每一页对应的图片pix (pix对象类似于我们上面看到的img对象,可以读取 、修改它的 RGB)
# page.get_pixmap() 这个操作是不可逆的 ,即能够实现从 PDF 到图片的转换 ,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片
pix = page.get_pixmap()
# 遍历图片中的宽和高 ,如果像素的rgb值总和大于510 ,就认为是水印,转换成255 ,255,255-->即白色
for pos in product(range(pix.width), range(pix.height)):
if sum(pix.pixel(pos[0], pos[1])) >= 510:
pix.set_pixel(pos[0], pos[1], (255, 255, 255))
# 保存去掉水印的截图
pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))
# 打印结果
print(f第 {page_no} 页去除完成)
page_no += 1
# 去除的pdf水印添加到pdf文件中
def pictopdf():
# 水印截图所在的文件夹
# pic_dir = input("请输入图片文件夹路径:")
pic_dir = F:\123
pdf = fitz.open()
# 图片数字文件先转换成int类型进行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split(.)[0]))
for img in img_files:
print(img)
imgdoc = fitz.open(pic_dir + / + img)
# 将打开后的图片转成单页pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
# 将单页pdf插入到新的pdf文档中
pdf.insertPDF(imgpdf)
pdf.save("源码找落落阿_完成.pdf")
pdf.close()
if __name__ == __main__:
remove_pdfwatermark()
pictopdf()
# 兄弟们学习python ,有时候不知道怎么学 ,从哪里开始学 。掌握了基本的一些语法或者做了两个案例后 ,不知道下一步怎么走 ,不知道如何去学习更加高深的知识 。
# 那么对于这些大兄弟们 ,我准备了大量的免费视频教程 ,PDF电子书籍 ,以及源代码!
# 直接在这个抠裙 708525271 自取即可~
总结
pdf文档需要先转换成图片 ,进行水印去除;
再转换成pdf ;
最后插入到新的pdf文档中;
写到这里,今天的分享就差不多快结束了 ,咱们下次再见!
声明:本站所有文章 ,如无特殊说明或标注,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。