| Crates.io | qr-label-generator |
| lib.rs | qr-label-generator |
| version | 0.1.0 |
| created_at | 2025-10-29 18:41:47.826617+00 |
| updated_at | 2025-10-29 18:41:47.826617+00 |
| description | Rust library to generate QR code images, with batch generation support from JSON and CSV files. Includes warehouse label generation with PDF output. |
| homepage | https://github.com/mioCry/QRLabel_Generator |
| repository | https://github.com/mioCry/QRLabel_Generator |
| max_upload_size | |
| id | 1907180 |
| size | 109,343 |
Rust library to generate QR code images, with simple APIs for single and batch generation from JSON files. Publishable on crates.io.
anyhowimage)In your Cargo.toml:
[dependencies]
qr-label-generator = "0.1"
use qr_label_generator::{Config, QrGenerator};
fn main() -> anyhow::Result<()> {
let cfg = Config::default();
let gen = QrGenerator::from_config(&cfg);
gen.generate_single("https://example.com", "website.png", 300)?;
Ok(())
}
Create a JSON file with QR code data:
[
{
"text": "https://example.com",
"filename": "website.png",
"size": 200
},
{
"text": "mailto:info@example.com",
"filename": "email.png",
"size": 150
},
{
"text": "tel:+1234567890",
"filename": "phone.png"
}
]
Then invoke in code:
use qr_label_generator::QrGenerator;
fn main() -> anyhow::Result<()> {
let gen = QrGenerator::new();
gen.generate_batch("qr_data.json", "output/")
}
The Config structure allows setting default size, error correction level (L/M/Q/H) and foreground/background colors.
QRLabel_Generator/
├── Cargo.toml # Project configuration and dependencies
├── README.md # This file
├── src/
│ ├── lib.rs # Library API
│ ├── qr.rs # QR generation logic
│ └── config.rs # Application configuration
└── examples/ # Example files
├── sample_data.json
└── simple.rs
qrcode: For QR code generationimage: For image manipulationanyhow: For error handlingserde: For JSON serialization/deserializationcargo run --example simple
See also examples/sample_data.json to use with QrGenerator::generate_batch.
Create the file examples.json:
[
{
"text": "https://github.com",
"filename": "github.png",
"size": 200
},
{
"text": "https://stackoverflow.com",
"filename": "stackoverflow.png",
"size": 200
}
]
Then use QrGenerator::generate_batch in your code.
cargo test
Generates QR codes for items, including code, description, warehouse and shelf position in the format S001-P001.
use qr_label_generator::{QrGenerator, WarehouseItem};
fn main() -> anyhow::Result<()> {
let item = WarehouseItem {
code: "ART-0001".to_string(),
description: "Phillips screwdriver".to_string(),
warehouse_location: "MAG-A".to_string(),
shelf: 1,
shelf_relative_position: 1,
};
let gen = QrGenerator::new();
gen.generate_from_warehouse_item(&item, "./output_test/warehouse_art1.png", 220)?;
Ok(())
}
cargo fmt
You can generate labels in batch by reading a JSON file with a list of WarehouseItem.
use qr_label_generator::QrGenerator;
fn main() -> anyhow::Result<()> {
let gen = QrGenerator::new();
gen.generate_warehouse_batch("./examples/warehouse_items.json", "./output_test", Some(220))
}
Example file: examples/warehouse_items.json.
CSV with headers text,filename,size:
text,filename,size
https://www.rust-lang.org,rust_website.png,220
tel:+1234567890,phone_number.png,200
Code:
use qr_label_generator::QrGenerator;
fn main() -> anyhow::Result<()> {
let gen = QrGenerator::new();
gen.generate_batch_from_csv("./examples/qr_layout.csv", "./output_test")
}
CSV with headers code,description,warehouse_location,shelf,shelf_relative_position,size.
use qr_label_generator::QrGenerator;
fn main() -> anyhow::Result<()> {
let gen = QrGenerator::new();
gen.generate_warehouse_batch_from_csv("./examples/warehouse_items.csv", "./output_test", Some(220))
}
Generates warehouse item labels in A4 format ready for printing. Each label includes:
use qr_label_generator::PdfLabelGenerator;
fn main() -> anyhow::Result<()> {
let generator = PdfLabelGenerator::new();
// From CSV file
generator.generate_pdf_from_csv(
"examples/warehouse_items.csv",
"warehouse_labels.html"
)?;
// From JSON file
generator.generate_pdf_from_json(
"examples/warehouse_items.json",
"warehouse_labels.html"
)?;
Ok(())
}
use qr_label_generator::{PdfLabelGenerator, LabelLayout, QrContentMode};
fn main() -> anyhow::Result<()> {
// Compact layout: 4x10 = 40 labels per page
let compact_layout = LabelLayout {
labels_per_row: 4,
rows_per_page: 10,
qr_size_mm: 25.0,
qr_content_mode: QrContentMode::CodeOnly,
qr_error_correction: qrcode::EcLevel::L,
};
let generator = PdfLabelGenerator::with_layout(compact_layout);
generator.generate_pdf_from_csv(
"examples/warehouse_items.csv",
"warehouse_labels_compact.pdf"
)?;
Ok(())
}
Choose the optimal density level for your QR codes:
let layout = LabelLayout {
labels_per_row: 3,
rows_per_page: 4,
qr_size_mm: 40.0,
qr_content_mode: QrContentMode::CodeOnly, // Item code only
qr_error_correction: qrcode::EcLevel::L, // Low correction = simpler QR
};
ART-0001)let layout = LabelLayout {
labels_per_row: 3,
rows_per_page: 4,
qr_size_mm: 40.0,
qr_content_mode: QrContentMode::CodeAndLocation, // Code + location
qr_error_correction: qrcode::EcLevel::M, // Medium correction
};
ART-0001|MAG-A|S001-P001let layout = LabelLayout {
labels_per_row: 3,
rows_per_page: 4,
qr_size_mm: 40.0,
qr_content_mode: QrContentMode::FullJson, // Complete JSON
qr_error_correction: qrcode::EcLevel::H, // High correction needed
};
📖 Complete guide: See QR_DENSITY_GUIDE.md for details and comparisons.
🧪 Demo: Try all modes with:
cargo run --release --example qr_density_demo
Generated files are print-ready HTML. To convert them to PDF:
With wkhtmltopdf:
wkhtmltopdf warehouse_labels.html warehouse_labels.pdf
With WeasyPrint:
weasyprint warehouse_labels.html warehouse_labels.pdf
With Chrome headless:
chrome --headless --print-to-pdf=warehouse_labels.pdf warehouse_labels.html
code,description,warehouse_location,shelf,shelf_relative_position,size
ART-0001,Phillips screwdriver,MAG-A,1,1,220
ART-0002,Hammer 500g,MAG-A,2,8,200
ART-0003,Adjustable wrench,MAG-A,3,5,210
See examples/warehouse_pdf.rs for a complete example with multiple layouts.
cargo run --example warehouse_pdf
cargo clippy
Dual license: MIT or Apache-2.0, at your choice.
LICENSE for MIT termsLICENSE-APACHE for Apache-2.0 termsContributions are welcome! Please:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)