網站首頁 編程語言 正文
1.介紹
PDF 格式是與平臺無關,它獨立于底層操作系統和渲染引擎。事實上,PDF 是基于一種腳本語言——PostScript,它是第一個獨立于設備的頁面描述語言。
在本指南中,我們將使用 borb —— 一個專門用于閱讀、操作和生成 PDF 文檔的 Python 庫。它提供了一個低級模型(允許您訪問精確的坐標和布局)和一個高級模型(您可以將邊距、位置等精確計算委托給布局管理器) .
matplotlib
是一個數據可視化庫,也是許多其他流行庫(如 Seaborn)背后的引擎。
基于用于創建報告(通常包括圖形)的常見 PDF 文檔,我們將看看如何使用 borb
將 Matplotlib
圖表集成到 PDF 文檔中。
2.安裝 borb和 matplotlib
borb 可以從 GitHub 上的源代碼下載,或通過 pip 安裝:
$ pip install borb
matplotlib 也可以通過 pip 安裝:
$ pip install matplotlib
用 Borb 在 PDF 文檔中集成 Matplotlib
圖表
在創建餅圖等圖表之前,我們將編寫一個小的效用函數,該函數生成 N 種顏色,均勻分布在顏色光譜中。
每當我們需要創建繪圖并為每個部分著色時,這將對我們有所幫助:
from borb.pdf.canvas.color.color import HSVColor, HexColor from decimal import Decimal import typing ? def create_n_colors(n: int) -> typing.List[str]: ? # The base color is borb-blue ? base_hsv_color: HSVColor = HSVColor.from_rgb(HexColor("56cbf9")) ? # This array comprehension creates n HSVColor objects, transforms then to RGB, and then returns their hex string ? return [HSVColor(base_hsv_color.hue + Decimal(x / 360), Decimal(1), Decimal(1)).to_rgb().to_hex_string() for x in range(0, 360, int(360/n))]
HSL 和 HSV/HSB 是由計算機圖形學研究人員在 1970 年代設計的,目的是更接近人類視覺感知色彩屬性的方式。在這些模型中,每種色調的顏色都排列在一個徑向切片中,圍繞中性色的中心軸,范圍從底部的黑色到頂部的白色:
用它表示顏色的優點是我們可以輕松地將顏色光譜分成相等的部分。
現在我們可以定義一個 create_pie_chart() 函數(或其他類型圖的函數):
# New import(s) import matplotlib.pyplot as plt from borb.pdf.canvas.layout.image.chart import Chart from borb.pdf.canvas.layout.layout_element import Alignment ? def create_piechart(labels: typing.List[str], data: typing.List[float]): ? ? # Symetric figure to ensure equal aspect ratio ? fig1, ax1 = plt.subplots(figsize=(4, 4)) ? ax1.pie( ? ? data, ? ? explode=[0 for _ in range(0, len(labels))], ? ? labels=labels, ? ? autopct="%1.1f%%", ? ? shadow=True, ? ? startangle=90, ? ? colors=create_n_colors(len(labels)), ? ) ? ? ax1.axis("equal") ?# Equal aspect ratio ensures that pie is drawn as a circle. ? ? return Chart( ? ? plt.gcf(), ? ? width=Decimal(200), ? ? height=Decimal(200), ? ? horizontal_alignment=Alignment.CENTERED, ? )
在這里,我們使用 Matplotlib
通過 pie()
函數創建餅圖。
PyPlot 實例的 gcf()
函數返回當前圖形。該圖可以嵌入到 PDF 文檔中,方法是將其注入到 Chart
構造函數中,并與您的自定義參數(例如width, height 和 horizontal_alignment)一起插入。
我們只需向Chart構造函數提供一個 Matplotlib
圖。
3.將 Matplotlib 圖表添加到 PDF 文檔
現在是時候創建我們的 PDF 文檔并向其中添加內容了。
# New import(s) from borb.pdf.document import Document from borb.pdf.page.page import Page from borb.pdf.pdf import PDF from borb.pdf.canvas.layout.page_layout.multi_column_layout import MultiColumnLayout from borb.pdf.canvas.layout.page_layout.page_layout import PageLayout from borb.pdf.canvas.layout.text.paragraph import Paragraph ? # Create empty Document pdf = Document() ? # Create empty Page page = Page() ? # Add Page to Document pdf.append_page(page) ? # Create PageLayout layout: PageLayout = MultiColumnLayout(page) ? # Write title layout.add(Paragraph("About Lorem Ipsum",? ? ? ? ? ? ? ? ? ? ? ?font_size=Decimal(20),? ? ? ? ? ? ? ? ? ? ? ?font="Helvetica-Bold"))
我們將在此 PDF 中使用連字符,以確保文本的布局更加流暢。borb 中的連字符非常簡單:
# New import(s) from borb.pdf.canvas.layout.hyphenation.hyphenation import Hyphenation ? # Create hyphenation algorithm hyphenation_algorithm: Hyphenation = Hyphenation("en-gb") ? # Write paragraph layout.add(Paragraph( ? ? """ ? ? Lorem Ipsum is simply dummy text of the printing and typesetting industry.? ? ? Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,? ? ? when an unknown printer took a galley of type and scrambled it to make a type specimen book.? ? ? It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.? ? ? It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,? ? ? and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. ? ? """, text_alignment=Alignment.JUSTIFIED, hyphenation=hyphenation_algorithm))
現在我們可以使用我們之前聲明的函數添加餅圖;
# Write graph layout.add(create_piechart(["Loren", "Ipsum", "Dolor"],? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[0.6, 0.3, 0.1]))
接下來我們將編寫另外三個 Paragraph
對象。其中一個將不僅僅表示引用(側面邊框,不同字體等)。
# Write paragraph layout.add(Paragraph( ? ? """ ? ? Contrary to popular belief, Lorem Ipsum is not simply random text.? ? ? It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.? ? ? Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words,? ? ? consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature,? ? ? discovered the undoubtable source. ? ? """, text_alignment=Alignment.JUSTIFIED, hyphenation=hyphenation_algorithm)) ? # Write paragraph layout.add(Paragraph( ? ? """ ? ? Lorem Ipsum is simply dummy text of the printing and typesetting industry.? ? ? """,? ? ? font="Courier-Bold", ? ? text_alignment=Alignment.JUSTIFIED,? ? ? hyphenation=hyphenation_algorithm, ? ? border_color=HexColor("56cbf9"), ? ? border_width=Decimal(3), ? ? border_left=True, ? ? padding_left=Decimal(5), ? ? padding_bottom=Decimal(5), )) ? # Write paragraph layout.add(Paragraph( ? ? """ ? ? Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum"? ? ? (The Extremes of Good and Evil) by Cicero, written in 45 BC.? ? ? This book is a treatise on the theory of ethics, very popular during the Renaissance. ? ? """, text_alignment=Alignment.JUSTIFIED, hyphenation=hyphenation_algorithm))
讓我們添加另一個繪圖。
# Write graph layout.add(create_piechart(["Loren", "Ipsum", "Dolor", "Sit", "Amet"],? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[600, 30, 89, 100, 203]))
還有一段內容(Paragraph):
# Write paragraph layout.add(Paragraph( ? ? """ ? ? It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.? ? ? The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here',? ? ? making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text,? ? ? and a search for 'lorem ipsum' will uncover many web sites still in their infancy.? ? ? Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like). ? ? """, text_alignment=Alignment.JUSTIFIED, hyphenation=hyphenation_algorithm))
最后,我們可以存儲文檔(Document):
# Write to disk with open("output.pdf", "wb") as pdf_file_handle: ? PDF.dumps(pdf_file_handle, pdf)
運行此代碼會生成如下所示的 PDF 文檔:
原文鏈接:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/120944432
相關推薦
- 2022-09-21 Python腳本開發中的命令行參數及傳參示例詳解_python
- 2022-09-13 go語言中基本數據類型及應用快速了解_Golang
- 2022-07-22 Python ModuleNotFoundError: No module named通俗的解釋和方
- 2022-07-12 element表格 頻繁切換維度,導致表頭渲染有誤
- 2022-04-05 Python利用prettytable庫輸出好看的表格_python
- 2022-08-10 C++中string字符串分割函數split()的4種實現方法_C 語言
- 2022-12-12 用C語言如何打印一個等腰三角形_C 語言
- 2022-03-30 一篇文章帶你了解C語言的選擇結構_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支