使用Python实现在PDF文档中生成并添加二维码

 更新时间:2026年03月09日 08:27:29   作者:用户835629078051  
在自动化文档生成、产品标签制作或信息分发场景中,经常需要在 PDF 文档中插入二维码,本文将介绍如何使用 Python 在 PDF 文档中生成并插入二维码,有需要的小伙伴可以了解下

在自动化文档生成、产品标签制作或信息分发场景中,经常需要在 PDF 文档中插入二维码。二维码能够快速存储和传递信息,用户通过手机扫描即可获取相关内容。本文将介绍如何使用 Python 在 PDF 文档中生成并插入二维码。

环境准备

首先需要安装必要的 Python 库。本文使用 Spire.PDF 和 Spire.Barcode 库来处理 PDF 文档和生成二维码图像。

pip install Spire.PDF
pip install Spire.Barcode

技术思路

在 PDF 中插入二维码主要有两种方法:

  • 先生成二维码图片,再作为图像插入 PDF - 使用条码生成库创建二维码 PNG 图像,然后将其嵌入 PDF 页面
  • 直接在 PDF 画布上绘制二维码 - 部分库支持直接在 PDF 图形上下文中绘制条码

本文将演示第一种方法,它更加灵活且易于控制二维码的样式和位置。

生成二维码图像

首先需要创建一个独立的二维码图像文件。使用 spire.barcode 模块可以轻松生成各种类型的条码。

from spire.barcode import *

def WriteAllBytes(fname: str, data):
    """将字节数据写入文件"""
    with open(fname, "wb") as fp:
        fp.write(data)

# 创建条码设置对象
barcodeSettings = BarcodeSettings()

# 设置条码类型为二维码
barcodeSettings.Type = BarCodeType.QRCode

# 设置二维码包含的数据
barcodeSettings.Data = "https://example.com/product/12345"

# 创建条码生成器
barCodeGenerator = BarCodeGenerator(barcodeSettings)

# 生成二维码图像
barcodeImage = barCodeGenerator.GenerateImage()

# 保存为 PNG 文件
WriteAllBytes("QRCode.png", barcodeImage)

这段代码的关键 API 说明:

  • BarcodeSettings - 条码配置类,用于设置条码类型、数据、颜色等属性
  • BarCodeType.QRCode - 指定生成二维码类型
  • BarCodeGenerator - 条码生成器,根据配置生成图像
  • GenerateImage() - 返回图像的字节数据

将二维码插入 PDF 文档

生成二维码图像后,可以将其作为图像 stamp 添加到 PDF 页面中。以下是完整的实现代码:

from spire.pdf import *
from spire.barcode import BarcodeSettings, BarCodeType, BarCodeGenerator

def WriteAllBytes(fname: str, data):
    with open(fname, "wb") as fp:
        fp.write(data)

# 生成二维码
barcodeSettings = BarcodeSettings()
barcodeSettings.Type = BarCodeType.QRCode
barcodeSettings.Data = "https://example.com/product/12345"
barcodeSettings.ShowText = False
barcodeSettings.ImageHeight = 230.0
barcodeSettings.ImageWidth = 230.0
barcodeSettings.LeftMargin = 1.0
barcodeSettings.TopMargin = 1.0
barcodeSettings.RightMargin = 1.0
barcodeSettings.BottomMargin = 1.0

barCodeGenerator = BarCodeGenerator(barcodeSettings)
barcodeImage = barCodeGenerator.GenerateImage()
WriteAllBytes("temp_qrcode.png", barcodeImage)

# 创建 PDF 文档
doc = PdfDocument()
doc.PageSettings.Size = PdfPageSize.A4()
page = doc.Pages.Add()

# 加载二维码图像
qrcode = PdfImage.FromFile("temp_qrcode.png")

# 定义二维码的位置和尺寸矩形 - 固定在页面左侧位置
qrcode_width = float(qrcode.Width)
qrcode_height = float(qrcode.Height)
page_width = page.Size.Width
page_height = page.Size.Height

