创建需要的水印模板
wps创建
![wps创建](https://i-blog.csdnimg.cn/blog_migrate/69ce90ced6ad39012df6418c32c78f15.png)
输出pdf
![输出pdf](https://i-blog.csdnimg.cn/blog_migrate/1d5997af3ccfc08241e4d001877452f7.png)
- 水印pdf
![pdf](https://i-blog.csdnimg.cn/blog_migrate/4785fbf26823539ee40b7c9e0158d89e.png)
python配置
安装依赖
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:
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]:
file_list = []
for a, b, c in os.walk(folder):
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):
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_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)
- 如果出现该错误,可以参考一这篇文章。
感悟
- 此代码的创新点在于可以实现文件夹遍历添加水印。
- 其实第一点也没有什么,我感觉我最有成功感的就是
write_watermark
函数里那段try except
语句处,这个一段代码解决pdf空白页而发送的错误。解决了一天,网络上都没有解决方法。我摸着石头过河。 - 有一个问题就是,这个代码对于图片pdf的水印效果不好,因为图片pdf的也页面大小比普通的文字pdf大一些,难以控制水印的位置。我想的是在创建水印pdf的时候就把pdf的大小放大。