From 1c9d539653568f066e837ebdf71a52ba183b23f7 Mon Sep 17 00:00:00 2001 From: hmo Date: Mon, 27 Apr 2026 20:11:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20watermark=20to=20generated=20PDF?= =?UTF-8?q?=20(=E4=BB=85=E4=BE=9B=E5=AD=A6=E4=B9=A0=E5=8F=82=E8=80=83,=20d?= =?UTF-8?q?iagonal,=20semi-transparent)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/pdf_generator.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/services/pdf_generator.py b/app/services/pdf_generator.py index bb97230..7633bb6 100644 --- a/app/services/pdf_generator.py +++ b/app/services/pdf_generator.py @@ -11,6 +11,7 @@ from reportlab.platypus import ( from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.enums import TA_CENTER, TA_LEFT +from reportlab.pdfgen import canvas as pdfcanvas # 注册中文字体 # Windows 和 Linux 使用不同路径 @@ -269,5 +270,23 @@ def generate_pdf(plan_id, student_name, content, output_dir, rendered_report=Non elif line: pdf.add_paragraph(line) - doc.build(pdf.elements) + # 水印函数(每页都绘制) + def draw_watermark(c, doc): + if not CHINESE_FONT_OK: + return + c.saveState() + try: + c.setFont("Chinese", 14) + # 浅灰色半透明 + c.setFillColor(colors.Color(0.6, 0.6, 0.6, alpha=0.25)) + # 旋转45度 + c.translate(A4[0]/2, A4[1]/2) + c.rotate(45) + # 绘制水印文字(居中) + c.drawCentredString(0, 0, "仅供学习参考") + except Exception: + pass # 字体问题则跳过水印 + c.restoreState() + + doc.build(pdf.elements, onFirstPage=draw_watermark, onLaterPages=draw_watermark) return output_path \ No newline at end of file