为了根据文本长度动态调整水印字体大小,可以先测量文本长度,然后根据页面宽度和高度动态计算合适的字体大小。以下是修改后的代码:
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib import colors
def create_watermark(watermark_text, watermark_pdf_path):
chinese_font_path = "MSYH.TTC" # 替换为中文字体路径
pdfmetrics.registerFont(TTFont("微软雅黑", chinese_font_path)) # 注册字体
c = canvas.Canvas(watermark_pdf_path, pagesize=letter)
width, height = letter
# Function to calculate font size based on text length and page size
def calculate_font_size(text, max_width, max_height):
# Start with a large font size
font_size = 60
while font_size > 10: # Minimum font size to avoid being too small
c.setFont("微软雅黑", font_size)
text_width = c.stringWidth(text, "微软雅黑", font_size)
if text_width <= max_width * 0.8: # Allow some margin
return font_size
font_size -= 2 # Decrease font size step by step
return font_size
# Calculate maximum diagonal space for the rotated text
max_diagonal_space = ((width ** 2 + height ** 2) ** 0.5) * 0.7 # Allow some margin
font_size = calculate_font_size(watermark_text, max_diagonal_space, max_diagonal_space)
# Set transparency (optional)
c.setFillColor(colors.grey, alpha=0.3)
# Rotate the canvas to draw diagonal text
c.saveState()
c.translate(width / 2, height / 2)
c.rotate(45)
c.setFont("微软雅黑", font_size)
c.drawCentredString(0, 0, watermark_text)
c.restoreState()
c.save()
# 示例调用
create_watermark("这是一个水印", "watermark.pdf")
修改点:
- 添加
calculate_font_size
函数,用于根据文本长度动态计算字体大小。 - 将文本限制在页面对角线的 70% 内,以保证水印不会超出页面。
- 在循环中逐步减小字体大小,直到文本宽度符合要求。
运行该代码时,可以根据不同长度的水印文本动态调整字体大小,从而适配页面尺寸。