如何将Python字符串生成PDF?

来源:站长源码作者:马来西亚程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何将Python字符串生成PDF?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何将Python字符串生成PDF?》有用,将其分享出去将是对创作者最好的鼓励。

在Python开发中,将字符串内容转换为PDF文件是常见需求,可用于生成电子票据、数据报表、存档文档等场景,实现方式有多种,其中使用reportlab库是最主流的方案之一。

如何将Python字符串生成PDF?

常用方案对比

目前Python中生成PDF的库较多,不同库的适用场景有所区别,以下是常见方案的对比:

库名称优势劣势适用场景
reportlab功能全面,支持自定义样式、插入图片、表格等,文档完善学习成本稍高,复杂排版需要较多配置需要自定义PDF样式、生成复杂内容的场景
fpdf轻量易用,上手简单,代码量少功能相对有限,复杂排版支持不足简单文本内容生成PDF的场景
weasyprint支持HTML和CSS渲染,适合已有HTML内容的转换依赖较多,安装相对复杂已有HTML格式内容需要转PDF的场景

使用reportlab实现字符串转PDF

环境安装

首先需要安装reportlab库,使用pip命令即可完成安装:

pip install reportlab

基础实现步骤

使用reportlab生成PDF的核心流程分为三步:创建PDF文档对象、添加内容页、写入字符串内容并保存文件。以下是完整的实现代码:

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4

def string_to_pdf(content, output_path, font_path="simhei.ttf"):
    # 注册中文字体,避免中文显示乱码
    pdfmetrics.registerFont(TTFont("SimHei", font_path))
    # 创建PDF画布,设置页面大小为A4
    c = canvas.Canvas(output_path, pagesize=A4)
    # 设置字体和字号
    c.setFont("SimHei", 12)
    # 设置起始坐标,A4页面左上角为(0, 841.89),这里从(50, 800)开始写入
    x = 50
    y = 800
    # 按行分割字符串,逐行写入PDF
    lines = content.split("n")
    for line in lines:
        # 如果当前y坐标小于50,新建一页
        if y < 50:
            c.showPage()
            c.setFont("SimHei", 12)
            y = 800
        c.drawString(x, y, line)
        y -= 20  # 行间距设置为20
    # 保存PDF文件
    c.save()

if __name__ == "__main__":
    # 待转换的字符串内容
    text_content = "这是一段测试字符串n第二行内容n第三行内容n这是中文内容测试,验证字体是否正常显示"
    # 输出PDF路径
    output_file = "output.pdf"
    string_to_pdf(text_content, output_file)
    print("PDF生成完成,路径为:" + output_file)

代码说明

上述代码中需要注意几个关键点:

  • 中文字体注册:reportlab默认不支持中文,需要下载中文字体文件(如黑体simhei.ttf),放在代码同目录下,通过pdfmetrics.registerFont方法注册后才能正常显示中文。
  • 坐标系统:reportlab的画布坐标以页面左下角为原点(0,0),A4页面尺寸为(595.27, 841.89),代码中从(50,800)开始写入,避免内容贴边。
  • 分页处理:当内容超过一页时,通过判断y坐标的值,调用showPage方法新建页面,继续写入剩余内容。

常见问题解决

中文显示乱码

如果出现中文乱码,首先检查中文字体文件是否存在,路径是否正确,字体注册的名称是否和后续setFont方法调用的名称一致。如果字体文件损坏,也会导致中文无法正常显示,可更换其他中文字体文件重试。

字符串换行问题

如果字符串内容较长,没有手动换行,会出现内容超出页面右侧的情况。可以通过计算字符串宽度,自动换行的方式解决,以下是自动换行的补充代码:

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm

def auto_wrap_text(text, font_name, font_size, max_width):
    # 自动换行函数,根据最大宽度拆分文本
    words = text
    lines = []
    current_line = ""
    for char in words:
        test_line = current_line + char
        # 获取当前测试行的宽度
        width = pdfmetrics.stringWidth(test_line, font_name, font_size)
        if width <= max_width:
            current_line = test_line
        else:
            lines.append(current_line)
            current_line = char
    if current_line:
        lines.append(current_line)
    return lines

def string_to_pdf_auto_wrap(content, output_path, font_path="simhei.ttf"):
    pdfmetrics.registerFont(TTFont("SimHei", font_path))
    c = canvas.Canvas(output_path, pagesize=A4)
    c.setFont("SimHei", 12)
    x = 50
    y = 800
    max_width = A4[0] - 100  # 左右各留50的边距
    # 先按手动换行分割,再对每一行做自动换行
    raw_lines = content.split("n")
    all_lines = []
    for raw_line in raw_lines:
        wrapped_lines = auto_wrap_text(raw_line, "SimHei", 12, max_width)
        all_lines.extend(wrapped_lines)
    for line in all_lines:
        if y < 50:
            c.showPage()
            c.setFont("SimHei", 12)
            y = 800
        c.drawString(x, y, line)
        y -= 20
    c.save()

if __name__ == "__main__":
    long_text = "这是一段非常长的测试字符串,没有手动换行,需要程序自动根据页面宽度进行换行处理,验证自动换行功能是否正常工作,确保内容不会超出页面右侧边界"
    string_to_pdf_auto_wrap(long_text, "auto_wrap_output.pdf")
    print("自动换行PDF生成完成")

其他方案简介

如果不想使用reportlab,也可以选择fpdf库实现简单场景的字符串转PDF,以下是fpdf的实现示例:

from fpdf import FPDF

class PDF(FPDF):
    def header(self):
        self.set_font("SimHei", "B", 12)
        self.cell(0, 10, "字符串生成PDF示例", 0, 1, "C")

    def footer(self):
        self.set_y(-15)
        self.set_font("SimHei", "I", 8)
        self.cell(0, 10, "第 " + str(self.page_no()) + " 页", 0, 0, "C")

def fpdf_string_to_pdf(content, output_path):
    pdf = PDF()
    pdf.add_font("SimHei", "", "simhei.ttf", uni=True)
    pdf.set_font("SimHei", "", 12)
    pdf.add_page()
    pdf.multi_cell(0, 10, content)
    pdf.output(output_path)

if __name__ == "__main__":
    test_content = "使用fpdf库生成的PDF内容n第二行内容"
    fpdf_string_to_pdf(test_content, "fpdf_output.pdf")
    print("fpdf生成PDF完成")

fpdf的优势是代码更简洁,multi_cell方法可以自动处理换行,但自定义样式的能力不如reportlab,开发者可以根据实际需求选择合适的方案。

PythonPDF生成字符串转PDFreportlab修改时间:2026-07-21 11:54:37

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。