Python给PDF添加水印(极速版)

使用PyMuPDF给PDF文件添加水印,秒级处理!!!直接上代码

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

def add_watermark_pymupdf(input_pdf, watermark_pdf, output_pdf,
                          position='full', opacity=0.3):
    """
    使用PyMuPDF给PDF添加水印文件

    Args:
        input_pdf: 输入PDF路径
        watermark_pdf: 水印PDF文件路径
        output_pdf: 输出PDF路径
        position: 水印位置 ('full', 'center', 'bottom-right', 'top-left')
        opacity: 水印透明度 (0.0-1.0)

    Returns:
        处理后的PDF路径
    """
    start_time = time.time()

    # 打开源PDF和水印PDF
    src_doc = fitz.open(input_pdf)
    watermark_doc = fitz.open(watermark_pdf)

    # 获取水印页面(假设水印PDF只有一页)
    watermark_page = watermark_doc[0]

    # 获取水印页面尺寸
    watermark_rect = watermark_page.rect
    watermark_width = watermark_rect.width
    watermark_height = watermark_rect.height

    total_pages = len(src_doc)
    print(f"开始处理 {total_pages} 页PDF...")

    # 处理每一页
    for page_num in range(total_pages):
        if page_num % 10 == 0:
            print(f"处理进度: {page_num + 1}/{total_pages}")

        page = src_doc[page_num]
        page_rect = page.rect
        page_width = page_rect.width
        page_height = page_rect.height

        # 全页面覆盖
        scale_x = page_width / watermark_width
        scale_y = page_height / watermark_height
        scale = min(scale_x, scale_y)

        new_width = watermark_width * scale
        new_height = watermark_height * scale

        x = (page_width - new_width) / 2
        y = (page_height - new_height) / 2

        clip_rect = fitz.Rect(0, 0, watermark_width, watermark_height)

        # 创建要插入的矩形区域
        target_rect = fitz.Rect(x, y, x + new_width, y + new_height)

        # 插入水印
        page.show_pdf_page(
            target_rect,  # 在页面上的位置
            watermark_doc,  # 水印文档
            0,  # 水印页码
            clip=clip_rect,  # 裁剪区域
            keep_proportion=True,  # 保持比例
            overlay=True,  # 覆盖模式(作为水印)
            oc=0  # 可选内容组(用于透明度)
        )

    # 保存输出
    src_doc.save(output_pdf)
    src_doc.close()
    watermark_doc.close()

    elapsed = time.time() - start_time
    # print(f"处理完成!耗时: {elapsed:.2f}秒,平均每页: {elapsed / total_pages:.3f}秒")

    return output_pdf

注意 :水印可以直接插入到PDF中,然后使用脚本将水印PDF目标PDF合并

相关推荐
OKkankan2 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
山哥ol3 小时前
【Geany 环境配置与中文乱码解决参考】
python
会飞锦鲤3 小时前
基于 Mask R-CNN 的药片缺陷检测系统
人工智能·pytorch·python·神经网络·resnet-50
默 语3 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
清水白石0084 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
Patrick在香港4 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
IT毕设梦工厂4 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目
GISHUB4 小时前
基于QGIS 3.44开发Python插件完整教程
python·qgis
大数据魔法师4 小时前
curl_cffi从入门到实战
爬虫·python
Sylvia33.5 小时前
火星数据体育API|一站式接入足球篮球电竞等18+项目实时数据
java·开发语言·python·websocket·游戏