如何使用 Python 在 PDF 文档中添加二维码

0 阅读4分钟

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

环境准备

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

pip install Spire.PDF
pip install Spire.Barcode

技术思路

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

  1. 先生成二维码图片,再作为图像插入 PDF - 使用条码生成库创建二维码 PNG 图像,然后将其嵌入 PDF 页面
  2. 直接在 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()

插入效果预览

Python生成并插入二维码到PDF文档

代码解析

二维码位置控制

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 文档中插入二维码的完整流程:

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

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