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

news/2025/1/17 23:59:55/

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

python">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 colorsdef 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 sizedef calculate_font_size(text, max_width, max_height):# Start with a large font sizefont_size = 60while font_size > 10:  # Minimum font size to avoid being too smallc.setFont("微软雅黑", font_size)text_width = c.stringWidth(text, "微软雅黑", font_size)if text_width <= max_width * 0.8:  # Allow some marginreturn font_sizefont_size -= 2  # Decrease font size step by stepreturn font_size# Calculate maximum diagonal space for the rotated textmax_diagonal_space = ((width ** 2 + height ** 2) ** 0.5) * 0.7  # Allow some marginfont_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 textc.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.ppmy.cn/news/1564006.html

相关文章

归子莫的科技周刊#2:白天搬砖,夜里读诗

归子莫的科技周刊#2&#xff1a;白天搬砖&#xff0c;夜里读诗 本周刊开源&#xff0c;欢迎投稿。 刊期&#xff1a;2025.1.5 - 2025.1.11。原文地址。 封面图 下班在深圳看到的夕阳&#xff0c;能遇到是一种偶然的机会&#xff0c;能拍下更是一种幸运。 白天搬砖&#xff0c;…

Frida调试il2cpp的程序打印原生c#对象为json

主要的思路是&#xff0c;输入一个对象&#xff0c;那么使用反射的GetType, 然后使用type的GetFields&#xff0c; 拿到Field的列表&#xff0c;然后遍历field列表。 需要配合il2cpp原来程序里的一些json序列化的工具来进行&#xff0c;一般都可以找到&#xff0c;如下面的。…

Java 后端整合 Swagger + Knife4j 接口文档

文章目录 一. 接口文档1.1 什么是接口文档&#xff1f;1.2 **为什么需要接口文档&#xff1f;**1.3 **怎么做接口文档&#xff1f;**1.4 **接口文档有哪些技巧&#xff1f;** 二. 后端整合 Swagger Knife4j2.1 Swagger2.1.1 引入依赖2.1.2 设置Swagger配置类2.1.3 报错 2.2 Kn…

Vue3中使用组合式API通过路由传值详解

在Vue 3中&#xff0c;使用组合式API来传递路由参数是一种常见的需求。Vue Router 是 Vue.js的官方路由管理工具&#xff0c;可以在不同的场景下通过多种方式传递和接收路由参数。下面将详细讲解几种常见的路由传值方式&#xff0c;并提供相应的代码示例。 目录 1. **通过路由参…

麦田物语学习笔记:构建游戏的时间系统

基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…

php基本数据结构

数据结构 数组&#xff1a;包含了Java的数组、列表list、Map结构 类比Java 数组&#xff1a;$phpArray [1,2,3,4];list: $phpList ["name","age","phone"];Map: $phpMap ["name">"1" , "age">"2…

【自然语言处理】BERT系列模型-详解

一、BERT模型介绍 思考题&#xff1a;Bert模型的架构以及每一部分的作用&#xff1f; 思考题&#xff1a;Bert模型两大预训练任务&#xff0c;并谈一谈你的理解&#xff1f; 1 BERT简介 BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional En…

react中,如何使用antd的Row栅格系统使元素左对齐

页面展示 元素结构 代码 const handleFormItem (item, index) > {if (item.type date) {return (<RangePickerformat"YYYY-MM-DD HH:mm:ss"style{{ width: 100% }}showTime{{hideDisabledOptions: true,defaultValue: [dayjs(00:00:00, HH:mm:ss), dayjs(2…