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