为pdf加水印及js鉴权

最近在做一个文档收集整理,花费好多的功夫整理的pdf文档,随随便便就可以拷贝,所以有了以下的一些需求,便开始琢磨实现

  1. 在创建pdf中加入水印
  2. 嵌入js代码同服务器通信,发送机器设备码及文档ID
  3. 在获得授权时,取消水印

要在PDF文档中实现这些要求,需要以下步骤:

1. 在PDF中加入水印

可以使用Python的reportlab库来创建PDF,并使用PyPDF2库在现有PDF上添加水印。

from reportlab.pdfgen import canvas
from PyPDF2 import PdfReader, PdfWriter

def add_watermark(input_pdf_path, output_pdf_path, watermark_text):
    # Create a watermark PDF
    watermark_pdf_path = "watermark.pdf"
    c = canvas.Canvas(watermark_pdf_path)
    c.setFont("Helvetica", 50)
    c.setFillColorRGB(0.6, 0.6, 0.6, alpha=0.3)
    c.drawString(100, 500, watermark_text)
    c.save()
    
    # Add watermark to existing PDF
    reader = PdfReader(input_pdf_path)
    writer = PdfWriter()
    
    watermark = PdfReader(watermark_pdf_path).pages[0]
    
    for page in reader.pages:
        page.merge_page(watermark)
        writer.add_page(page)
    
    with open(output_pdf_path, "wb") as output_file:
        writer.write(output_file)

# Example usage
add_watermark("input.pdf", "output_with_watermark.pdf", "CONFIDENTIAL")

2. 嵌入JS代码同服务器通信

在PDF文档中嵌入JavaScript可以使用PyPDF2库。注意,嵌入JavaScript是PDF格式的一部分,但并不是所有PDF阅读器都支持运行JavaScript。

from PyPDF2 import PdfWriter, PdfReader

def add_js_to_pdf(input_pdf_path, output_pdf_path, js_code):
    reader = PdfReader(input_pdf_path)
    writer = PdfWriter()

    # Copy existing pages
    for page in reader.pages:
        writer.add_page(page)

    # Add JavaScript
    writer.add_js(js_code)

    with open(output_pdf_path, "wb") as output_file:
        writer.write(output_file)

# Example JavaScript code
js_code = """
var docID = this.documentFileName;
var deviceCode = app.deviceID;
var serverURL = "https://yourserver.com/endpoint";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", serverURL, true);
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send(JSON.stringify({ deviceCode: deviceCode, docID: docID }));
"""

# Example usage
add_js_to_pdf("output_with_watermark.pdf", "output_with_js.pdf", js_code)

3. 在获得授权时,取消水印

取消水印通常意味着重新生成一个没有水印的PDF。当授权成功时,从服务器获取无水印的原始PDF并替换当前的有水印PDF即可。

import requests

def get_authorized_pdf(doc_id):
    # Example function to request the authorized PDF from the server
    response = requests.get(f"https://yourserver.com/get_authorized_pdf/{doc_id}")
    if response.status_code == 200:
        with open("authorized_output.pdf", "wb") as f:
            f.write(response.content)
        print("Authorized PDF received and saved as 'authorized_output.pdf'")
    else:
        print("Failed to get the authorized PDF")

# Example usage
get_authorized_pdf("your_doc_id")

在实现中,请确保以下几点:

  • 服务器能正确响应并提供无水印的PDF。
  • 所有代码运行的环境具备必要的库(如reportlab,PyPDF2,requests)。
  • PDF阅读器支持并允许运行JavaScript(某些安全设置可能禁止)。

通过这些步骤,可以在PDF中嵌入水印、JS代码以与服务器通信,以及在获得授权时取消水印。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容