Python利用Reportlab生成PDF文檔


通過整整兩天時間的學習。已經基本摸清reportlab生成pdf的方法。下面記錄我的學習成果:

reportlab文檔:https://www.reportlab.com/docs/reportlab-userguide.pdf

reportlab實例:https://www.programcreek.com/python/index/1920/reportlab.platypus

reportlab生成pdf文檔的基本途徑有三種:

1、利用reportlab.pdfgen.canvas模塊

pdfgen包是生成PDF文檔的最低級別接口。pdfgen程序本質上是將文檔“繪制”到頁面序列上的指令序列。對象的接口 提供繪畫操作的是pdfgen畫布。 畫布應該被認為是一張白紙,紙上的點用笛卡爾坐標來標識 (X,Y)坐標,默認在頁面的左下角有(0,0)原點。此外,默認情況下,第一個坐標x向右,第二個坐標y向上。

 

2、利用reportlab.platypus.Paragraph模塊

Paragraph是最有用最方便的途徑之一。就像word一樣操作每個段落。它可以格式化任意的文本,並提供使用XML樣式的內聯字體樣式和顏色變化標記。格式化文本的整體形狀可以調整為右對齊、左對齊、不規則或居中。XML 標記甚至可以用來插入希臘字符或做下標。

 

3、使用RML標記語言

類似html語法一樣編寫RML文檔。

 

重點介紹第二種:

以下僅僅展示了最常用的樣式,更多豐富的樣式如:目錄、頁眉頁腳、表格、圖形等等需后續學習。

 

import tempfile
 
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.pdfmetrics import registerFontFamily
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Paragraph, SimpleDocTemplate, Table, LongTable, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_JUSTIFY
from io import BytesIO
 
pdfmetrics.registerFont(TTFont('SimSun', './SimSun.ttf'))  # 默認不支持中文,需要注冊字體
pdfmetrics.registerFont(TTFont('SimSunBd', './SimSun-bold.ttf'))
# registerFontFamily('SimSun', normal='SimSun', bold='SimSunBd', italic='VeraIt', boldItalic='VeraBI')
 
stylesheet = getSampleStyleSheet()   # 獲取樣式集
 
# 獲取reportlab自帶樣式
Normal = stylesheet['Normal']
BodyText = stylesheet['BodyText']
Italic = stylesheet['Italic']
Title = stylesheet['Title']
Heading1 = stylesheet['Heading1']
Heading2 = stylesheet['Heading2']
Heading3 = stylesheet['Heading3']
Heading4 = stylesheet['Heading4']
Heading5 = stylesheet['Heading5']
Heading6 = stylesheet['Heading6']
Bullet = stylesheet['Bullet']
Definition = stylesheet['Definition']
Code = stylesheet['Code']
 
# 自帶樣式不支持中文,需要設置中文字體,但有些樣式會丟失,如斜體Italic。有待后續發現完全兼容的中文字體
Normal.fontName = 'SimSun'
Italic.fontName = 'SimSun'
BodyText.fontName = 'SimSun'
Title.fontName = 'SimSunBd'
Heading1.fontName = 'SimSun'
Heading2.fontName = 'SimSun'
Heading3.fontName = 'SimSun'
Heading4.fontName = 'SimSun'
Heading5.fontName = 'SimSun'
Heading6.fontName = 'SimSun'
Bullet.fontName = 'SimSun'
Definition.fontName = 'SimSun'
Code.fontName = 'SimSun'
 
 
# 添加自定義樣式
stylesheet.add(
    ParagraphStyle(name='body',
                   fontName="SimSun",
                   fontSize=10,
                   textColor='black',
                   leading=20,                # 行間距
                   spaceBefore=0,             # 段前間距
                   spaceAfter=10,             # 段后間距
                   leftIndent=0,              # 左縮進
                   rightIndent=0,             # 右縮進
                   firstLineIndent=20,        # 首行縮進,每個漢字為10
                   alignment=TA_JUSTIFY,      # 對齊方式
 
                   # bulletFontSize=15,       #bullet為項目符號相關的設置
                   # bulletIndent=-50,
                   # bulletAnchor='start',
                   # bulletFontName='Symbol'
                   )
            )
body = stylesheet['body']
 
 
story = []
 
# 段落
content1 = "<para><u color='red'><font fontSize=13>區塊鏈</font></u>是分布式數據存儲、<strike color='red'>點對點傳輸</strike>、共識機制、" \
          "<font color='red' fontSize=13>加密算法</font>等計算機技術的<font name='SimSunBd'>新型應用模式</font>。<br/>" \
          "&nbsp&nbsp<a href='www.baidu.com' color='blue'>區塊鏈(Blockchain)</a>," \
          "是比特幣的一個重要概念,它本質上是一個去中心化的數據庫,同時作為比特幣的底層技術,是一串使用密碼學方法相關聯產生的" \
          "數據塊,每一個數據塊中包含了一批次比特幣網絡交易的信息,用於驗證其信息的有效性(防偽)和生成下一個區塊 [1]。</para>"
 
content2 = "區塊鏈起源於比特幣,2008年11月1日,一位自稱中本聰(SatoshiNakamoto)的人發表了《比特幣:一種點對點的電子現金系統》" \
           "一文 [2]  ,闡述了基於P2P網絡技術、加密技術、時間戳技術、區塊鏈技術等的電子現金系統的構架理念,這標志着比特幣的誕生" \
           "。兩個月后理論步入實踐,2009年1月3日第一個序號為0的創世區塊誕生。幾天后2009年1月9日出現序號為1的區塊,並與序號為" \
           "0的創世區塊相連接形成了鏈,標志着區塊鏈的誕生 [5]  。<br/><img src='./1.jpg' width=180 height=100 valign='top'/><br/><br/><br/><br/><br/>"
 
