Ga naar inhoud

1D- en 2D-barcodes genereren in een PDF

Dit recept tekent eendimensionale (1D) en tweedimensionale (2D) barcodes rechtstreeks op een PDF-pagina (Portable Document Format). De Core-trait HasBarcodes biedt u de methoden write1DBarcode() en write2DBarcode(). Beide methoden tekenen het symbool als native PDF-padoperatoren op de huidige pagina, zodat de uitvoer eenvoudige, deterministische vectorinhoud blijft. Het recept is gebaseerd op examples/10-barcodes.php.

Terminal window
composer require nextpdf/core:^3

U hebt geen extra extensie nodig. De barcode-encoders zijn puur PHP en NextPDF tekent de symbolen met de standaard PDF-rechthoekoperator (ISO 32000-2 §8.5).

Een barcode wordt getekend en niet als afbeelding ingesloten. De payload bestaat uit de gegevens die u codeert, zoals een productnummer of een webadres.

write1DBarcode() codeert de payload in een bar/space-patroon voor het gekozen BarcodeType en produceert daarna een reeks gevulde rechthoeken. write2DBarcode() bouwt een matrix met modules voor het gekozen Barcode2DType en produceert één gevulde rechthoek voor elke donkere module. Data Matrix en QR Code gebruiken Reed-Solomon-foutcorrectie, zodat een scanner de gegevens kan herstellen, zelfs wanneer een deel van het symbool beschadigd is.

Elke module is een deterministisch re … f-pad zonder entropiebron, zodat de barcode-inhoud op zichzelf volledig reproduceerbaar is. Het reproduceerbaarheidsprofiel is structural omdat het omringende document nog steeds atomen bevat die bij elke opslagactie worden gegenereerd: de trailer /ID, plus de tijdstempels /CreationDate en /ModDate. De harness vergelijkt de qpdf-genormaliseerde structuur nadat die atomen zijn verwijderd.

NextPDF\Core\Concerns\HasBarcodes (gemengd in Document):

  • write1DBarcode(string $code, BarcodeType $type, ?float $x = null, ?float $y = null, float $w = 0, float $h = 30, float $barWidth = 0.4, bool $skipZeroWidthBars = true): static
  • write2DBarcode(string $code, Barcode2DType $type, ?float $x = null, ?float $y = null, float $w = 0, float $h = 0, float $moduleSize = 1.0, string $ecLevel = 'L', ?int $mask = null, ?int $version = null, bool $gs1 = false, bool $dmre = false, bool $rectangular = false): static

Een symbologie is een barcodestandaard die bepaalt hoe gegevens worden omgezet in balken of modules. BarcodeType bevat de 1D-symbologieën (C128, EAN13, UPCA, I25, CODABAR, ISBN, GS1_128, …) en Barcode2DType bevat de 2D-symbologieën (QRCode, DataMatrix, PDF417, HanXin, MicroQR, …).

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Barcode\Barcode2DType;
use NextPDF\Barcode\BarcodeType;
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->setTitle('Barcode Quick Start');
$doc->addPage();
$doc->write1DBarcode('NEXTPDF-2026', BarcodeType::C128, x: 15, y: 30, w: 80, h: 20);
$doc->write2DBarcode('https://nextpdf.dev', Barcode2DType::QRCode, x: 15, y: 60, w: 40, h: 40);
$doc->save(__DIR__ . '/barcodes.pdf');
echo "Wrote barcodes.pdf\n";

