背景

昨天收到的新需求,一份文件从其他部门发起,进行一些文字填写后盖章,再到我们部门,我们接收到的是pdf文件,所以需要在pdf文件中进行修改,插入当日日期等文字。但有要求字体必须和原文档字体相同。

问题代码

开始时通过fontfile传本地文件夹中的指定字体包,但是无论怎么修改最终在pdf中插入的文字格式都是PyMuPDF的默认Helvetica字体。

inserter = SmartDateInserterV6(fontfile="./fonts/fangsongGB2312.ttf", fontsize=16)
    def _insert_before(self, page, span, text, offset_x, offset_y):
x, y = span["bbox"][:2]
rgb = int_to_rgb_tuple(span.get("color", 0))
page.insert_text(
(x - offset_x, y + offset_y),
text,
fontfile=self.fontfile,
fontsize=self.fontsize,
color=rgb
)



如上图所示

根本原因

page.insert_text() 在没有显式 fontname 参数时会把字体名默认为 "Helv" / "Helvetica"。

“Helv” 属于 PDF 的 Base‑14 保留字体名。只要传入的 fontname 是保留名,PyMuPDF 就 忽略 fontfile / fontbuffer 参数,直接调用内置 Helvetica,所以看到的始终是 Helvetica,而不是自己的仿宋字体。

解决办法

解决办法一:在 insert_text 时同时指定 自定义 fontname

page.insert_text(
(x - offset_x, y + offset_y),
text,
fontfile=self.fontfile,
fontsize=self.fontsize,
color=rgb,
fontname="FangSongGB" # 避免 Helv
)

只要 fontname 不是保留名,PyMuPDF 就会把 fontfile 嵌入 PDF,并真正使用你的仿宋字体。

解决办法二:先把字体注册到页面,再写入文本

import fitz

doc  = fitz.open()
page = doc.new_page() font_path = "./fonts/fangsongGB2312.ttf" # 1️⃣ 先把字体嵌入并得到 xref
xref = page.insert_font(fontname="FangSongGB", fontfile=font_path) # 2️⃣ 写文本时只需要给出 fontname
page.insert_text(
(100, 100),
"测试 2025 年",
fontname = "FangSongGB",
fontsize = 20
) doc.save("test_font.pdf")
doc.close()

我使用方法一,最终效果如图

使用PyMuPDF对pdf文件插入文字时 遇到配置本地的字体文件缺仍然使用默认Helvetica字体问题的更多相关文章

  1. 【问题解决方案】单个文件夹嵌套时github仓库中最外层文件夹直接显示所有嵌套文件夹名的问题

    上传文件的时候遇到这样一个问题: 这么看着好像有什么问题,直觉不应该这么显示吧 折腾半天,从github新建了嵌套文件夹并同步到本地,然后从本地push了文件,结果依然显示是这样 好吧,那这个问题应该 ...

  2. <input />文字方框中,字体颜色的变化 要求默认的字体颜色是灰色,当要输入字时,字体是正常的黑色

    <input type="text" name="address" size="60" maxlength="60" ...

  3. input文字方框中,字体颜色的变化 要求默认的字体颜色是灰色,当要输入字时,字体是正常的黑色

    1 <input type=text name='address' size=60 maxlength=60 style="color:gray" value="( ...

  4. php配置虚拟主机的配置步骤(hosts、httpd.conf、vhosts.conf)1.配置本地的dns文件2.配置apache的主配置文件3.配置Apache的虚拟主机

    1.域名解析(DNS) 找到C:\Windows\System32\drivers\etc目录下的hosts文件,在里面进行添加对应的内容

  5. SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)

    前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题. SQL Server事务对本地变量影响 事务对变量影响具体是指什么意 ...

  6. JQ在光标处插入文字

    内容转载自网络这是一个JQ的扩展方法.在teatarea获得焦点时,往光标处插入文字,扩展代码如下 (function($){ $.fn.extend({ "insert":fun ...

  7. 使用logback.xml配置来实现日志文件输出

    转自:http://sungang-1120.iteye.com/blog/2104296 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback- ...

  8. word: 插入或修改文字时后面的字消失 解决办法

    在编辑Word文档中的文字时,我们有时需要插入或修改文字,可是在插入或修改时会发现改动处后面的文字会消失.比如插入或修改3个字,后面的文字随之也会消失3个,这时该怎么办呢? 点击-“文件”-“选项”- ...

  9. pymupdf 修改pdf文件

    安装: sudo pip install pymupdf==1.16.0 引入使用: import  fitz 可以插入文字.图片.... 帮助文档: PyMuPDF documentation ht ...

  10. C#操作word模板插入文字、图片及表格详细步骤

    c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...

随机推荐

  1. dart安装教程详解

    官网 https://dart.dev 关于发布通道和版本字符串 Dart SDK有三个发布通道: 1==>:稳定释放,大约每三个月更新一次: 稳定释放适合生产使用. 2==>:预览发布, ...

  2. 从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群

    从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群 AlwaysOn集群是SQL Server里唯一推荐的高可用性架构, 在AlwaysOn高可用性架构中,有非 ...

  3. Dummynet简单部署

    本文分享自天翼云开发者社区<Dummynet简单部署>,作者:凸凹 部署流程 ^准备内核版本 ^参看系统内核版本 uname -r 我们需要将ipfw编译成内核模块,请确保ipfw用到的内 ...

  4. CDN与前端技术

    本文分享自天翼云开发者社区<CDN与前端技术>,作者:张****亮 CDN(Content Delivery Network)是一种广泛应用于网络加速和内容分发的技术.它通过在全球各地部署 ...

  5. wsgi服务器

    wsgi服务器DRP原则:Don't repeat yourself1.wsgi接口:全称 Web Server Gateway Interface (web服务器网关接口) 请求:request 响 ...

  6. Q:Win10关闭内存压缩功能

    微软在Win10中就已经启用了内存压缩机制,在Win11当中继续了这一设定. 通过任务管理器查看. taskmgr ·通过命令行查看. 使用系统管理员权限,打开PowerShell,然后输入以下命令: ...

  7. YASKAWA安川DX100控制柜维修看这几步

    维修YASKAWA安川DX100控制柜需要综合运用多种诊断技巧,并遵循严格的安全操作规程.通过预防性维护和及时的故障处理,可以显著提高DX100控制柜的可靠性和使用寿命,从而保障企业生产线的稳定运行. ...

  8. android studio真机调试华为手机

    背景 近来开发一个视频通话App,需要在华为手机上调试,按网上一顿操作,开启了USB调试之后,发现手机连上电脑后,android studio没反应,在此记录下解决方法.调试的手机型号是华为 nova ...

  9. 13. MySQL 事务基础知识(详细说明实操剖析)

    13. MySQL 事务基础知识(详细说明实操剖析) @ 目录 13. MySQL 事务基础知识(详细说明实操剖析) 1. 数据库事务概述 1.1 存储引擎支持情况 1.2 事务基本概念 1.3 事务 ...

  10. 使用Windows系统自带DLL修复工具修复系统缺失dll的问题

    1. System File Checker(SFC) System File Checker(SFC)是Windows自带的一个工具,可以扫描系统文件并尝试修复任何受损的文件.要使用SFC,请按照以 ...