Skip to content

QRコードとバーコード

QRコードや1次元バーコードを、PDFドキュメントとして直接、あるいは単独のPNG/SVG画像として生成したり、既存PDFのページ上に配置したりできます。バーコード生成はコアライブラリを軽量に保つため、フィーチャーフラグの背後に置かれています。

バインディングの対応状況。 バーコード関連のサーフェスは大きく分けて2つあります。

  1. ワンショットPDFコンストラクタPdf::from_qrcode / Pdf::from_barcode)と低レベルの BarcodeGeneratorRust のみで公開。
  2. バーコード画像ハンドルのファミリーgenerate_qr_codegenerate_barcodeadd_barcode_to_page)。C ABI の pdf_generate_qr_code / pdf_generate_barcode / pdf_add_barcode_to_page 関数に支えられ、Swift、Go、C# で公開され、FFI 経由で C/C++ から直接呼び出すこともできます。
  3. SVGジェネレータgenerate_qr_svg / generate_barcode_svg)— PythonRust で公開。

以下の各メソッドには、実際にそれを公開している言語のラベルを付けています。表示されていないバインディングにそのメソッドが存在すると仮定しないでください。

必要なフィーチャーフラグ: 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_codegenerate_barcode です(古い generate_qr / generate_code という名前は公開サーフェスには含まれません)。

SwiftBarcodeImage.generateQrCodeBarcodeImage.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()

GoGenerateQRCodeGenerateBarcode):

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.GenerateQrCodeBarcode.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);

Pythongenerate_qr_svggenerate_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 を呼び出して)ください。

SwiftDocumentEditor.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 ABIpdf_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 列挙型は現在 Code128Itf(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_qrgenerate_code が出てきますが、これらが正しい名前ですか? A: いいえ。正規の公開メソッド名は generate_qr_codegenerate_barcode です(C ABI の pdf_generate_qr_code / pdf_generate_barcode に支えられています)。Rust 内部では、BarcodeGenerator 上の低レベルヘルパーが generate_qrgenerate_1d ですが、これらは Rust 内部のヘルパーであり、クロスバインディングのサーフェスではありません。

Q: PythonやNodeからネイティブのバーコードを生成できますか? A: Python は generate_qr_svggenerate_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次元バーコードのエンコードとページの出力は、バッチ処理でも実質的に瞬時に行われます。

関連ページ