当前位置: 首页 > article >正文

python创建pdf水印,希望根据文本长度调整水印字体大小,避免超出页面

为了根据文本长度动态调整水印字体大小,可以先测量文本长度,然后根据页面宽度和高度动态计算合适的字体大小。以下是修改后的代码:

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")

修改点:

  1. 添加 calculate_font_size 函数,用于根据文本长度动态计算字体大小。
  2. 将文本限制在页面对角线的 70% 内,以保证水印不会超出页面。
  3. 在循环中逐步减小字体大小,直到文本宽度符合要求。

运行该代码时,可以根据不同长度的水印文本动态调整字体大小,从而适配页面尺寸。


http://www.kler.cn/a/504635.html

相关文章:

  • 如何在 CentOS 中生成 CSR
  • 【Axure视频教程】中继器表格——拖动排序
  • golang运维开发-gopsutil(2)
  • 互斥与同步
  • 流批一体计算引擎-18-离线和实时缝合成的流批一体缘何成为主流
  • GitLab本地服务器配置ssh和克隆项目
  • [Qt]常用控件介绍-输入类控件-QSpinBox、DateTimeEdit、Dial、Silder控件
  • C++笔记:打包独立运行的exe(在静态库中使用MFC)
  • 使用yarn命令创建Vue3项目
  • Microsoft Sql Server 2019 触发器
  • 利用 rclone 挂载华为云 OBS 到本地
  • 图-岛屿-dfs
  • 什么是docker?关于docker容器的全面详细介绍
  • Spring MVC流程一张图理解
  • 获取文章列表功能
  • LeetCode热题100-有效的括号【JavaScript讲解】
  • 常见好用的PHP CMS开源系统有哪些?
  • javaEE-网络原理-IP协议
  • 微信小程序实现个人中心页面
  • Ubuntu磁盘空间不足或配置错误时,如何操作扩容?
  • Starrocks 存算分离 VS Trino 性能测试
  • 银河麒麟V10安装第二个nginx服务
  • Unity 自定义批量打包工具
  • TCP、UDP的区别及使用场景
  • 装备制造业:建立项目“四算”管理:以合同为源头,以项目为手段实现合同的测算、预算、核算与决算的管控体系
  • [云讷科技] 用于软件验证的仿真环境