在自动化文档生成、产品标签制作或信息分发场景中,经常需要在 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()方法将二维码绘制到指定位置
这种方法适用于产品标签、宣传材料、联系卡片等多种场景。通过调整位置和尺寸参数,可以精确控制二维码在页面上的布局,满足不同的设计需求。