在 PHP 中创建 code128 条形码,使用字体而不是将其呈现为图像

Posted

技术标签:

【中文标题】在 PHP 中创建 code128 条形码,使用字体而不是将其呈现为图像【英文标题】:Creating a code128 barcode in PHP, using a font instead of rendering it as an image 【发布时间】:2015-04-26 11:16:35 【问题描述】:

我需要能够将任何字符串转换为可以打印在 PDF 上的 code128 条形码。

我的想法是在 PDF 中嵌入 code128 字体,然后简单地使用该字体来呈现我需要显示为条形码的字符串,一个字母一个字母。

但是,我发现我还需要计算校验和并包括开始和停止字符。

这不能使用 php 实现吗?我在任何地方都没有找到任何解决方案。我能找到的唯一解决方案是将条形码直接渲染为图像,这对我目前的情况没有帮助,因为我需要使用字体在 PDF 中创建条形码。

【问题讨论】:

一些用于 PHP 的 PDF 库带有内置的条形码生成功能。您检查过吗?您使用的是哪个库? 为什么需要使用字体?你不能把图片嵌入到 PDF 中吗? 您需要支持 Code 128A、B 和 C 还是只支持 128B? @BrianAnderson:128B 就足够了。 【参考方案1】:

如果您将努力限制在 128B,您可以访问大小写字符、数字和大多数标点符号。它还使您不必编写代码来移入和移出 A 和 C 符号体系。这使得计算校验和的代码非常简单。

代码 128B 起始字符的值为 104。所有代码 128 变体的终止字符的值为 106,但该值不计入校验和计算。让我们为现实生活中的练习选择字符串“Hello”。您需要确保您可以访问Code 128 table。我将要讨论的所有值都在该表之外,而不是 ASCII 或 UTF-8。

校验和的计算方法是将字符值的倍数与其在条形码中的位置相加,起始码除外。

虽然起始码的位置是“1”,但起始码后面的第一个字符的位置也是如此。所以起始码和数据的第一个字节(‘H’)都乘以数字1((104×1)+(40×1)=144)。

接下来的 4 个字节得到一个递增的乘数 ((69 x 2) + (76 × 3) + (76 × 4) + (79 × 5) = 1065)。将它们加在一起 ​​(144 + 1065) 我们得到 1209。

您应该能够在 PHP 中使用模数运算符 (1209 % 103) 为 Code 128B 字符串“Hello”的校验和字符获取 76(103 是一个常数,相信我)。因此,将“Hello”映射到 Code 128 条形码的最终代码数组是: [104 40 69 76 76 79 76 106]。

您需要查找表来将字符串字符值转换为 Code 128B 字符值,以适应您期望的条形码字体。但您只需要一个循环、一个数组索引、一个因子和的累加器以及一个针对常数值 103 的模运算符。

【讨论】:

【参考方案2】:

在 PHP 中为 PDF 生成条形码的最简单方法是使用专用的软件库。

AFAIK,目前最完整的是tc-lib-barcode (https://github.com/tecnickcom/tc-lib-barcode),它允许您生成线性和二维条码。包含的示例应该可以让您快速入门。

源代码完全符合 PSR-2 标准,可以使用 Composer 轻松添加到您的 PHP 项目中。

原始代码已从TCPDF 移植和重构,并已在数十亿文档中使用。

【讨论】:

您与该项目有什么关系? @MartijnPieters 他是开发者 这很棒,但是对于简单的校验和计算来说,这是一个巨大的项目和过度杀伤力。 @BrianAnderson 在下面的回答描述了需要什么:读入字符、查找其数值的表、增量乘数、将这些加上开始和停止字符以及取模。然后根据数值反向查找字符。然后输出起始字符、文本字符串、校验和字符和终止字符。最后,使用条码字体如 Grand Zebu 的 GPL 字体 Code128。 Grand Zebu 在他的网站上也有一些 VBA 代码:grandzebu.net/informatique/codbar-en/code128.htm

以上是关于在 PHP 中创建 code128 条形码,使用字体而不是将其呈现为图像的主要内容,如果未能解决你的问题,请参考以下文章

Adobe Acrobat 表单中的 Code128 条码

PHP脚本计算code128

PHP Regex 在字符串中插入特定字符串以打印 code128 条形码

php中的C128条码脚本

利用Code128字体将文本转换为code128条形码

使用code128.BarHeight时在条形码下方显示文本[关闭]