Python操作PDF實(shí)現(xiàn)制作數(shù)據(jù)報(bào)告
大家好,我是朱小五。大家如果看過(guò)我的書《快學(xué)Python:自動(dòng)化辦公輕松實(shí)戰(zhàn)》,會(huì)發(fā)現(xiàn)Python操作PDF文檔內(nèi)容,主要圍繞PDF文檔的內(nèi)容提取、合并與拆分、加密與解密、添加水印以及不同文檔格式相互轉(zhuǎn)換來(lái)展開。
但大家會(huì)發(fā)現(xiàn),其中并沒(méi)有有太多直接操作PDF并向其寫入的內(nèi)容。這是因?yàn)槲覀兏扑]大家Python自動(dòng)操作word,然后加一步格式轉(zhuǎn)換,而非直接想PDF寫入內(nèi)容。
不過(guò),肯定還是有一部分人是有類似需求的,所以今天給大家分享一個(gè)案例:如何用Python操作PDF制作數(shù)據(jù)報(bào)告?
FPDF模塊
Python操作PDF的庫(kù)有很多,比如PyPDF2、pdfplumber、PyMuPDF等等。不過(guò)我們今天要用的是FPDF模塊,它是用于在 Python 中生成 PDF 的最通用、最自由、最直觀的庫(kù)之一。為啥說(shuō)它自由呢,看它的首字母F就知道了。Python中所用到的FPDF是基于PHP版本的FPDF。
FPDF 官方網(wǎng)址:http://www.fpdf.org/
pip?install?FPDF
FPDF模塊使用邏輯非常簡(jiǎn)單,直接用幾個(gè)小例子學(xué)習(xí)一下。
1、創(chuàng)建PDF,并添加單行文字
我們可以創(chuàng)建一個(gè)單元格cell()
,然后將文本放入其中,這種方法更適合對(duì)齊或居中變量或動(dòng)態(tài)文本。
from?fpdf?import?FPDF pdf?=?FPDF() pdf.add_page() pdf.set_font('Arial',?'B',?16) pdf.cell(40,?10,'Hello,?World!') pdf.output('test_01.pdf',?'F')
輸出結(jié)果:
2、其他操作
pdf.set_font('SIMYOU',size=10)??#?設(shè)置字體,字體,加粗,字號(hào) pdf.set_text_color(120,120,120)?#?設(shè)置顏色,采用RGB方式 pdf.text(x,?y,?txt)?#?插入文本的另一種方式 pdf.add_page()?#?增加一頁(yè) pdf.ln()?#?插入新行 pdf.multi_cell(0,5,"插入多行")?#?插入多行 pdf.image('01.jpg',?100,?50,?40)?#?插入圖片,100,50表示圖片左上角的XY坐標(biāo),40表示圖片的大小
3、實(shí)現(xiàn)字體的中文支持
FPDF庫(kù)自帶的字體非常少,想使用中文就需要導(dǎo)入支持中文的字體,可以使用add_font()
方法。
pdf.add_font('幼圓字體','',r'C:\Windows\Fonts\SIMYOU.TTF',True) pdf.set_font('幼圓字體',?'',?14)?#?設(shè)置字體為標(biāo)準(zhǔn)幼圓,size為14
注意,上面代碼中的字體文件路徑要根據(jù)自己的電腦實(shí)際存放位置更改。
此外,使用中文會(huì)有報(bào)錯(cuò)warnings.warn
,直接無(wú)視就好。如果想解決,也可以參考下文補(bǔ)充內(nèi)容
操作PDF制作數(shù)據(jù)報(bào)告
下面,直接展開案例:如何用Python操作PDF制作數(shù)據(jù)報(bào)告[2]?
由于我們這個(gè)小案例涉及繪制圖形+寫入圖表,所以使用了seaborn
、pandas
模塊。懶得自己打字,所以又使用了Faker模塊,干脆模擬生成一些“假”的文字段落,方便直接插入到PDF文檔中。
在交互式環(huán)境中輸入如下命令(部分代碼):
pdf.cell(w=30,?h=ch,?txt="Date:?",?ln=0) pdf.cell(w=30,?h=ch,?txt="01/10/2022",?ln=1) pdf.cell(w=30,?h=ch,?txt="Author:?",?ln=0) pdf.cell(w=30,?h=ch,?txt="公眾號(hào):快學(xué)Python",?ln=1) pdf.ln(ch) pdf.cell(0,?5,'聽我說(shuō)謝謝你')?#?單行文字 pdf.ln(ch) #?隨機(jī)生成文字段落 pdf.multi_cell(w=0,?h=10,?txt=fake.sentence(nb_words=50)) pdf.ln(ch) pdf.image('./example_chart.png',?x?=?10,?y?=?None,?w?=?100,?h?=?0,?type?=?'PNG',?link?=?'') pdf.ln(ch) pdf.multi_cell(w=0,?h=5,?txt=fake.sentence(nb_words=50)) pdf.ln(ch) #?表格?Header pdf.cell(40,?ch,?'Feature?1',?1,?0,?'C') pdf.cell(40,?ch,?'Feature?2',?1,?1,?'C') #?表格內(nèi)容 for?i?in?range(0,?len(df)): ????pdf.cell(40,?ch,?df['feature?1'].iloc[i],?1,?0,?'C')??? ????pdf.cell(40,?ch,?df['feature?2'].iloc[i].astype(str),?1,?1,?'C')
打開導(dǎo)出的PDF文檔,如下圖所示。
這樣我們就實(shí)現(xiàn)用Python操作PDF制作了一張“偽”數(shù)據(jù)報(bào)告,而我們?cè)趯?shí)際使用中則可以根據(jù)需求向其中插入文本、數(shù)字、圖表等等內(nèi)容。
補(bǔ)充
fpdf解決中文報(bào)錯(cuò)的方法
將字體從C:\Windows\Fonts目錄下拷貝到了fpdf文件夾。如果打印的字是'你好世界'時(shí)不會(huì)報(bào)錯(cuò)。但是換為其他字時(shí)就報(bào)cmap value too big/small
import fpdf pdf =fpdf.FPDF() pdf.add_font('STSONG','',r'D:\test\venv\Lib\site-packages\fpdf\STSONG.TTF',True) #此句話添加字體標(biāo)準(zhǔn)宋體 pdf.add_page() pdf.set_font('STSONG', '', 35)#設(shè)置字體為標(biāo)準(zhǔn)宋體,size為35 pdf.cell(100, 100,'跟我說(shuō)謝謝你') pdf.output('helloword_01.pdf')
報(bào)錯(cuò):
D:\test\venv\Scripts\python.exe D:/test/pdf操作/fpdftest.py
D:\test\venv\lib\site-packages\fpdf\ttfonts.py:670: UserWarning: cmap value too big/small: -35825
warnings.warn("cmap value too big/small: %s" % cm)
D:\test\venv\lib\site-packages\fpdf\ttfonts.py:670: UserWarning: cmap value too big/small: -35869
warnings.warn("cmap value too big/small: %s" % cm)
D:\test\venv\lib\site-packages\fpdf\ttfonts.py:670: UserWarning: cmap value too big/small: -36318
warnings.warn("cmap value too big/small: %s" % cm)
Traceback (most recent call last):
File "D:\test\pdf操作\fpdftest.py", line 12, in <module>
pdf.output('helloword_01.pdf')
File "D:\test\venv\lib\site-packages\fpdf\fpdf.py", line 1079, in output
f=open(name,'wb')
PermissionError: [Errno 13] Permission denied: 'helloword_01.pdf'
Process finished with exit code 1
點(diǎn)擊報(bào)錯(cuò)中的ttfonts.py,將else及其后邊幾句注釋掉后,竟然不報(bào)錯(cuò)了,并且能正常生成中文。
cmap.append(0) # Mapping for last character cmapstr = b('') for cm in cmap: if cm >= 0: cmapstr += pack(">H", cm) # else: # try: # cmapstr += pack(">h", cm) # except: # warnings.warn("cmap value too big/small: %s" % cm) # cmapstr += pack(">H", -cm)
到此這篇關(guān)于Python操作PDF實(shí)現(xiàn)制作數(shù)據(jù)報(bào)告的文章就介紹到這了,更多相關(guān)Python PDF數(shù)據(jù)報(bào)告內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python日期時(shí)間模塊datetime詳解與Python 日期時(shí)間的比較,計(jì)算實(shí)例代碼
python中的datetime模塊提供了操作日期和時(shí)間功能,本文為大家講解了datetime模塊的使用方法及與其相關(guān)的日期比較,計(jì)算實(shí)例2018-09-09python 基于pygame實(shí)現(xiàn)俄羅斯方塊
這篇文章主要介紹了python 基于pygame實(shí)現(xiàn)俄羅斯方塊的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03使用sklearn的cross_val_score進(jìn)行交叉驗(yàn)證實(shí)例
今天小編就為大家分享一篇使用sklearn的cross_val_score進(jìn)行交叉驗(yàn)證實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02使用 Python 獲取 Linux 系統(tǒng)信息的代碼
在本文中,我們將會(huì)探索使用Python編程語(yǔ)言工具來(lái)檢索Linux系統(tǒng)各種信息,需要的朋友可以參考下2014-07-07詳解Python中字符串前“b”,“r”,“u”,“f”的作用
這篇文章主要介紹了Python中字符串前“b”,“r”,“u”,“f”的作用,感興趣的朋友跟隨小編一起看看吧2019-12-12Python中 pickle 模塊的 dump() 和 load()&
Python 的 pickle 模塊用于實(shí)現(xiàn)二進(jìn)制序列化和反序列化,一個(gè)對(duì)象可以被序列化到文件中,然后可以從文件中恢復(fù),這篇文章主要介紹了Python中 pickle 模塊的 dump() 和 load() 方法詳解,需要的朋友可以參考下2022-12-12python利用WordCloud模塊實(shí)現(xiàn)詞云繪制
wordcloud是詞云繪圖模塊,封裝了WordCloud詞云類,是詞云的基本載體,下面小編就來(lái)和大家詳細(xì)講講如何利用WordCloud模塊實(shí)現(xiàn)詞云繪制吧,希望對(duì)大家有所幫助2023-10-10Python中NumPy的ufuncs函數(shù)實(shí)例
這篇文章主要介紹了Python中NumPy的ufuncs函數(shù)實(shí)例,NumPy是一個(gè)開源的Python科學(xué)計(jì)算庫(kù),使用NumPy,就可以很自然地使用數(shù)組和矩陣,本文主要介紹Python Numpy ufuncs通用函數(shù),需要的朋友可以參考下2023-07-07