为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2021-07-22 16:11:15
我在正确保存我的 pdf 时遇到了一些麻烦。我正在尝试绘制条形码标签,然后将其另存为 pdf,如下面的代码所示。我已经在我的 Windows 上安装了 code128.ttf 字体。此外,我尝试将 .savefig dpi 参数设置为 fig.dpi,如本文所述。import osimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmdef 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()    returndraw_label('123456789')这是绘图窗口中的输出。这是 .pdf 保存文件中输出的内容,这适用于所有类型的标签 - 除了 8 之外的数字 1 到 9 并非不可打印。编辑:如果我用普通文本字体(在本例中为 Frutiger Roman)代替 code128.ttf,并设置 plt.axis('on') 文本不会被剪裁,请参阅此。承认,它不漂亮,不太适合,但它应该仍然可读。
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

山姆,

首先,您的条形码不会按原样扫描。该字符串需要为 Code128B 添加一个开始字符、一个校验和和一个停止字符。所以,就是这样。


//img1.sycdn.imooc.com//6101274a0001d44b09130356.jpg

我建议更改为 Code 39 字体(不需要校验和,并且开始和停止字符相同:“*”)或编写代码以生成校验和并在Code 128 Wiki 上了解更多关于Code 128 的信息。

其次,我怀疑在转换为 PDF 期间图形的边界框存在问题。被转换的那一小部分条码看起来更像是字符串中数字 9 的一部分。我怀疑正在进行一些图像剪辑。

//img1.sycdn.imooc.com//6101275900017a5108990369.jpg

尝试替换常规文本字体以确保条码图像不会在转换过程中丢失。


编辑答案以包含使用 PNG 而不是 PDF 的建议。


如果您输出为 PNG 格式,我设法让该软件正常工作。我知道,现在问题变成了如何将 PNG 转换为 PDF。您可以从调查这里提到的一些库开始:从图像列表创建 PDF


简而言之,我建议您创建图形文件,然后将它们嵌入到文档文件中。


我还添加了使用开始、校验和和停止字符构建条形码所需的代码:


导入操作系统


导入 matplotlib.pyplot 作为 plt


从 matplotlib 导入 font_manager 作为 fm


def 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('测试&显示')


查看完整回答
反对 回复 2021-07-28
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信