QR-коди та штрихкоди
Генеруйте QR-коди та одновимірні штрихкоди безпосередньо у вигляді PDF-документів, як окремі зображення PNG/SVG або розміщуйте їх на сторінках наявного PDF. Генерація штрихкодів схована за прапорцем функції, щоб основна бібліотека залишалася легкою.
Покриття в прив’язках. Існує два різні набори можливостей для штрихкодів:
- Однокрокові конструктори PDF (
Pdf::from_qrcode/Pdf::from_barcode) та низькорівневийBarcodeGenerator— доступні лише в Rust.- Сімейство дескрипторів зображень штрихкодів (
generate_qr_code,generate_barcode,add_barcode_to_page), що спирається на функції C ABIpdf_generate_qr_code/pdf_generate_barcode/pdf_add_barcode_to_page— доступне в Swift, Go та C#, і його можна викликати безпосередньо з C/C++ через FFI.- Генератори SVG (
generate_qr_svg/generate_barcode_svg) — доступні в Python та Rust.Кожен метод нижче позначено мовами, які його справді надають. Не припускайте, що метод існує у прив’язці, де він не показаний.
Потрібен прапорець функції: barcodes
# Cargo.toml
[dependencies]
pdf_oxide = { version = "0.3", features = ["barcodes"] }
Як згенерувати QR-код як PDF?
Найшвидший шлях у Rust — однокроковий конструктор Pdf::from_qrcode. pdf_oxide записує QR-код в односторінковий PDF, який можна одразу зберегти.
Rust:
use pdf_oxide::api::Pdf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// QR code (300px) -> single-page PDF
let pdf = Pdf::from_qrcode("https://example.com")?;
pdf.save("qrcode.pdf")?;
// 1D barcode -> single-page PDF
use pdf_oxide::writer::barcode::BarcodeType;
let pdf = Pdf::from_barcode(BarcodeType::Code128, "ABC-12345")?;
pdf.save("barcode.pdf")?;
Ok(())
}
Як згенерувати зображення штрихкоду (PNG/SVG) замість PDF?
Коли вам потрібен закодований гліф у вигляді зображення — щоб вбудувати його в наявний документ, передати на вебфронтенд або надрукувати на етикетці — використовуйте сімейство дескрипторів зображень або генератори SVG. Це канонічні імена методів: generate_qr_code та generate_barcode (старі імена generate_qr / generate_code не входять до публічного інтерфейсу).
Swift (BarcodeImage.generateQrCode, BarcodeImage.generateBarcode):
import PdfOxide
// QR code. errorCorrection: 0=L 1=M 2=Q 3=H. sizePx: module-grid pixel size.
let qr = try BarcodeImage.generateQrCode("https://example.com",
errorCorrection: 1, sizePx: 256)
let pngBytes = try qr.imagePng(sizePx: 256) // [UInt8]
let svg = try qr.svg(sizePx: 256) // String
qr.close()
// 1D barcode. format: 0=Code128 1=Code39 2=EAN13 3=EAN8 4=UPCA 5=ITF 6=Code93 7=Codabar.
let bc = try BarcodeImage.generateBarcode("5901234123457", format: 2, sizePx: 256)
let barcodePng = try bc.imagePng(sizePx: 256)
bc.close()
Go (GenerateQRCode, GenerateBarcode):
package main
import (
"os"
pdfoxide "github.com/yfedoseev/pdf_oxide/go"
)
func main() {
// QR code. errorCorrection: 0=Low 1=Medium 2=Quartile 3=High.
qr, err := pdfoxide.GenerateQRCode("https://example.com", 1, 256)
if err != nil {
panic(err)
}
defer qr.Close()
svg, _ := qr.SVGData()
_ = os.WriteFile("qr.svg", []byte(svg), 0o644)
// 1D barcode. format: 0=Code128 1=Code39 2=EAN13 3=EAN8 4=UPCA 5=ITF 6=Code93 7=Codabar.
bc, err := pdfoxide.GenerateBarcode("5901234123457", 2, 300)
if err != nil {
panic(err)
}
defer bc.Close()
png, _ := bc.PNGData()
_ = os.WriteFile("ean13.png", png, 0o644)
}
C# (Barcode.GenerateQrCode, Barcode.Generate):
using PdfOxide;
// QR code. errorCorrection: 0=L 1=M 2=Q 3=H. sizePx default 300.
using var qr = Barcode.GenerateQrCode("https://example.com", errorCorrection: 1, sizePx: 256);
byte[] qrPng = qr.ToPng(256);
string qrSvg = qr.ToSvg();
// 1D barcode. BarcodeFormat: Code128, Code39, Ean13, Ean8, UpcA, Itf.
using var bc = Barcode.Generate("5901234123457", BarcodeFormat.Ean13, sizePx: 300);
byte[] eanPng = bc.ToPng(300);
Python (generate_qr_svg, generate_barcode_svg — лише SVG):
import pdf_oxide
# QR code SVG. error_correction: 0=Low, 1=Medium, 2=Quartile, 3=High. size in px.
qr_svg = pdf_oxide.generate_qr_svg("https://example.com", 1, 256)
with open("qr.svg", "w") as f:
f.write(qr_svg)
# 1D barcode SVG. barcode_type: 0=Code128, 1=Code39, 2=EAN13, 3=EAN8,
# 4=UPCA, 5=ITF, 6=Code93, 7=Codabar.
ean_svg = pdf_oxide.generate_barcode_svg(2, "5901234123457")
with open("ean13.svg", "w") as f:
f.write(ean_svg)
Як додати штрихкод на сторінку наявного PDF?
Використовуйте add_barcode_to_page, щоб розмістити згенероване зображення штрихкоду на сторінці (з індексом від 0) об’єкта DocumentEditor у заданій позиції та заданого розміру, а потім зберегти. Це ідіоматично доступне в Swift як DocumentEditor.addBarcodeToPage і безпосередньо через C ABI як pdf_add_barcode_to_page. Сімейство дескрипторів зображень, від якого воно залежить, не обгорнуто в класах редактора Go/C#, тож для розміщення на місці використовуйте Swift (або викликайте C ABI з C/C++).
Swift (DocumentEditor.addBarcodeToPage):
import PdfOxide
let editor = try DocumentEditor.openFromBytes(try Data(contentsOf: inputURL).map { $0 })
// Generate the barcode image, then stamp it onto page 0 (PDF user-space points).
let qr = try BarcodeImage.generateQrCode("https://example.com/track/42", sizePx: 128)
try editor.addBarcodeToPage(0, qr, x: 36, y: 36, width: 96, height: 96)
let outBytes = try editor.saveToBytes()
qr.close()
editor.close()
C ABI (pdf_add_barcode_to_page):
#include "pdf_oxide.h"
int err = 0;
// Build a barcode handle (QR shown; use pdf_generate_barcode for 1D).
FfiBarcodeImage *qr = pdf_generate_qr_code("https://example.com/track/42",
/*error_correction=*/1,
/*size_px=*/128, &err);
// Place it on page 0 at (x, y) sized width x height (PDF user-space points).
pdf_add_barcode_to_page(editor, /*page_index=*/0, qr,
/*x=*/36.0f, /*y=*/36.0f,
/*width=*/96.0f, /*height=*/96.0f, &err);
pdf_barcode_free(qr);
Сигнатури методів
Однокрокові конструктори PDF — лише Rust
// QR code, 300px default size:
Pdf::from_qrcode(data: &str) -> Result<Pdf>
Pdf::from_qrcode_with_options(data: &str, options: &QrCodeOptions) -> Result<Pdf>
// 1D barcode, 200x80 default size:
Pdf::from_barcode(barcode_type: BarcodeType, data: &str) -> Result<Pdf>
Pdf::from_barcode_with_options(barcode_type: BarcodeType, data: &str,
options: &BarcodeOptions) -> Result<Pdf>
Сімейство дескрипторів зображень штрихкодів — Swift / Go / C# / C ABI
| Мова | Генератор QR | Генератор 1D | Розміщення на сторінці |
|---|---|---|---|
| Swift | BarcodeImage.generateQrCode(_ data:, errorCorrection: Int32 = 1, sizePx: Int32 = 256) |
BarcodeImage.generateBarcode(_ data:, format: Int32, sizePx: Int32 = 256) |
DocumentEditor.addBarcodeToPage(_ page:, _ barcode:, x:, y:, width:, height:) |
| Go | GenerateQRCode(data string, errorCorrection int, sizePx int) (*BarcodeImage, error) |
GenerateBarcode(data string, format int, sizePx int) (*BarcodeImage, error) |
— (не обгорнуто в редакторі) |
| C# | Barcode.GenerateQrCode(string data, int errorCorrection = 1, int sizePx = 300) |
Barcode.Generate(string data, BarcodeFormat format = Code128, int sizePx = 300) |
— (не обгорнуто в редакторі) |
| C ABI | pdf_generate_qr_code(const char *data, int32_t error_correction, int32_t size_px, int32_t *error_code) |
pdf_generate_barcode(const char *data, int32_t format, int32_t size_px, int32_t *error_code) |
pdf_add_barcode_to_page(DocumentEditor *doc, int32_t page_index, const FfiBarcodeImage *barcode, float x, float y, float width, float height, int32_t *error_code) |
Отримавши дескриптор штрихкоду, ви можете прочитати його корисне навантаження та відрендерити його:
| Операція | Swift | Go | C# | C ABI |
|---|---|---|---|---|
| Байти PNG | imagePng(sizePx:) |
PNGData() |
ToPng(sizePx) |
pdf_barcode_get_image_png |
| Рядок SVG | svg(sizePx:) |
SVGData() |
ToSvg() |
pdf_barcode_get_svg |
| Декодовані дані | data() |
SourceData() |
Data |
pdf_barcode_get_data |
| Код формату | format() |
— | Format |
pdf_barcode_get_format |
| Звільнення дескриптора | close() |
Close() |
Dispose() |
pdf_barcode_free |
Генератори SVG — Python / Rust
# Python free functions (require the barcodes feature in the wheel):
generate_qr_svg(data: str, error_correction: int, size: int) -> str
generate_barcode_svg(barcode_type: int, data: str) -> str
Rust: повний довідник з API
Генерація QR-кодів
Pdf::from_qrcode(data) — QR-код за замовчуванням
Створює односторінковий PDF з QR-кодом розміром 300px.
use pdf_oxide::api::Pdf;
let pdf = Pdf::from_qrcode("https://example.com")?;
pdf.save("qr.pdf")?;
Pdf::from_qrcode_with_options(data, options) — налаштовуваний QR-код
Повний контроль над розміром, корекцією помилок, кольорами та зоною тиші.
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
| Метод | За замовчуванням | Опис |
|---|---|---|
.size(px) |
200 | Розмір QR-коду в пікселях |
.error_correction(level) |
Medium |
Рівень корекції помилок |
.quiet_zone(modules) |
4 | Ширина рамки в модулях |
.foreground(r, g, b, a) |
Black (0,0,0,255) | Колір модулів (RGBA) |
.background(r, g, b, a) |
White (255,255,255,255) | Колір тла (RGBA) |
Перелік QrErrorCorrection
| Варіант | Здатність до відновлення | Сценарій використання | Ціле число (FFI) |
|---|---|---|---|
Low |
~7 % | Максимальна щільність даних | 0 |
Medium |
~15 % | Загального призначення (за замовчуванням) | 1 |
Quartile |
~25 % | Етикетки, які можуть пошкодитися | 2 |
High |
~30 % | Промислове / суворе середовище | 3 |
Генерація одновимірних штрихкодів
Pdf::from_barcode(barcode_type, data) — штрихкод за замовчуванням
Створює односторінковий PDF зі штрихкодом, використовуючи розмір за замовчуванням (200x80).
use pdf_oxide::api::Pdf;
use pdf_oxide::writer::barcode::BarcodeType;
let pdf = Pdf::from_barcode(BarcodeType::Ean13, "5901234123457")?;
pdf.save("product.pdf")?;
Pdf::from_barcode_with_options(barcode_type, data, options) — налаштовуваний штрихкод
Повний контроль над розмірами та кольорами штрихкоду.
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
| Метод | За замовчуванням | Опис |
|---|---|---|
.width(px) |
200 | Ширина штрихкоду в пікселях |
.height(px) |
80 | Висота штрихкоду в пікселях |
.foreground(r, g, b, a) |
Black (0,0,0,255) | Колір смуг (RGBA) |
.background(r, g, b, a) |
White (255,255,255,255) | Колір тла (RGBA) |
.show_text(bool) |
false | Показувати людиночитаний текст |
Перелік BarcodeType
| Варіант | Назва | Формат даних | Ціле число (FFI) |
|---|---|---|---|
Code128 |
Code 128 | Буквено-цифровий (автовибір A/B/C) | 0 |
Code39 |
Code 39 | Великі літери та цифри + символи | 1 |
Ean13 |
EAN-13 | 13 цифр (European Article Number) | 2 |
Ean8 |
EAN-8 | 8 цифр (компактний EAN) | 3 |
UpcA |
UPC-A | 11–12 цифр (Universal Product Code) | 4 |
Itf |
Interleaved 2 of 5 | Пари цифр (парна кількість цифр) | 5 |
Code93 |
Code 93 | Буквено-цифровий (компактний) | 6 |
Codabar |
Codabar | Цифри + спеціальні символи (старт/стоп A-D) | 7 |
C ABI
pdf_generate_barcodeта обгортки Go/Swift/C# обирають символіку за стовпцем Ціле число (FFI) вище. ПерелікBarcodeFormatу C# наразі надаєCode128–Itf(0–5).
Низькорівневий BarcodeGenerator — лише Rust
Для генерації зображень штрихкодів без створення повноцінного PDF (наприклад, для вбудовування в наявний документ):
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 as an SVG string
let qr_svg = BarcodeGenerator::generate_qr_svg(
"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),
)?;
// Generate 1D barcode as an SVG string
let barcode_svg = BarcodeGenerator::generate_1d_svg(
BarcodeType::Code128,
"ABC123",
&BarcodeOptions::default(),
)?;
// Convenience methods
let code128_png = BarcodeGenerator::generate_code128("DATA", 200, 80)?;
let ean13_png = BarcodeGenerator::generate_ean13("5901234123457", 200, 80)?;
Використання PdfBuilder зі штрихкодами — лише Rust
PdfBuilder надає плавний інтерфейс для встановлення розміру сторінки та метаданих документа перед генерацією PDF зі штрихкодами.
use pdf_oxide::api::PdfBuilder;
use pdf_oxide::writer::PageSize;
use pdf_oxide::writer::barcode::BarcodeType;
// 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")?;
Розширені приклади
Транспортна етикетка з кількома штрихкодами (Rust)
use pdf_oxide::writer::barcode::{BarcodeGenerator, QrCodeOptions, QrErrorCorrection};
// Generate barcode images, then embed via the image APIs.
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),
)?;
// `tracking_barcode` and `qr_bytes` are PNG byte vectors ready to embed.
Пакетна генерація етикеток для товарів (Rust)
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(' ', "_")))?;
}
Пакетна генерація SVG штрихкодів (Python)
import pdf_oxide
items = [
(0, "SHIP-00001"), # Code128
(0, "SHIP-00002"), # Code128
(2, "5901234123457"), # EAN-13
(4, "012345678905"), # UPC-A
]
for barcode_type, data in items:
svg = pdf_oxide.generate_barcode_svg(barcode_type, data)
with open(f"barcode_{data}.svg", "w") as f:
f.write(svg)
Нанесення QR-кодів відстеження на кожну етикетку (Swift)
import PdfOxide
let editor = try DocumentEditor.openFromBytes(labelTemplateBytes)
let pageCount = try editor.pageCount()
for page in 0..<pageCount {
let qr = try BarcodeImage.generateQrCode("https://track.example.com/\(page)", sizePx: 128)
try editor.addBarcodeToPage(page, qr, x: 420, y: 700, width: 80, height: 80)
qr.close()
}
let stamped = try editor.saveToBytes()
editor.close()
Прапорець функції
Функція barcodes підтягує дві додаткові залежності:
barcoders— кодування одновимірних штрихкодівqrcode— кодування QR-кодів
Без прапорця функції всі методи штрихкодів повертають помилку, яка вказує, що функція є обов’язковою.
// Without the barcodes feature enabled:
let result = Pdf::from_qrcode("test");
// Returns Err("QR code generation requires the 'barcodes' feature")
Поширені запитання
З: У документації згадуються generate_qr та generate_code — це правильні імена?
В: Ні. Канонічні публічні імена методів — generate_qr_code та generate_barcode (спираються на C ABI pdf_generate_qr_code / pdf_generate_barcode). Усередині Rust низькорівневі допоміжні методи в BarcodeGenerator — це generate_qr та generate_1d; вони є внутрішніми помічниками Rust, а не міжприв’язковим інтерфейсом.
З: Чи можна генерувати нативні штрихкоди з Python або Node?
В: Python надає generate_qr_svg та generate_barcode_svg, які повертають рядки SVG, придатні для вбудовування або растеризації. Для дескрипторів PNG та розміщення на сторінці на місці використовуйте прив’язки Swift, Go чи C# або викликайте C ABI безпосередньо. Нативні однокрокові конструктори PDF (from_qrcode / from_barcode) доступні лише в Rust.
З: Як розмістити штрихкод у конкретній позиції наявного PDF?
В: Згенеруйте дескриптор зображення (generate_qr_code / generate_barcode), а потім викличте add_barcode_to_page(document, page_index, barcode, x, y, width, height). Координати та розмір задаються в точках користувацького простору PDF, а індекс сторінки починається з 0. У Swift це обгорнуто як DocumentEditor.addBarcodeToPage; з C/C++ викликайте pdf_add_barcode_to_page.
З: Наскільки швидка генерація? В: Записувач pdf_oxide побудовано на тому самому рушії, який видобуває текст із середнім часом 0,8 мс та 100% часткою успішних проходжень на бенчмарк-корпусі, тож кодування QR- чи одновимірного штрихкоду й виведення сторінки фактично миттєве для пакетних навантажень.
Пов’язані сторінки
- Плавний API PdfBuilder — налаштування розміру сторінки та метаданих для PDF зі штрихкодами
- Створення із зображень — вбудовування PNG штрихкодів у PDF із кількома видами вмісту
- Графіка, візерунки та градієнти — низькорівневе малювання для користувацьких макетів етикеток
- Типи та переліки — деталі переліку
BarcodeType