使用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
相关产品推荐
相关产品推荐

