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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python实现翻转数组功能示例

    Python实现翻转数组功能示例

    这篇文章主要介绍了Python实现翻转数组功能,涉及Python针对数组的遍历、判断、排序等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • pyinstaller打包后,配置文件无法正常读取的解决

    pyinstaller打包后,配置文件无法正常读取的解决

    这篇文章主要介绍了pyinstaller打包后,配置文件无法正常读取的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • opencv3/C++实现视频背景去除建模(BSM)

    opencv3/C++实现视频背景去除建模(BSM)

    今天小编就为大家分享一篇opencv3/C++实现视频背景去除建模(BSM),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python与C语言分别解决完全平方数问题

    Python与C语言分别解决完全平方数问题

    完全平方数指用一个整数乘以自己例如1*1.2*2.3*3等依次类推,若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有俩个,让我们用程序来练习一下
    2022-03-03
  • 解析Python 偏函数用法全方位实现

    解析Python 偏函数用法全方位实现

    这篇文章主要介绍了解析Python 偏函数用法全方位实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • python如何通过闭包实现计算器的功能

    python如何通过闭包实现计算器的功能

    这篇文章主要介绍了python如何通过闭包实现计算器的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python机器学习之基于Pytorch实现猫狗分类

    Python机器学习之基于Pytorch实现猫狗分类

    看了许多关于PyTorch的入门文章,大抵是从torchvision.datasets中自带的数据集进行训练,导致很难把PyTorch运用于自己的数据集上,真正地灵活运用PyTorch,本文详细介绍了怎么利用Pytorch实现猫狗分类,需要的朋友可以参考下
    2021-06-06
  • Python hasattr函数的具体使用

    Python hasattr函数的具体使用

    本文主要介绍了Python hasattr函数的具体使用,包括基本用法、返回值、应用场景,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点

    浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点

    这篇文章主要介绍了浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Python中文编码知识点

    Python中文编码知识点

    在本篇文章里小编给大家分享了关于Python中文编码的相关知识点以及对应实例内容,有兴趣的朋友们学习下。
    2019-02-02

最新评论