python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python修改pdf中的文字

python修改pdf中的文字方式

作者:像风一样的男人@

这篇文章主要介绍了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)

总结

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

您可能感兴趣的文章:
阅读全文