rafsalvioni/zeus-barcode

提供面向对象的API以创建、绘制和操作条码数据

2.0.0 2024-06-29 17:38 UTC

This package is auto-updated.

Last update: 2024-08-29 18:06:43 UTC


README

简介

zeus-barcode是一个用于创建、绘制和管理条码数据的API。它具有许多条码实现,并且可以扩展以创建其他条码。

在使用API之前,您应该了解API的上下文。API树将按照以下形式组织

基本API树

  • BarcodeInterface:标识所有条码对象;
    • ChecksumInterface:由使用校验和的数据的条码实现;
    • FixedLengthInterface:由具有固定长度的条码实现。否则,它是可变长度;
    • TwoWidthInterface:由仅使用两种条/空格宽度的条码实现:宽和窄;

这些接口的大部分都已作为特性和实现这些接口的抽象类以及使用这些特性的类来实现。

编码器

条码可以以不同的方式编码。大多数条码使用条和空格进行编码。其他使用条的高度(例如全条和半条)。现在我们已经实现了两个编码器,但您可以通过实现 EncoderInterface 来实现其他编码器。

渲染器

创建条码后,我们可以以不同的格式绘制该条码。渲染器就是做这件事的人。渲染器应该实现 RendererInterface。默认情况下,此包仅具有SVG渲染器。还有PDF和图像渲染器,它们位于单独的包中。

默认用法

要创建条码,您必须实例化所需的条码格式,并将要编码的数据提供给它。例如,我们创建一个Codabar条码

require 'vendor/autoload.php';

use Zeus\Barcode\Codabar;
use Zeus\Barcode\Renderer\SvgRenderer;

$bc = new Codabar('A123456B');
$renderer = new SvgRenderer();
$bc->draw($renderer)->render();

上面的代码将创建一个具有数据"A123456B"的Codabar条码。此条码将使用SvgRenderer绘制,并使用render()方法将结果显示到浏览器中,使用特定的标题。

所有条码都将检查提供的数据是否可以为其编码。如果发生错误,将抛出条码异常。

计算条码校验和

某些条码需要校验和数字。在这些情况下,我们有两种情况

  • 我们有完整的条码数据,包括校验和数字。在这种情况下,条码类将检查提供的校验和数字,如果检查结果为假,则抛出异常;
  • 我们正在创建新的条码或我们没有完整的条码数据。在这种情况下,我们将通知条码类这种情况,它将为我们生成校验和数字。

例如,我们将使用Ean13格式创建带有和没有校验和数字的条码

require 'vendor/autoload.php';

use Zeus\Barcode\Upc\Ean13;

// We don't know the checksum digit, so, we gave false to second argument
$bc = new Ean13('123456789098', false);
echo $bc->getChecksum(); // Prints "2"

// Now we already know the checksum. Let's check it:
$bc = new Ean13('1234567890982', true);
echo $bc->getChecksum(); // Prints "2"

// Let's give a wrong checksum digit
try {
    $bc = new Ean13('1234567890983');
}
catch (\Zeus\Barcode\Exception $ex) {
    echo $ex->getMessage();
}

设置窄和宽条/空格宽度

对于实现TwoWidthInterface的条码,我们可以设置宽和窄条/空格的宽度。让我们看看

require 'vendor/autoload.php';

use Zeus\Barcode\Code2of5\Interleaved;
use Zeus\Barcode\Renderer\SvgRenderer;

$renderer = new SvgRenderer();

// With default width
$bc1 = new Interleaved('5236589', false);
// Changing widths
$bc2 = clone $bc1;
$bc2->setNarrowWidth(2)->setWideWidth(6);

$renderer->stream($bc1)
         ->stream($bc2)
         ->render();

两个宽度都是以像素为单位的。

格式化条码的表示

我们可以参数化条码的显示方式。有许多选项可供选择。让我们看看

  • "barWidth":条或空间的宽度,以渲染器的单位表示。默认为1;
  • "barHeight":条的宽度,以渲染器的单位表示。默认为50;
  • "foreColor":前景颜色,作为整数。用于绘制条和文本。默认为0x000000(黑色);
  • "backColor":背景颜色,作为整数。默认为0xffffff(白色)。如果为负,则表示透明;
  • "border":边框宽度,以渲染器的单位表示。默认为0(无边框);
  • "showText":布尔值,表示是否显示条码的文本表示。默认为true;
  • "textAlign":文本对齐方式。可能的值为:"center","left"和"right"。默认为"center";
  • "textPosition": 文本位置。可能的值:"top" 和 "bottom"。默认 "bottom";
  • "font": 写入文本的字体。可以是单个字符串或字体文件的路径。如果为空,则使用默认字体渲染器。默认 '';
  • "fontSize": 字体大小,以磅(pt)为单位。默认 9;
  • "quietZone": 封装条码的空间,以渲染器单位表示。有助于条码读取器。定义的值将用于左侧和右侧。默认 30;