# 计算二维码位置:固定在距离左边界 100 点,距离顶部 150 点的位置
stampRect = RectangleF(
    PointF(100.0, 150.0),
    SizeF(qrcode_width, qrcode_height)
)

# 创建橡胶图章注释
loStamp = PdfRubberStampAnnotation(stampRect)

# 创建外观对象
loAppearance = PdfAppearance(loStamp)

# 创建模板并在其中绘制二维码
template = PdfTemplate(stampRect.Width, stampRect.Height)
template.Graphics.DrawImage(qrcode, 0.0, 0.0, float(qrcode.Width), float(qrcode.Height))

# 设置外观并添加到页面注释集合
loAppearance.Normal = template
loAppearance.MouseHover = template
loAppearance.Pressed = template
loStamp.Appearance = loAppearance
page.AnnotationsWidget.Add(loStamp)

# 添加说明文字 - 在二维码下方适当距离
font = PdfTrueTypeFont("微软雅黑", 12.0, PdfFontStyle.Regular, True)
brush = PdfBrushes.get_Black()
text_y_position = stampRect.Y + stampRect.Height + 20.0  # 二维码底部向下 20 点间距
page.Canvas.DrawString("扫描二维码获取产品详情", font, brush, stampRect.X, text_y_position)

# 保存文档
doc.SaveToFile("ProductWithQRCode.pdf")
doc.Close()

插入效果预览

代码解析

二维码位置控制

RectangleF(PointF(x, y), SizeF(width, height)) 定义了二维码在 PDF 页面上的位置和尺寸:

  • PointF(100.0, 150.0) - 二维码左上角坐标,原点位于页面左下角
  • SizeF(qrcode_width, qrcode_height) - 二维码的宽度和高度(单位为点,1 点 ≈ 1/72 英寸)

直接在画布上绘制图像

除了使用注释方式,也可以直接在 PDF 画布上绘制二维码图像:

from spire.pdf.common import *
from spire.pdf import *
from spire.barcode import *

def WriteAllBytes(fname: str, data):
    with open(fname, "wb") as fp:
        fp.write(data)

# 生成二维码
barcodeSettings = BarcodeSettings()
barcodeSettings.Type = BarCodeType.QRCode
barcodeSettings.Data = "https://example.com/contact"
barCodeGenerator = BarCodeGenerator(barcodeSettings)
barcodeImage = barCodeGenerator.GenerateImage()
WriteAllBytes("contact_qr.png", barcodeImage)

# 创建 PDF 并直接绘制
doc = PdfDocument()
page = doc.Pages.Add()

# 加载图像
qrcode = PdfImage.FromFile("contact_qr.png")

# 直接在画布指定位置绘制图像
page.Canvas.DrawImage(qrcode, 50.0, 50.0, 120.0, 120.0)

# 添加标题
font = PdfFont(PdfFontFamily.Helvetica, 16.0, PdfFontStyle.Bold)
page.Canvas.DrawString("联系我们", font, PdfBrushes.get_Black(), 50.0, 180.0)

doc.SaveToFile("ContactCard.pdf")
doc.Close()

这种方法更简单直接,适用于不需要交互式功能的场景。

自定义二维码样式

可以通过调整 BarcodeSettings 的属性来自定义二维码外观:

barcodeSettings = BarcodeSettings()
barcodeSettings.Type = BarCodeType.QRCode
barcodeSettings.Data = "Custom styled QR code"

# 设置前景色和背景色
barcodeSettings.ForeColor = Color.get_Black()
barcodeSettings.BackColor = Color.get_White()

# 设置图像宽度(影响分辨率)
barcodeSettings.ImageWidth = 300

# 设置边距
barcodeSettings.MarginTop = 10
barcodeSettings.MarginBottom = 10
barcodeSettings.MarginLeft = 10
barcodeSettings.MarginRight = 10

barCodeGenerator = BarCodeGenerator(barcodeSettings)
barcodeImage = barCodeGenerator.GenerateImage()

实用技巧

批量生成带二维码的 PDF

当需要为多个产品生成带不同二维码的 PDF 时,可以使用循环处理:

