当前位置: 代码网 > it编程>前端脚本>Python > 使用Python实现在PDF文档中生成并添加二维码

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

2026年03月09日 Python 我要评论
在自动化文档生成、产品标签制作或信息分发场景中,经常需要在 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添加二维码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com