示例

require 'vendor/autoload.php';

use Zeus\Barcode\Code2of5\Interleaved;
use Zeus\Barcode\Renderer\SvgRenderer;

$renderer = new SvgRenderer();

$bc = new Interleaved('5236589', false);
$bc->backColor = 0xffffaa;
$bc->foreColor = 0x0000ff;
$bc->barwidth  = 2;
$bc->barheight = 150;
$bc->fontsize  = 5;

$bc->draw($renderer)->render();

您还可以在条码上使用 scale() 方法。此方法将按比例调整所有尺寸选项。

管理渲染器

上面我们看到了如何以基本方式使用渲染器。然而,当使用条码时,渲染器可以设置为执行一些无聊的任务。

渲染器样式表示

与条码一样,渲染器有一些参数可以更改条码绘制的方式。它们是

  • "offsetTop": 从顶部偏移量,以渲染器单位表示。默认 0;
  • "offsetLeft": 从左侧偏移量,以渲染器单位表示。默认 0;
  • "backColor": 背景颜色,作为整数,用于调整大小(请参阅 "merge" 选项)。默认 0xffffff(白色);
  • "merge": 这是最佳选项...见下文。布尔值,默认 false;

使用最后一个示例,我们可以这样做

require 'vendor/autoload.php';

use Zeus\Barcode\Code2of5\Interleaved;
use Zeus\Barcode\Renderer\SvgRenderer;

$renderer = new SvgRenderer();

$bc = new Interleaved('5236589', false);
$bc->backColor = 0xffffaa;
$bc->foreColor = 0x0000ff;
$bc->barwidth  = 2;
$bc->barheight = 150;
$bc->fontsize  = 5;

$renderer->offsetTop = 50;
$renderer->offsetLeft = 50;
$renderer->backColor = 0xababab;

$bc->draw($renderer)->render();

使用渲染器的 "merge" 模式

默认情况下,渲染器一次绘制一个条码。如果您绘制一个条码,然后立即绘制另一个条码,第一个绘制的资源将会丢失。但是,如果您将 "merge" 选项设置为 "true",渲染器将合并与它一起绘制的所有条码,返回合并的资源。在宽/窄示例中,我们可以通过使用 stream() 方法看到这一点。

示例

require 'vendor/autoload.php';

use Zeus\Barcode\Code2of5\Interleaved;
use Zeus\Barcode\Renderer\SvgRenderer;

$renderer = new SvgRenderer();

$bc = new Interleaved('5236589', false);
$bc->backColor = 0xffffaa;
$bc->foreColor = 0x0000ff;
$bc->barwidth  = 2;
$bc->barheight = 150;
$bc->fontsize  = 5;

// Setting render to merge mode
$renderer->merge = true;

$renderer->offsetTop = 50;
$renderer->offsetLeft = 50;
$renderer->backColor = 0xababab;

$bc2 = clone $bc;
$bc2->backColor = 0xffffff;

$bc->draw($renderer); // Draw barcode 1
$renderer->offsetLeft += $bc->getTotalWidth() + 20; // Add a offset
$bc2->draw($renderer);  // Draw barcode 2
$renderer->render(); // Show the result

RendererInterface::stream() 方法与上一个示例做同样的事情。它绘制很多条码并排。

使用外部资源进行渲染

有时,我们需要在外部资源上绘制条码。使用 setResource() 方法,我们可以定义外部资源,条码将放置在那里,始终考虑 "offsetLeft" 和 "offsetTop" 选项。为此,将激活合并模式。

示例

require 'vendor/autoload.php';

use Zeus\Barcode\Code2of5\Interleaved;
use Zeus\Barcode\Renderer\SvgRenderer;

$bc = new Interleaved('5236589', false);

$renderer = new SvgRenderer();
$renderer->setResource("<\DOMDocument OBJECT, XML FILE OR XML STRING>");
$renderer->offsetLeft = 50;
$renderer->offsetTop = 50;

$bc->draw($renderer)->render();