QRコードとバーコード
QRコードや1次元バーコードを、PDFドキュメントとして直接、あるいは単独のPNG/SVG画像として生成したり、既存PDFのページ上に配置したりできます。バーコード生成はコアライブラリを軽量に保つため、フィーチャーフラグの背後に置かれています。
バインディングの対応状況。 バーコード関連のサーフェスは大きく分けて2つあります。
- ワンショットPDFコンストラクタ(
Pdf::from_qrcode/Pdf::from_barcode)と低レベルのBarcodeGenerator— Rust のみで公開。- バーコード画像ハンドルのファミリー(
generate_qr_code、generate_barcode、add_barcode_to_page)。C ABI のpdf_generate_qr_code/pdf_generate_barcode/pdf_add_barcode_to_page関数に支えられ、Swift、Go、C# で公開され、FFI 経由で C/C++ から直接呼び出すこともできます。- 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(())
}
PDFではなくバーコード画像(PNG/SVG)を生成するには?
エンコードされたグリフを画像として — 既存ドキュメントへの埋め込み、Webフロントエンドへの送信、ラベルへの印刷などのために — 取得したい場合は、画像ハンドルのファミリーか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 を使うと、生成したバーコード画像を DocumentEditor の(0始まりの)ページ上の指定位置・サイズに配置してから保存できます。これは Swift では DocumentEditor.addBarcodeToPage として慣用的に公開され、C ABI では pdf_add_barcode_to_page として直接公開されています。これが依存する画像ハンドルのファミリーは Go/C# のエディタクラスにはラップされていないため、ページ内配置には Swift を使うか(または C/C++ から C ABI を呼び出して)ください。
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コード
300pxのQRコードを含む単一ページのPDFを作成します。
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 |
1次元バーコード生成
Pdf::from_barcode(barcode_type, data) — デフォルトのバーコード
デフォルトサイズ(200x80)のバーコードを含む単一ページのPDFを作成します。
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 — 1次元の設定
| メソッド | デフォルト | 説明 |
|---|---|---|
.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) 列でシンボロジーを選択します。C# のBarcodeFormat列挙型は現在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 フィーチャーは、追加で2つの依存関係を取り込みます。
barcoders— 1次元バーコードのエンコードqrcode— QRコードのエンコード
フィーチャーフラグなしでは、すべてのバーコードメソッドはこのフィーチャーが必要であることを示すエラーを返します。
// Without the barcodes feature enabled:
let result = Pdf::from_qrcode("test");
// Returns Err("QR code generation requires the 'barcodes' feature")
FAQ
Q: ドキュメントに generate_qr と generate_code が出てきますが、これらが正しい名前ですか?
A: いいえ。正規の公開メソッド名は generate_qr_code と generate_barcode です(C ABI の pdf_generate_qr_code / pdf_generate_barcode に支えられています)。Rust 内部では、BarcodeGenerator 上の低レベルヘルパーが generate_qr と generate_1d ですが、これらは Rust 内部のヘルパーであり、クロスバインディングのサーフェスではありません。
Q: PythonやNodeからネイティブのバーコードを生成できますか?
A: Python は generate_qr_svg と generate_barcode_svg を公開しており、埋め込みやラスタライズが可能なSVG文字列を返します。PNGハンドルやページ内への配置には、Swift、Go、C# のバインディングを使うか、C ABI を直接呼び出してください。ネイティブのワンショットPDFコンストラクタ(from_qrcode / from_barcode)は Rust 専用です。
Q: 既存PDFの特定の位置にバーコードを配置するには?
A: 画像ハンドル(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 を呼び出します。
Q: 生成はどれくらい速いですか? A: pdf_oxide のライターは、ベンチマークコーパスで平均0.8ms・合格率100%でテキストを抽出する同じエンジンの上に構築されています。そのため、QRや1次元バーコードのエンコードとページの出力は、バッチ処理でも実質的に瞬時に行われます。
関連ページ
- PdfBuilder のフルエントAPI — バーコードPDFのページサイズとメタデータを設定
- 画像からの作成 — 複数コンテンツを含むPDFにバーコードPNGを埋め込む
- グラフィックス、パターン、シェーディング — カスタムラベルレイアウトのための低レベル描画
- 型と列挙型 —
BarcodeType列挙型の詳細