You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FPDF2与python.barcode生成PDF时条码不显示的问题及替代方案咨询

解决FPDF2不显示Code39条码的问题

原代码的问题修正

你的代码存在两个关键问题导致条码无法显示:

  • 实例化PDF对象的语法错误:应使用FPDF()而非new PDF()
  • BytesIO写入条码数据后,文件指针停留在数据流末尾,FPDF无法读取内容,需调用seek(0)重置指针到起始位置

修正后的代码如下:

from barcode import Code39
from barcode.writer import ImageWriter
from fpdf import FPDF
from io import BytesIO

# 修正PDF实例化方式
pdf = FPDF()
pdf.add_page()
rv = BytesIO()
Code39("TEST", writer=ImageWriter()).write(rv)
# 重置文件指针到起始位置
rv.seek(0)
pdf.image(rv, 10, 10, 100)
pdf.output(name="test.pdf")

更优的实现方法:直接用FPDF2生成矢量Code39条码

无需依赖额外图片生成库,FPDF2可直接绘制矢量格式的Code39条码,生成的PDF体积更小、条码更清晰,还能自定义尺寸和颜色:

from fpdf import FPDF

class PDF(FPDF):
    def code39(self, x, y, code, w=0.5, h=10, color=(0,0,0)):
        # Code39字符与编码映射
        code39_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
        code39_codes = [
            "101001101101", "110100101011", "101100101011", "110110010101",
            "101001101011", "110100110101", "101100110101", "101001011011",
            "110100101101", "101100101101", "110101001011", "101101001011",
            "110110100101", "101011001011", "110101100101", "101101100101",
            "101010011011", "110101001101", "101101001101", "101011001101",
            "110101010011", "101101010011", "110110101001", "101011010011",
            "110101101001", "101101101001", "101010110011", "110101011001",
            "101101011001", "101011011001", "110010101011", "100110101011",
            "110011010101", "100101101011", "110010110101", "100110110101",
            "100101011011", "110010101101", "100110101101", "100100100101",
            "100100101001", "100101001001", "101001001001"
        ]
        # 添加上Code39要求的起始/终止符*
        code = "*" + code.upper() + "*"
        self.set_draw_color(*color)
        # 逐位绘制条码线条
        for char in code:
            idx = code39_chars.index(char)
            bits = code39_codes[idx]
            for bit in bits:
                if bit == "1":
                    self.rect(x, y, w, h)
                x += w
        # 在条码下方绘制文本
        self.set_font("Arial", size=8)
        self.text(x - len(code)*12*w, y + h + 2, code)

# 使用自定义PDF类生成条码
pdf = PDF()
pdf.add_page()
# 参数:x坐标、y坐标、条码内容、条宽、条高、颜色
pdf.code39(10, 10, "TEST", w=0.4, h=15, color=(0,0,0))
pdf.output("test.pdf")

这种方式无需生成中间图片,直接在PDF中绘制矢量条码,效率更高且条码质量更稳定。

内容的提问来源于stack exchange,提问作者Elcid_91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:10:14