geekdoc-python-zh/docs/pythonlibrary/an-intro-to-pyfpdf-a-simple...

6.9 KiB
Raw Permalink Blame History

pyfpdf 简介——一个简单的 Python PDF 生成库

原文:https://www.blog.pythonlibrary.org/2012/07/10/an-intro-to-pyfpdf-a-simple-python-pdf-generation-library/

今天我们将看到一个简单的 PDF 生成库,名为 pyfpdf ,它是一个 php 库 FPDF 的一个端口。这不是 Reportlab 的替代品,但它确实为您提供了创建简单 pdf 的足够能力,并且可能满足您的需求。让我们来看看它能做什么!

注:不再维护 PyFPDF。已经换成了fpdf 2

安装 pyfpdf

您可以只使用 pip 来安装 pyfpdf:

pip install pyfpdf

试用 pyfpdf

与任何新的库一样,您需要实际编写一些代码来查看它是如何工作的。下面是创建 PDF 的最简单的脚本之一:

import pyfpdf

pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", align="C")
pdf.output("tutorial.pdf")

注意,当我们初始化我们的 FPDF 对象时我们需要告诉它我们希望结果是“字母”大小。默认为“A4”。接下来我们需要添加一个页面设置字体并把一些文本。 pdf.cell 调用有点不直观。前两个参数是宽度和高度,指定了传入文本的位置。 align 参数只接受单个字母缩写您必须查看源代码才能弄清楚。在这种情况下我们通过传递一个“C”来使文本居中。最后一行接受两个参数:pdf 名称和目的地。如果没有目的地,那么 PDF 将输出到脚本运行的目录。

如果您想添加另一行呢?如果你编辑单元格的大小,然后创建另一个单元格,你可以在末尾添加更多的文本。如果您需要换行符,那么您可以将代码更改为以下内容:

import pyfpdf

pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
pdf.cell(200,10,'Powered by FPDF',0,1,'C')
pdf.output("tutorial.pdf")

这产生了下面的 PDF:tutorial.pdf

添加页眉、页脚和分页符

pyfpdf 的 Google 代码站点上的教程展示了如何做页眉、页脚和分页符。它不能运行是因为一个方法名肯定已经改变了而且代码是用“this”而不是“self”写的所以我重写了它并稍微清理了一下。代码如下:

import pyfpdf

########################################################################
class MyPDF(pyfpdf.FPDF):
    """"""

    #----------------------------------------------------------------------
    def header(self):
        """
        Header on each page
        """
        # insert my logo
        self.image("logo.png", x=10, y=8, w=23)
        # position logo on the right
        self.cell(w=80)

        # set the font for the header, B=Bold
        self.set_font("Arial", style="B", size=15)
        # page title
        self.cell(40,10, "Python Rules!", border=1, ln=0, align="C")
        # insert a line break of 20 pixels
        self.ln(20)

    #----------------------------------------------------------------------
    def footer(self):
        """
        Footer on each page
        """
        # position footer at 15mm from the bottom
        self.set_y(-15)

        # set the font, I=italic
        self.set_font("Arial", style="I", size=8)

        # display the page number and center it
        pageNum = "Page %s/{nb}" % self.page_no()
        self.cell(0, 10, pageNum, align="C")

#----------------------------------------------------------------------
if __name__ == "__main__":
    pdf = MyPDF()
    pdf.alias_nb_pages()
    pdf.add_page()
    pdf.set_font("Times", size=12)

    # put some lines on the page
    for i in range(1, 50):
        pdf.cell(0, 10, "Line number %s" % i, border=0, ln=1)
    pdf.output("tutorial2.pdf")

这创建了下面的 PDF:tutorial2.pdf

这一次,我们创建了 FPDF 的一个子类,并覆盖了它的 headerfooter 方法,因为它们实际上不做任何事情(也就是说,它们是存根)。在我们的头中,我们创建一个图像对象,并传入一个徽标文件以及徽标的 x/y 位置和宽度(23)。如果你关心保持长宽比正常,你也可以通过一个高度。然后我们定位它,并为标题插入一串文本。最后,我们放入一个换行符。

页脚设置为距离底部 15 毫米。它也是 8 磅的 Arial 斜体。官方教程的错误是它调用了 self。PageNo(),但那并不存在。然而有一个 page_no 方法似乎可以替代它,所以我使用了它。然后在脚本的底部,我们实际上创建了我们的 pdf 对象,并告诉它写一串行。如果您运行这个脚本,您应该得到一个 3 页的文档。

使用 pyfpdf 从 HTML 生成 pdf

我的一个读者指出 pyfpdf 也可以从基本 HTML 生成 pdf。我不知道我怎么没发现但这是真的你可以你可以在该项目的维基上读到它。我在下面复制一个稍加修改的例子:

html = """

html2fpdf

基本用法

您现在可以轻松打印文本,同时混合不同的样式:粗体斜体、下划线或 一次全部 也可以插入类似这样的超链接 www.mousevspython.comg ,或者在图片中包含超链接。只需点击下面的一个。

[![](img/b9b9ee79fb04412affe4c8204df56070.png)](http://www.mousevspython.com)

样本列表

  • 选项 3

标题 1 标题 2

单元格 1 单元格 2

细胞 2 细胞 3

"""从 pyfpdf 导入 fpdfHTMLMixin 类 my pdf(FPDFhtml mixin):pass pdf = my pdf()# First page pdf . add _ page()pdf . write _ html(html)pdf . output(' html . pdf '' F ')

这将创建以下 PDF:html.pdf

包扎

他们的网站上还有一个关于颜色和换行符的教程,但我会把它留给你作为练习。我在这里没有看到任何关于绘图、插入表格或图形、自定义字体嵌入或 Reportlab 中可用的许多其他功能的内容,但这应该是一个简单的 PDF 生成库。如果您需要更高级的特性,那么您当然应该看看 Reportlab甚至是基于它的一些分支项目(我想到了 rst2pdf 或 xhtml2pdf)。

进一步阅读

源代码