玩轉Python之Reportlab庫:DIY專屬賀卡

語言: CN / TW / HK

Reportlab是Python一個強大的生成PDF的工具庫。我們可以用它來進行動態的生成PDF檔案,用於網站的PDF動態合成,文書報告等。眾所周知,生成一篇文件主要就包括頁面、段落、文字,當在繪製圖表圖片流程圖時,我們需要消耗比較大的精力去繪製,調整等,這裡我們使用Reportlab庫的Table方法就可以輕鬆駕馭各式各樣的卡片、流程、圖表等的繪製,阿基米德說:給我一個支點我可以撬動地球。而給我們一個Table方法,我們也能玩轉所有精美文件。現在我們就小試牛刀,用Table 方法來DIY一張專屬賀卡。

主要內容

• Table的使用方法

DIY專屬賀卡

Table的使用方法

01

Table類

Table(data, colWidths=None, rowHeights=None, style=None, splitByRow=1,
repeatRows=0, repeatCols=0, rowSplitRange=None, spaceBefore=None,
spaceAfter=None, cornerRadii=None)

要使用Table,先建一個Table物件,如上,data就是傳入的資料陣列,後面的引數可以定義行高,寬高等,這裡不做詳細介紹,我們只需要知道如何使用即可。

02

TableStyle類

這個是給Table設定Style,使用它,我們就可以像word一樣,得到各種格式的表格了。

示例如下:

('LINEABOVE', (0,0), (-1,0), 2, colors.green),

解釋:

• 'LINEABOVE':設定改單元格的邊框格式,這個是單元格上劃線。

• (0,0), (-1,0):代表起止座標,這裡與我們常用的座標不同,(a,b),a代表列,b代表行,左上角正座標:(0,0),右下角標負座標第一個是(-1,-1),這裡是指選中表格中從左上角第一行第一列,到最後一列和第一行的所有單元格。

• colos.green: 代表此處選中單元格設定的顏色

下面我們加入到程式碼中,看看得到了什麼

# table.py
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle 
def table_paragraph():
    doc = SimpleDocTemplate("table.pdf", pagesize=letter)
    story = []
    data = [[1,2,3,4],[5,6,7,8]]

    tblstyle = TableStyle([
                           ('LINEABOVE', (0,0), (-1,0), 2, colors.green),
                           ])

    tbl = Table(data)
    tbl.setStyle(tblstyle)
    story.append(tbl)
    doc.build(story)

if __name__ == '__main__':
    table_paragraph()

這時,我們看到當前目錄生成了一個table.pdf的檔案,開啟看看。

看到陣列的1到4列最上面的綠色橫線。

Table還有其他的屬性,我們可以利用這些屬性製作專屬我們的PDF卡片。

這裡簡單介紹後續要用的幾個屬性:

•SPAN:用於合併單元格,單元格範圍內進行合併,使用方法:(SPAN,(a,b),(c,d)),內容只保留起始位置單元格內容。

•ALIGN: 單元格範圍內,左右的排列格式,LEFT是靠左,RIGHT靠右,CENTER居中。

•VALIGN: 單元格範圍內,上下的排列格式,TOP是置頂,BOTTOM靠下,MIDDLE居中。

DIY專屬卡片

下面我們用Table這個屬性,來製作一張節日祝福卡片模板:

先設計下我們的卡片大致的樣子:

分析下這個賀卡,把它解析成Table的樣子,如下:

這就簡單了,我們只需要建一個6行2列的Table,把對應的內容填進去就好了,中間的橫線就是單元格的上劃線。

程式碼如下:

# table_paragraph.py

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image
from reportlab.platypus import Paragraph

def table_paragraph(name):
    doc = SimpleDocTemplate("table_paragraph.pdf", pagesize=letter)
    story = []
    styles = getSampleStyleSheet()

    pheader = f'<font color=black size=14>To {name}: </font>'
    p0 = Paragraph(pheader, styles['Normal'])

    # 挑選一張精美的圖片
    im = Image('best_wished.jpeg')
    im.drawHeight = 5 * inch * im.drawHeight / im.drawWidth
    im.drawWidth = 2.5 * inch
    colwidth = 3 * inch
    colheight = inch

    data = [[im,p0],
            ['',''],
            ['', ''],
            ['',''],
            ['','Best'],
            ['','Wishes!'],
            ]

    tblstyle = TableStyle([
                           ('ALIGN', (-1,4), (-1,4), 'LEFT'),
                           ('ALIGN', (-1,-1), (-1,-1), 'RIGHT'),
                           ('TEXTCOLOR',(-1,-2),(-1,-1),colors.black),
                           ('BOX', (0,0), (-1,-1), 0.5, colors.black),
                           ('LINEABOVE', (-1,-4), (-1,-2), 2, colors.black),
                           ('SPAN',(0,0),(0,-1)),
                           ('VALIGN',(-1,-1), (-1,-1),'TOP'),

                           ])

    tbl = Table(data, colWidths = colwidth)
    tbl.setStyle(tblstyle)
    story.append(tbl)

    doc.build(story)

if __name__ == '__main__':
    name = 'Lily'
    table_paragraph(name)

執行下程式碼,就可以得到一張DIY賀卡:

這樣看,中間的橫線太靠邊沿,我們再增加一列空白列,調整下行寬,如下:

修改程式碼如下:

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image
from reportlab.platypus import Paragraph

def table_paragraph(name):
    doc = SimpleDocTemplate("table_paragraph.pdf", pagesize=letter)
    story = []
    styles = getSampleStyleSheet()

    pheader = f'<font color=black size=14>To {name}: </font>'
    p0 = Paragraph(pheader, styles['Normal'])

    # 挑選一張精美的圖片
    im = Image('best_wished.jpeg')
    im.drawHeight = 5 * inch * im.drawHeight / im.drawWidth
    im.drawWidth = 3 * inch
    colwidth = (3.5 * inch, 2.5 * inch, 0.2*inch)
    colheight = inch

    data = [[im,p0,''],
            ['','',''],
            ['', '',''],
            ['','',''],
            ['','Best',''],
            ['','Wishes!',''],
            ]

    tblstyle = TableStyle([
                           ('ALIGN', (-2,4), (-2,4), 'LEFT'),
                           ('ALIGN', (-2,-1), (-2,-1), 'RIGHT'),
                           ('TEXTCOLOR',(-1,-2),(-1,-1),colors.black),
                           ('BOX', (0,0), (-1,-1), 0.5, colors.black),
                           ('LINEABOVE', (-2,-4), (-2,-2), 2, colors.black),
                           ('SPAN',(0,0),(0,-1)),
                           ('VALIGN',(-2,-1), (-2,-1),'TOP'),
                           ])

    tbl = Table(data, colWidths = colwidth)
    tbl.setStyle(tblstyle)
    story.append(tbl)

    doc.build(story)

if __name__ == '__main__':
    name = 'Lily'
    table_paragraph(name)

得到卡片:

這樣我們就製作出一張簡單的賀卡,選一張喜歡的圖片,把名字輸入進去,就可以發給我們的朋友們了。

除此之外,我們還可以用Table製作流程圖,文書模板等,讀者可以後續自行嘗試一下。

分享給第一個想到的人