python修改pdf中的文字方式
更新时间:2026年01月22日 08:44:24 作者:像风一样的男人@
这篇文章主要介绍了python修改pdf中的文字方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
直接插入
# PyMuPDF==1.22.5
import fitz
from loguru import logger
from shuini.settings import FontPath, moban_pdf
class CreatePDF(object):
'''生成报告pdf'''
def __init__(self):
self.font_name = 'simhei' # 字体名,枚举引用
self.font_path = str(FontPath) # 实际的黑体字路径
self.font_size = 8 # 字体大小
self.font_color = (0, 0, 0) # 字体rgb颜色
self.pdf = fitz.open(str(moban_pdf)) # 模板pdf对象
def _insert_text(self, rect: tuple, text: str, page) -> None:
'''
插入文字(内置方法)
@params rect --> 插入文字的坐标(x, y);
@params text --> 插入的文字;
@params page --> 实际插入的pdf页面对象;
'''
page.insert_font(fontname=self.font_name, fontfile=self.font_path) # 将中文字体加入到页面中
page.insert_text(
rect,
text,
fontsize=self.font_size,
color=self.font_color,
fontname=self.font_name
)
def _save_pdf(self) -> str:
'''保存新的pdf(内置方法)'''
pdf_name = '1.pdf'
self.pdf.save(pdf_name)
self.pdf.close()
logger.success(f'pdf保存成功:【{pdf_name}】')
return pdf_name
def update_qiyexinxi(self, text_list: list):
'''
修改企业信息
@params text_list --> 要修改的文字数组;按pdf顺序;
'''
page = self.pdf[14] # 企业信息页面
skip_row = [13, 17, 18, 19] # 需要跳过的行数 从1开始 固定字段不填写
rect_list = [(429, 143), (429, 158.3), (429, 173.6), (429, 188.9), (429, 204.2), (429, 219.5), (429, 234.8), # 1-7行
(429, 250.1), (429, 265.4), (429, 280.7), (429, 296.0), (429, 311.3), (), (429, 341.9), # 8-14行
(429, 357.2), (429, 372.5), (), (), (), (429, 442), (429, 457.3), # 15-21
(429, 472.6), (429, 487.9), (429, 503.2), (429, 518.5), (429, 533.8), (429, 555), (429, 576), # 22-29
(429, 591.3), (429, 606.5), (429, 621.8), (429, 637.1) # 30-34
]
for index, rect in enumerate(rect_list, start=1):
if index in skip_row: # 跳过行数
continue
x, y = rect
text = text_list[index - 1] # 因为从1开始算 所以索引-1
for _ in text[1:]: # 根据字数确定起始位置
try:
float(text) # 当为数字时 每个字符x - 1.8
x -= 1.8
except:
x -= 3.8 # 当为字符时 每个字符x-3.8
self._insert_text((x, y), text, page)
def start(self):
'''开始'''
self.update_qiyexinxi(
['111', '11111111111111', '111111111111111111', '1111111111111', '1111111111111', '1', '11111', '1', '11111111111', '11111111111111111', '1111', '11111', '1111111', '11111111111111111111', '11111111', '11111111111111', '1111111', '111111111', '11111', '1111', '11111111111111', '111111', '1111111111', '1111111111111111', '1111111111', '1111111111', '1111', '11111111111', '1111', '11111', '1111111', '111111111', '1111111111111', '1111111111111']
)
self._save_pdf()
if __name__ == '__main__':
c = CreatePDF()
c.start()
覆盖原文字
import fitz
from loguru import logger
import os, sys, django
parent_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(parent_path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shuini.settings")
django.setup()
from shuini.settings import FontPath, moban_pdf
from backstage.models import User, Shengchanxian
class CreatePDF(object):
'''生成报告pdf'''
def __init__(self):
self.font_name = 'simhei' # 字体名,枚举引用
self.font_path = str(FontPath) # 实际的黑体字路径
self.font_size = 8 # 字体大小
self.font_color = (0, 0, 0) # 字体rgb颜色
self.pdf = fitz.open(str(moban_pdf)) # 模板pdf对象
self.user = None # 用户对象
def _cover_old_text(self, rect, page) -> None:
'''
覆盖原有文字(内置方法)
@params rect --> 遮挡区域的矩形坐标(需略大于文字区域)(x0, y0, x1, y2);
@params page --> 目标pdf页面对象;
'''
page.draw_rect( # 绘制实心白色矩形,覆盖原有文字
rect,
color=(1, 1, 1), # 边框颜色
fill=(1, 1, 1), # 填充矩形(关键:实现遮挡)
width=0 # 边框宽度设为0,避免多余线条
)
def _insert_text(self, rect: tuple, text: str, page) -> None:
'''
插入文字(内置方法)
@params rect --> 插入文字的坐标(x, y);
@params text --> 插入的文字;
@params page --> 实际插入的pdf页面对象;
'''
page.insert_font(fontname=self.font_name, fontfile=self.font_path) # 将中文字体加入到页面中
page.insert_text(
rect,
text,
fontsize=self.font_size,
color=self.font_color,
fontname=self.font_name
)
def _save_pdf(self) -> str:
'''保存新的pdf(内置方法)'''
pdf_name = '1.pdf'
self.pdf.save(pdf_name)
self.pdf.close()
logger.success(f'pdf保存成功:【{pdf_name}】')
return pdf_name
def update_qiyexinxi(self):
'''修改企业信息'''
text_list = [
self.user.qiyemingcheng if self.user.qiyemingcheng else '',
self.user.shehuixinyongbianma if self.user.shehuixinyongbianma else '',
self.user.qiyeleixing if self.user.qiyeleixing else '',
self.user.qiyezhusuo if self.user.qiyezhusuo else '',
self.user.fadingdaibiaoren if self.user.fadingdaibiaoren else '',
self.user.zhuceziben if self.user.zhuceziben else '',
]
page = self.pdf[14] # 企业信息页面
skip_row = [13, 17, 18, 19] # 需要覆盖的行数 从1开始
rect_list = [
[398, 143], [398, 158.3], [398, 173.6], [398, 188.9], [398, 204.2], [398, 219.5], # 1-6
]
for index, rect in enumerate(rect_list, start=1):
x, y = rect
if index in skip_row: # 需要覆盖的位置
if index == 17: # 两行
self._cover_old_text((x, y - 14.5, x + 75, y + 6), page)
else: # 单行
self._cover_old_text((x, y - 8, x + 75, y + 3), page)
text = text_list[index - 1] # 因为从1开始算 所以索引-1
self._insert_text((x, y), text, page)
def start(self, user_id: int):
'''开始'''
self.user = User.objects.get(user_id=user_id)
self.update_qiyexinxi() # 修改企业信息
self._save_pdf()
if __name__ == '__main__':
c = CreatePDF()
c.start(1)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
这篇文章主要介绍了浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06


最新评论