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:
'''
插入文字(內(nèi)置方法)
@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(內(nèi)置方法)'''
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):
'''
修改企業(yè)信息
@params text_list --> 要修改的文字數(shù)組;按pdf順序;
'''
page = self.pdf[14] # 企業(yè)信息頁面
skip_row = [13, 17, 18, 19] # 需要跳過的行數(shù) 從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: # 跳過行數(shù)
continue
x, y = rect
text = text_list[index - 1] # 因為從1開始算 所以索引-1
for _ in text[1:]: # 根據(jù)字數(shù)確定起始位置
try:
float(text) # 當為數(shù)字時 每個字符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:
'''
覆蓋原有文字(內(nèi)置方法)
@params rect --> 遮擋區(qū)域的矩形坐標(需略大于文字區(qū)域)(x0, y0, x1, y2);
@params page --> 目標pdf頁面對象;
'''
page.draw_rect( # 繪制實心白色矩形,覆蓋原有文字
rect,
color=(1, 1, 1), # 邊框顏色
fill=(1, 1, 1), # 填充矩形(關(guān)鍵:實現(xiàn)遮擋)
width=0 # 邊框?qū)挾仍O(shè)為0,避免多余線條
)
def _insert_text(self, rect: tuple, text: str, page) -> None:
'''
插入文字(內(nèi)置方法)
@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(內(nèi)置方法)'''
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):
'''修改企業(yè)信息'''
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] # 企業(yè)信息頁面
skip_row = [13, 17, 18, 19] # 需要覆蓋的行數(shù) 從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() # 修改企業(yè)信息
self._save_pdf()
if __name__ == '__main__':
c = CreatePDF()
c.start(1)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)文件內(nèi)容批量追加的方法示例
這篇文章主要介紹了Python實現(xiàn)文件內(nèi)容批量追加的方法,結(jié)合實例形式分析了Python文件的讀寫相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Python3連接MySQL(pymysql)模擬轉(zhuǎn)賬實現(xiàn)代碼
這篇文章主要介紹了Python3連接MySQL(pymysql)模擬轉(zhuǎn)賬實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
用tensorflow實現(xiàn)彈性網(wǎng)絡(luò)回歸算法
這篇文章主要介紹了用tensorflow實現(xiàn)彈性網(wǎng)絡(luò)回歸算法2018-01-01
基于PyTorch實現(xiàn)EdgeCNN的實戰(zhàn)教程
本文我們將使用PyTorch來簡易實現(xiàn)一個EdgeCNN,不使用PyG庫,讓新手可以理解如何PyTorch來搭建一個簡易的圖網(wǎng)絡(luò)實例demo,感興趣的朋友跟隨小編一起看看吧2023-02-02