Het volledige voorbeeld hieronder, dat door de harness kan worden uitgevoerd, komt overeen met examples/10-barcodes.php. Het schrijft de PDF naar het pad dat de harness aanlevert via NEXTPDF_COOKBOOK_OUTPUT en valt terug op een lokaal bestand wanneer u het handmatig uitvoert. De reproduceerbaarheidsharness kan het daarna twee keer uitvoeren en structurele identiteit afdwingen. De structuur is qpdf-genormaliseerd, met de bij elke opslagactie gegenereerde atomen /ID en tijdstempels verwijderd.

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Barcode\Barcode2DType;
use NextPDF\Barcode\BarcodeType;
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->setTitle('Barcode Examples');
$doc->addPage();
$doc->setFont('helvetica', 'B', 18);
$doc->cell(0, 12, 'Barcode Examples', newLine: true);
$doc->ln(5);
// --- 1D barcodes ---
$doc->setFont('helvetica', 'B', 14);
$doc->cell(0, 10, '1D Barcodes', newLine: true);
$doc->ln(3);
$doc->setFont('helvetica', '', 10);
$doc->cell(0, 6, 'Code 128:', newLine: true);
$doc->write1DBarcode('NEXTPDF-2026', BarcodeType::C128, x: 15, y: null, w: 80, h: 20);
$doc->ln(28);
$doc->cell(0, 6, 'EAN-13:', newLine: true);
$doc->write1DBarcode('4006381333931', BarcodeType::EAN13, x: 15, y: null, w: 60, h: 20);
$doc->ln(28);
// --- 2D barcodes ---
$doc->setFont('helvetica', 'B', 14);
$doc->cell(0, 10, '2D Barcodes', newLine: true);
$doc->ln(3);
$doc->setFont('helvetica', '', 10);
$doc->cell(0, 6, 'QR Code (URL):', newLine: true);
$doc->write2DBarcode('https://nextpdf.dev', Barcode2DType::QRCode, x: 15, y: null, w: 40, h: 40);
$doc->ln(48);
$doc->cell(0, 6, 'DataMatrix:', newLine: true);
$doc->write2DBarcode('NextPDF-DM-2026', Barcode2DType::DataMatrix, x: 15, y: null, w: 30, h: 30);
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT');
$doc->save($out !== false ? $out : __DIR__ . '/barcodes.pdf');
echo "Wrote barcodes PDF (Code 128, EAN-13, QR Code, DataMatrix)\n";

Verwachte uitvoer:

Wrote barcodes PDF (Code 128, EAN-13, QR Code, DataMatrix)
  • De geldigheid van de payload is symbologiespecifiek. EAN13 verwacht 12 of 13 cijfers. Een ongeldige payload veroorzaakt een fout voordat NextPDF inhoud schrijft. UPCA, ISBN en ISSN hebben hun eigen lengte- en controlecijferregels.
  • x/y zijn optioneel. Als u ze weglaat, wordt de barcode op de huidige cursorpositie geplaatst. Geef expliciete coördinaten op voor een voorspelbare lay-out.
  • w = 0 past de grootte automatisch aan. Bij een breedte van nul kiest de encoder een natuurlijke modulebreedte. Geef een positieve breedte op om binnen een vast vak te passen.
  • 2D-foutcorrectieniveau. write2DBarcode() gebruikt standaard ecLevel: 'L', het laagste niveau. Verhoog het ('M', 'Q', 'H') voor QR Codes die bestand moeten zijn tegen printbeschadiging. Hogere niveaus vergroten de matrix.
  • GS1-toepassingsidentificatoren. Geef gs1: true door aan write2DBarcode(), of gebruik BarcodeType::GS1_128, voor GS1-gestructureerde gegevens met de FNC1-prefix.
  • Een pagina wordt impliciet aangemaakt. Als u een barcodemethode aanroept vóór addPage(), voegt NextPDF eerst een pagina toe. Dat is handig, maar roep addPage() expliciet aan wanneer de paginageometrie van belang is.

Coderen is O(payload-lengte) voor 1D en O(matrixoppervlak) voor 2D, en beide verlopen op microsecondeschaal. Elke module is één re … f-padoperator, dus een dichte QR Code voegt een paar kilobytes aan de content stream toe. Er is geen rasterisatiestap, dus het geheugengebruik blijft constant ongeacht de symboolgrootte. Het recept blijft ruim binnen het budget van 1500 ms / 64 MB.

Een barcode bevat de payload die u doorgeeft, dus behandel de barcodewaarde aan de verwerkende kant als elke andere niet-vertrouwde invoer. De bibliotheek ondertekent of authenticeert de payload niet. Een 2D-symbool is geen encryptie: iedereen met een scanner kan het lezen.

VerklaringSpecificatieClausulereference_id
Barcodemodules worden getekend met de rechthoekoperator voor padconstructie.ISO 32000-2§8.5
Symbooltekens van Code 128 gebruiken de gedefinieerde bar/space-elementstructuur.ISO/IEC 15417§4.3.1
Data Matrix-symbolen gebruiken Reed-Solomon-foutcorrectie.ISO/IEC 16022§7.6.1
QR Code-gegevens worden opgesplitst in foutcorrectieblokken.ISO/IEC 18004§7.5.2

NextPDF implementeert de aangehaalde symbologiecoderingen, maar claimt geen formele certificering volgens de barcodestandaarden. De corpusdocumenten over barcodesymbologie zijn licentietechnisch beperkt tot Tier C. Citaten gebruiken uitsluitend clause-id- en reference_id-verwijzingen, en er wordt geen standaardtekst gereproduceerd.