Skip to content

QR Codes & Barcodes

Generate QR codes and 1D barcodes directly as PDF documents. Barcode generation is behind a feature flag to keep the core library lightweight.

Binding coverage. QR and 1D-barcode generation (Pdf::from_qrcode, Pdf::from_barcode) is currently exposed in Rust only. The other bindings can embed a pre-generated barcode image via Pdf::from_images / Pdf.FromMarkdown with an <img> reference — for native barcode rendering from Python, Node, Go, or C#, call the Rust CLI (pdf-oxide barcode …) or bridge over FFI.

Requires feature flag: barcodes

# Cargo.toml
[dependencies]
pdf_oxide = { version = "0.3", features = ["barcodes"] }

Quick Example

Python

from pdf_oxide import Pdf

# QR code
pdf = Pdf.from_qrcode("https://example.com")
pdf.save("qrcode.pdf")

# Barcode
pdf = Pdf.from_barcode("Code128", "ABC-12345")
pdf.save("barcode.pdf")

Rust

use pdf_oxide::api::Pdf;

// QR code
let pdf = Pdf::from_qrcode("https://example.com")?;
pdf.save("qrcode.pdf")?;

// Barcode
use pdf_oxide::writer::barcode::BarcodeType;
let pdf = Pdf::from_barcode(BarcodeType::Code128, "ABC-12345")?;
pdf.save("barcode.pdf")?;

Full API Reference

QR Code Generation

Pdf::from_qrcode(data) – Default QR Code

Creates a single-page PDF with a 300px QR code.

Rust:

use pdf_oxide::api::Pdf;

let pdf = Pdf::from_qrcode("https://example.com")?;
pdf.save("qr.pdf")?;

Python:

from pdf_oxide import Pdf

pdf = Pdf.from_qrcode("https://example.com")
pdf.save("qr.pdf")

Python Signature:

Pdf.from_qrcode(data: str) -> Pdf

Pdf::from_qrcode_with_options(data, options) – Custom QR Code

Full control over size, error correction, colors, and quiet zone.

Rust:

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::barcode::{QrCodeOptions, QrErrorCorrection};

let options = QrCodeOptions::new()
    .size(400)
    .error_correction(QrErrorCorrection::High)
    .quiet_zone(6)
    .foreground(0, 0, 128, 255)          // Navy blue
    .background(255, 255, 255, 255);     // White

let pdf = Pdf::from_qrcode_with_options("https://example.com", &options)?;
pdf.save("custom_qr.pdf")?;

QrCodeOptions – QR Configuration

Method Default Description
.size(px) 200 QR code size in pixels
.error_correction(level) Medium Error correction level
.quiet_zone(modules) 4 Border width in modules
.foreground(r, g, b, a) Black (0,0,0,255) Module color (RGBA)
.background(r, g, b, a) White (255,255,255,255) Background color (RGBA)

QrErrorCorrection Enum

Variant Recovery Capacity Use Case
Low ~7% Maximum data density
Medium ~15% General purpose (default)
Quartile ~25% Labels that may get damaged
High ~30% Industrial / harsh environments

1D Barcode Generation

Pdf::from_barcode(barcode_type, data) – Default Barcode

Creates a single-page PDF with a barcode using default size (200x80).

Rust:

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::barcode::BarcodeType;

let pdf = Pdf::from_barcode(BarcodeType::Ean13, "5901234123457")?;
pdf.save("product.pdf")?;

Python:

from pdf_oxide import Pdf

# Barcode type as string: "code128", "ean13", "upca", "code39", "ean8", "itf"
pdf = Pdf.from_barcode("ean13", "5901234123457")
pdf.save("product.pdf")

Python Signature:

Pdf.from_barcode(
    barcode_type: str,  # "code128" | "ean13" | "upca" | "code39" | "ean8" | "itf"
    data: str
) -> Pdf

Pdf::from_barcode_with_options(barcode_type, data, options) – Custom Barcode

Full control over barcode dimensions and colors.

Rust:

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::barcode::{BarcodeType, BarcodeOptions};

let options = BarcodeOptions::new()
    .width(400)
    .height(120)
    .foreground(0, 0, 0, 255)
    .background(255, 255, 255, 255);

let pdf = Pdf::from_barcode_with_options(
    BarcodeType::Code128,
    "SHIP-2025-00042",
    &options,
)?;
pdf.save("shipping_label.pdf")?;

BarcodeOptions – 1D Configuration

Method Default Description
.width(px) 200 Barcode width in pixels
.height(px) 80 Barcode height in pixels
.foreground(r, g, b, a) Black (0,0,0,255) Bar color (RGBA)
.background(r, g, b, a) White (255,255,255,255) Background color (RGBA)
.show_text(bool) false Show human-readable text