products = [
    {"id": "P001", "url": "https://example.com/p1"},
    {"id": "P002", "url": "https://example.com/p2"},
    {"id": "P003", "url": "https://example.com/p3"}
]

for product in products:
    # 生成二维码
    barcodeSettings.Data = product["url"]
    # ... 生成图像和 PDF
    doc.SaveToFile(f"Product_{product['id']}.pdf")

调整二维码清晰度

如果打印质量要求较高,可以增加二维码图像的分辨率:

barcodeSettings.ImageWidth = 600  # 增加宽度提高分辨率
barcodeSettings.DPI = 300         # 设置 300 DPI 适合打印

总结

本文介绍了使用 Python 在 PDF 文档中插入二维码的完整流程:

  • 使用 spire.barcode 生成二维码图像
  • 使用 spire.pdf 创建或加载 PDF 文档
  • 通过 PdfImage.FromFile() 加载二维码图像
  • 使用 DrawImage() 方法将二维码绘制到指定位置

这种方法适用于产品标签、宣传材料、联系卡片等多种场景。通过调整位置和尺寸参数,可以精确控制二维码在页面上的布局,满足不同的设计需求。

到此这篇关于使用Python实现在PDF文档中生成并添加二维码的文章就介绍到这了,更多相关Python PDF添加二维码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python使用大语言模型进行图表可视化

    Python使用大语言模型进行图表可视化

    Python使用matplotlib进行可视化一直有2个问题,一是代码繁琐,二是默认模板比较丑,在大模型时代,这个问题有了另一种解法,下面我们就来看看如何使用大语言模型进行图表可视化吧
    2025-04-04
  • 如何教少儿学习Python编程

    如何教少儿学习Python编程

    在本篇文章里小编给大家整理了关于教少儿学习Python编程的相关文章及知识点,需要的朋友们可以参考下。
    2020-07-07
  • 探讨python  pandas.DataFrame.to_json 函数

    探讨python  pandas.DataFrame.to_json 函数

    这篇文章主要介绍了python  pandas.DataFrame.to_json 函数示例详解,to_json 函数提供了灵活的参数设置,使得 pandas 数据框能够以多种格式导出为 JSON 文件,需要的朋友可以参考下
    2024-07-07
  • Fabric 应用案例

    Fabric 应用案例

    下面介绍三个比较典型的应用Fabric的示例,涉及文件上传与校验,环境部署,代码发布功能
    2016-08-08
  • 基于FME使用Python过程图解

    基于FME使用Python过程图解

    这篇文章主要介绍了基于FME使用Python过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python使用lxml模块和Requests模块抓取HTML页面的教程

    Python使用lxml模块和Requests模块抓取HTML页面的教程

    用Pyhton自带的urllib或urllib2模块抓取网页或许有些陈词滥调了,今天我们就来玩儿些新鲜的,来看Python使用lxml模块和Requests模块抓取HTML页面的教程:
    2016-05-05
  • Python基础之输入,输出与高阶赋值详解

    Python基础之输入,输出与高阶赋值详解

    这篇文章主要为大家介绍了Python基础之输入,输出与高阶赋值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Python中的__new__与__init__魔术方法理解笔记

    Python中的__new__与__init__魔术方法理解笔记

    这篇文章主要介绍了Python中的__new__与__init__魔术方法理解笔记,需要的朋友可以参考下
    2014-11-11
  • 童年回忆录之python版4399吃豆豆小游戏

    童年回忆录之python版4399吃豆豆小游戏

    相信80,90后都玩过4399网站的小游戏,虽然游戏很low但是童年的回忆,今天小编带你一起用python自己写一个4399吃豆豆的小游戏,文中给大家介绍的非常详细,对大家的学习或工作具有一定的价值
    2021-09-09
  • 关于python3的ThreadPoolExecutor线程池大小设置

    关于python3的ThreadPoolExecutor线程池大小设置

    这篇文章主要介绍了关于python3的ThreadPoolExecutor线程池大小设置,线程池的理想大小取决于被提交任务的类型以及所部署系统的特性,需要的朋友可以参考下
    2023-04-04

最新评论