猿问

绘图条码在绘图窗口中的显示与在保存的 .pdf 中不同

我在正确保存我的 pdf 时遇到了一些麻烦。我正在尝试绘制条形码标签,然后将其另存为 pdf,如下面的代码所示。我已经在我的 Windows 上安装了 code128.ttf 字体。此外,我尝试将 .savefig dpi 参数设置为 fig.dpi,如本文所述。


import os


import matplotlib.pyplot as plt


from matplotlib import font_manager as fm



def draw_label(label, label_dimensions_x=3.8189, label_dimensions_y=1.41732):


    # import barcode code128 font

    fpath = os.path.join("path", "to", "font", "code128.ttf")


    prop = fm.FontProperties(fname=fpath, size=58)


    fig, ax = plt.subplots(1, figsize=(label_dimensions_x,

                                       label_dimensions_y))


    plt.axis('off')

    plt.xticks([], [])

    plt.yticks([], [])

    plt.tight_layout()

    plt.xlim(0, label_dimensions_x)

    plt.ylim(0, label_dimensions_y)


    # plot barcode

    plt.text(label_dimensions_x / 2, label_dimensions_y / 2, label,

             ha='center', va='bottom',

             fontproperties=prop)


    plt.show()


    try:

        plt.savefig(os.path.join("path", "to", "output", label + '.pdf'),

                    dpi=plt.gcf().dpi)

    except PermissionError:

        logging.warning("Close the current label pdf's before running this script.")


    plt.close()


    return


draw_label('123456789')

这是绘图窗口中的输出。


这是 .pdf 保存文件中输出的内容,这适用于所有类型的标签 - 除了 8 之外的数字 1 到 9 并非不可打印。编辑:如果我用普通文本字体(在本例中为 Frutiger Roman)代替 code128.ttf,并设置 plt.axis('on') 文本不会被剪裁,请参阅此。承认,它不漂亮,不太适合,但它应该仍然可读。


慕森王
浏览 162回答 2
2回答

弑天下

山姆,首先,您的条形码不会按原样扫描。该字符串需要为 Code128B 添加一个开始字符、一个校验和和一个停止字符。所以,就是这样。我建议更改为 Code 39 字体(不需要校验和,并且开始和停止字符相同:“*”)或编写代码以生成校验和并在Code 128 Wiki 上了解更多关于Code 128 的信息。其次,我怀疑在转换为 PDF 期间图形的边界框存在问题。被转换的那一小部分条码看起来更像是字符串中数字 9 的一部分。我怀疑正在进行一些图像剪辑。尝试替换常规文本字体以确保条码图像不会在转换过程中丢失。编辑答案以包含使用 PNG 而不是 PDF 的建议。如果您输出为 PNG 格式,我设法让该软件正常工作。我知道,现在问题变成了如何将 PNG 转换为 PDF。您可以从调查这里提到的一些库开始:从图像列表创建 PDF简而言之,我建议您创建图形文件,然后将它们嵌入到文档文件中。我还添加了使用开始、校验和和停止字符构建条形码所需的代码:导入操作系统导入 matplotlib.pyplot 作为 plt从 matplotlib 导入 font_manager 作为 fmdef draw_label(label, label_dimensions_x=3.8189, label_dimensions_y=1.41732):    # 导入条码code128字体    fpath = os.path.join("./", "code128.ttf")    prop = fm.FontProperties(fname=fpath, size=32)    图, ax = plt.subplots(1, figsize=(label_dimensions_x,                                       label_dimensions_y))    plt.axis('关闭')    plt.xticks([], [])    plt.yticks([], [])    plt.tight_layout()    plt.xlim(0, label_dimensions_x)    plt.ylim(0, label_dimensions_y)    # calc checksum THEN 绘制条形码    重量 = 1    总和 = 104    对于标签中的 x:        chksum = chksum + 权重*(ord(x)-32)        重量 = 重量 + 1    chksum = chksum % 103    chkchar = chr(chksum+32)    label128 = "%s%s%s%s" % ('Ñ', label, chkchar, 'Ó')    plt.text(label_dimensions_x / 2, label_dimensions_y / 2, label128,             ha='中心', va='底部',             字体属性=道具)    尝试:        plt.savefig(os.path.join("./", label + '.png'))    除了权限错误:        logging.warning("在运行此脚本之前关闭当前标签 pdf。")    返回draw_label('123456789')draw_label('987654321')draw_label('测试&显示')
随时随地看视频慕课网APP

相关分类

Python
我要回答