Python PDF生成和二进制流转换(FPDF)

简介: Python PDF生成和二进制流转换(FPDF)

安装FPDF

pip install fpdf2==2.7.4

生成PDF文档

通过FPDF生成PDF文档的具体步骤:

  • 初始化:fpdf库的操作主要由FPDF对象来处理,在生成PDF文档时,需要初始化FPDF对象。
  • 添加页面:初始化的FPDF对象默认时空白文档,需要在对象中调用add_page()方法来添加新的页面。如果页面已经存在,首先调用footer()方法来输出页脚,在添加新页面,调用header()方法显示页眉。
    • 设置页面方向:在调用add_page()方法时可以通过设置orientation参数来设置页面的方向。
      • portrait, p, P: 纵向,默认方向
      • landscape, l, L: 横向
  • 在页面上打印设置文本之前,需要设置PDF所用的字体,可以调用add_font()方法来添加字体,然后调用set_font()方法来设置之后打印文本所使用的字体。
  • 在页面上打印添加文本内容,需要通过cell()multi_cell()方法进行打印
    • cell(): 打印带有可选边框,背景色和字符串的单元格。
    • multi_cell(): 允许使用换行符打印文本。可以说自动的(文本到达单元格的右边框)或显式调用

参考代码如下所示:

from fpdf import FPDF

def gen_pdf_file(data):
    pdf = FPDF()
    pdf.add_font('FangSong', '', 'FangSong.ttf', True)
    pdf.set_font('FangSong', size=16)

    pdf.add_page(orientation='L')

    effective_page_with = pdf.w - 2 * pdf.l_margin
    pdf.multi_cell(effective_page_with, 10, txt=str(data).encode().decode('UTF-8'), align='C')
    pdf.output('./test.pdf')

if __name__ == '__main__':
    data = "Hello World!"
    gen_pdf_file(data)

调用代码自动生成PDF文件。

生成PDF的二进制流

在上面代码的中,我们调用output()方法自动生成了PDF文件,但在实际应用中,我们可能不需要直接保存PDF文件,而是直接生成PDF文件的二进制流。由于在进行multi_cell()等操作在FPDF()对象中添加内容后,此时的FPDF()对象仍是一个Python对象,而不是PDF对象,所以需要先将FPDF()对象转换为对应的PDF对象,获取其流信息。
观察FPDF库的代码,可以看到,在FPDF()对象中执行output()函数时,其是通过将FPDF()对象的内容进行处理,生成buffer内容保存在FPDF()对象的属性中,然后写入到文件中。在我们根据FPDF()对象生成PDF二进制流时,可以参考其output()函数的内容,只生成相应的buffer信息,但不将其内容写入到文件中。

import io

from fpdf import FPDF
from fpdf.output import OutputProducer

def _gen_pdf_buffer(pdf: FPDF, output_producer_class=OutputProducer):
    """
    此代码参考FPDF().output()完成,不做深入了解
    """
    # Finish document if necessary
    if not pdf.buffer:
        if pdf.page == 0:
            pdf.add_page()
        # Generating final page footer
        pdf.in_footer = True
        pdf.footer()
        pdf.in_footer = False
        # Generating .buffer based on .pages
        if pdf._toc_placeholder:
            pdf._insert_table_of_contents()
        if pdf.str_alias_nb_pages:
            pdf._substitute_page_number()
        output_producer = output_producer_class(pdf)
        pdf.buffer = output_producer.bufferize()
    return pdf.buffer

def gen_pdf_bytes_io(data):
    pdf = FPDF()
    pdf.add_font('FangSong', '', 'FangSong.ttf', True)
    pdf.set_font('FangSong', size=16)

    pdf.add_page(orientation='L')

    effective_page_with = pdf.w - 2 * pdf.l_margin
    pdf.multi_cell(effective_page_with, 10, txt=str(data).encode().decode('UTF-8'), align='C')

    buffer = _gen_pdf_buffer(pdf)
    return io.BytesIO(buffer)

上面的代码为生成FPDF对象二进制流的主要代码,通过flask的send_file()方法验证如下:

@app.route('/download')
def download_file():
    return send_file(gen_pdf_bytes_io("Hello World"), mimetype='application/pdf')

如下图所示,可以看到以上方法成功生成了PDF二进制流。
fpdf.png

相关文章
|
7月前
|
安全 JavaScript 开发者
Python 自动化办公神器|一键转换所有文档为 PDF
本文介绍一个自动化批量将 Word、Excel、PPT、TXT、HTML 及图片转换为 PDF 的 Python 脚本。支持多格式识别、错误处理与日志记录,适用于文档归档、报告整理等场景,大幅提升办公效率。仅限 Windows 平台,需安装 Office 及相关依赖。
371 0
|
6月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1623 0
|
7月前
|
程序员 数据安全/隐私保护 Python
1行Python代码,实现PDF的加密、解密
程序员晚枫分享使用python-office库实现PDF批量加密与解密的新方法。只需一行代码,即可完成单个或多个PDF文件的加密、解密操作,支持文件路径与正则筛选,适合自动化办公需求。更新至最新版,适配性更佳,操作更简单。
274 8
1行Python代码,实现PDF的加密、解密
|
8月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
Python
Python办公自动化:删除任意页数pdf页面
Python办公自动化:删除任意页数pdf页面
431 2
Python办公自动化:删除任意页数pdf页面
|
7月前
|
监控 Linux 数据安全/隐私保护
Python实现Word转PDF全攻略:从入门到实战
在数字化办公中,Python实现Word转PDF自动化,可大幅提升处理效率,解决格式兼容问题。本文详解五种主流方案,包括跨平台的docx2pdf、Windows原生的pywin32、服务器部署首选的LibreOffice命令行、企业级的Aspose.Words,以及轻量级的python-docx+pdfkit组合。每种方案均提供核心代码与适用场景,并涵盖中文字体处理、表格优化、批量进度监控等实用技巧,助力高效办公自动化。
1650 0
|
8月前
|
前端开发 安全 Java
办公自动化必修课:用Python打造PDF全能处理工具
在职场中,PDF处理常令人崩溃:拆分、合并、加密等问题严重影响效率。本文教你用Python打造一个包含拆分、合并、加密、水印四大功能的PDF工具箱,通过实战代码提升办公自动化水平,让文档操作像拼乐高一样简单高效。
270 0
|
9月前
|
数据采集 存储 API
Python爬虫结合API接口批量获取PDF文件
Python爬虫结合API接口批量获取PDF文件
|
11月前
|
文字识别 程序员 UED
Python + 腾讯云,多页PDF发票识别一键搞定!
程序员晚枫团队推出了基于Python和腾讯云的多页PDF发票识别功能!通过一行代码即可实现整本PDF发票的高效识别,并直接导出为Excel文件,极大提升工作效率。此次更新修复了仅识别第一页的bug,支持多页PDF完整识别。未来还将拓展更多票据类型、优化速度并加强平台合作。欢迎用户体验并提出建议,共同推动开源项目poocr的成长与进化!
476 7
|
Python
Python对PDF文件页面的旋转和切割
Python对PDF文件页面的旋转和切割
367 3

推荐镜像

更多