BarcodeType Enum

Variant Name Data Format
Code128 Code 128 Alphanumeric (auto-selects A/B/C)
Code39 Code 39 Uppercase alphanumeric + symbols
Ean13 EAN-13 13 digits (European Article Number)
Ean8 EAN-8 8 digits (compact EAN)
UpcA UPC-A 11-12 digits (Universal Product Code)
Itf Interleaved 2 of 5 Numeric pairs (even digit count)
Code93 Code 93 Alphanumeric (compact)
Codabar Codabar Digits + special chars (A-D start/stop)

Low-Level BarcodeGenerator

For generating barcode images without creating a full PDF (e.g., to embed in an existing document):

use pdf_oxide::writer::barcode::{BarcodeGenerator, BarcodeType, BarcodeOptions, QrCodeOptions};

// Generate QR code as PNG bytes
let qr_png = BarcodeGenerator::generate_qr(
    "https://example.com",
    &QrCodeOptions::default().size(256),
)?;

// Generate QR code with simple API
let qr_png = BarcodeGenerator::generate_qr_simple("https://example.com", 200)?;

// Generate 1D barcode as PNG bytes
let barcode_png = BarcodeGenerator::generate_1d(
    BarcodeType::Code128,
    "ABC123",
    &BarcodeOptions::default().width(300).height(100),
)?;

// Convenience methods
let code128_png = BarcodeGenerator::generate_code128("DATA", 200, 80)?;
let ean13_png = BarcodeGenerator::generate_ean13("5901234123457", 200, 80)?;

Using PdfBuilder with Barcodes

PdfBuilder provides a fluent interface for setting page size and document metadata before generating barcode PDFs.

use pdf_oxide::api::PdfBuilder;
use pdf_oxide::writer::PageSize;
use pdf_oxide::writer::barcode::{BarcodeType, QrCodeOptions, QrErrorCorrection};

// QR code with custom page size
let pdf = PdfBuilder::new()
    .title("WiFi Access")
    .page_size(PageSize::Custom(300.0, 300.0))
    .from_qrcode("WIFI:T:WPA;S:MyNetwork;P:secret123;;")?;
pdf.save("wifi_qr.pdf")?;

// Barcode with metadata
let pdf = PdfBuilder::new()
    .title("Product Label")
    .author("Warehouse System")
    .from_barcode(BarcodeType::Ean13, "5901234123457")?;
pdf.save("label.pdf")?;

Advanced Examples

Shipping Label with Multiple Barcodes

use pdf_oxide::writer::barcode::{BarcodeGenerator, BarcodeType, BarcodeOptions, QrCodeOptions};
use pdf_oxide::writer::{PdfWriter, PdfWriterConfig};
use pdf_oxide::geometry::Rect;

// Generate barcode images
let tracking_barcode = BarcodeGenerator::generate_code128(
    "1Z999AA10123456784",
    300,
    80,
)?;

let qr_bytes = BarcodeGenerator::generate_qr(
    "https://track.example.com/1Z999AA10123456784",
    &QrCodeOptions::new().size(200).error_correction(QrErrorCorrection::Medium),
)?;

// These PNG bytes can then be embedded in a PDF using the image APIs

Batch Generate Product Labels

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::barcode::BarcodeType;

let products = vec![
    ("5901234123457", "Widget A"),
    ("4006381333931", "Widget B"),
    ("0012345678905", "Widget C"),
];

for (ean, name) in products {
    let pdf = Pdf::from_barcode(BarcodeType::Ean13, ean)?;
    pdf.save(format!("label_{}.pdf", name.to_lowercase().replace(' ', "_")))?;
}

Python: Generate and Save QR Codes

from pdf_oxide import Pdf

urls = [
    "https://example.com/product/1",
    "https://example.com/product/2",
    "https://example.com/product/3",
]

for i, url in enumerate(urls):
    pdf = Pdf.from_qrcode(url)
    pdf.save(f"qr_product_{i + 1}.pdf")

Python: Batch Barcode Generation

from pdf_oxide import Pdf

items = [
    ("code128", "SHIP-00001"),
    ("code128", "SHIP-00002"),
    ("ean13", "5901234123457"),
    ("upca", "012345678905"),
]

for barcode_type, data in items:
    pdf = Pdf.from_barcode(barcode_type, data)
    pdf.save(f"barcode_{data}.pdf")

Feature Flag

The barcodes feature pulls in two additional dependencies:

  • barcoders – 1D barcode encoding
  • qrcode – QR code encoding

Without the feature flag, all barcode methods return an error message indicating the feature is required.

// Without the barcodes feature enabled:
let result = Pdf::from_qrcode("test");
// Returns Err("QR code generation requires the 'barcodes' feature")