content3 = "2008年由中本聰第一次提出了區塊鏈的概念 [2]  ,在隨后的幾年中,區塊鏈成為了電子貨幣比特幣" \
           "的核心組成部分:作為所有交易的公共賬簿。通過利用點對點網絡和分布式時間戳服務器,區塊鏈數據庫能夠進行自主管理。為比特幣而發明的區塊鏈使它成為" \
           "第一個解決重復消費問題的數字貨幣。比特幣的設計已經成為其他應用程序的靈感來源。<br/>&nbsp&nbsp 2014年,區塊鏈2.0成為一個關於去中心" \
           "化區塊鏈數據庫的術語。對這個第二代可編程區塊鏈,經濟學家們認為它是一種編程語言,可以允許用戶寫出更精密和智能的協議 " \
           "[7]  。因此,當利潤達到一定程度的時候,就能夠從完成的貨運訂單或者共享證書的分紅中獲得收益。區塊鏈2.0技術跳過了交易" \
           "和“價值交換中擔任金錢和信息仲裁的中介機構”。它們被用來使人們遠離全球化經濟,使隱私得到保護,使人們“將掌握的信息兌換" \
           "成貨幣”,並且有能力保證知識產權的所有者得到收益。第二代區塊鏈技術使存儲個人的“永久數字ID和形象”成為可能,並且對“潛在" \
           "的社會財富分配”不平等提供解決方案 [8]  。<br/>&nbsp&nbsp 2016年1月20日,中國人民銀行數字貨幣研討會宣布對數字貨幣研究取得階段性成果。" \
           "會議肯定了數字貨幣在降低傳統貨幣發行等方面的價值,並表示央行在探索發行數字貨幣。中國人民銀行數字貨幣研討會的表達大大" \
           "增強了數字貨幣行業信心。這是繼2013年12月5日央行五部委發布關於防范比特幣風險的通知之后,第一次對數字貨幣表示明確的態度" \
           "。 [9] <br/>&nbsp&nbsp 2016年12月20日,數字貨幣聯盟——中國FinTech數字貨幣聯盟及FinTech研究院正式籌建 [10]  。<br/>&nbsp&nbsp如今,比特幣仍是" \
           "數字貨幣的絕對主流,數字貨幣呈現了百花齊放的狀態,常見的有bitcoin、litecoin、dogecoin、dashcoin,除了貨幣的應用" \
           "之外,還有各種衍生應用,如以太坊Ethereum、Asch等底層應用開發平台以及NXT,SIA,比特股,MaidSafe,Ripple等行業應用 [11]  。"
 
 
# Table 表格
 
image = Image('./1.jpg')
image.drawWidth = 160
image.drawHeight = 100
table_data = [['year我是標題行,\n\n比較特殊,不能上下居中\n', '我的背景色被綠了', '我是標題,我比別人大\n'],
              ['2017\n我是換行符,\n單元格中的字符串只能用我換行', '3', '12'],
              [Paragraph('指定了列寬,可以在單元格中嵌入paragraph進行自動換行,不信你看我', body), '4', '13'],
              ['2017', '5', '我們是表格'],
              ['2017', '我是偽拆分單元格,\n通過合並前hou兩個兄弟得到', '15'],
              ['2018', '7', '16'],
              [Paragraph(content1, body), '8', [image, Paragraph('這樣我可以在一個單元格內同時顯示圖片和paragraph', body)]],
              ['2018', '我們被合並了,合並的值為右上角單元格的值', '18'],
              ['我被綠了', '10', '19'],
              ]
table_style = [
    ('FONTNAME', (0, 0), (-1, -1), 'SimSun'),  # 字體
    ('FONTSIZE', (0, 0), (-1, 0), 15),  # 第一行的字體大小
    ('FONTSIZE', (0, 1), (-1, -1), 10),  # 第二行到最后一行的字體大小
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 所有表格左右中間對齊
    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),  # 所有表格上下居中對齊
 
    ('SPAN', (-2, -2), (-1, -1)),  # 合並
    ('SPAN', (0, 4), (0, 5)),  # 合並
    ('SPAN', (2, 4), (2, 5)),  # 合並
    ('BACKGROUND', (0, 0), (-1, 0), colors.green),  # 設置第一行背景顏色
    ('TEXTCOLOR', (0, -1), (0, -1), colors.green),  # 設置表格內文字顏色
    ('GRID', (0, 0), (-1, -1), 0.1, colors.black),  # 設置表格框線為灰色,線寬為0.1
]
table = Table(data=table_data, style=table_style, colWidths=180)
 
 
story.append(Paragraph("區塊鏈", Title))
story.append(Paragraph("<seq id='spam'/>.區塊鏈概念", Heading2))
story.append(Paragraph(content1, body))
story.append(Paragraph("<seq id='spam'/>.區塊鏈起源", Heading2))
story.append(Paragraph(content2, body))
story.append(Paragraph("<seq id='spam'/>.區塊鏈發展歷程", Heading2))
story.append(Paragraph(content3, body))
story.append(table)
 
# bytes
# buf = BytesIO()
# doc = SimpleDocTemplate(buf, encoding='UTF-8')
# doc.build(story)
# print(buf.getvalue().decode())
 
# file
doc = SimpleDocTemplate('hello.pdf')
doc.build(story)
 

 

最終效果:

————————————————

原文鏈接:https://blog.csdn.net/bocai_xiaodaidai/article/details/102820431


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM