use easypdf::prelude::*;
use std::path::PathBuf;
#[derive(PdfModel)]
struct Invoice {
#[pdf(field = "customer_name")]
customer: String,
#[pdf(field = "invoice_number")]
invoice_number: String,
#[pdf(field = "amount")]
total: f64,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let out_dir = tempfile::tempdir()?;
let invoice = Invoice {
customer: "Acme Corp".to_string(),
invoice_number: "INV-2025-001".to_string(),
total: 1234.56,
};
let descriptors = invoice.field_descriptors();
println!("Invoice has {} form field(s):", descriptors.len());
for desc in &descriptors {
println!(
" field={:?} -> rust_field={:?} (order={}, required={})",
desc.field_name, desc.rust_field_name, desc.order, desc.required
);
}
let out_path: PathBuf = out_dir.path().join("invoice_output.pdf");
EasyPdf::create(&out_path)
.title("Invoice")
.add_text(format!("Customer: {}", invoice.customer))
.font(PdfFont::helvetica(14.0))
.position(72.0, 750.0)
.do_write()?;
let mut writer = EasyPdf::writer("Invoice Details").build()?;
writer.add_page(PageSize::A4, Orientation::Portrait)?;
let lines = [
format!("Customer: {}", invoice.customer),
format!("Invoice #: {}", invoice.invoice_number),
format!("Total: ${:.2}", invoice.total),
];
for (i, line) in lines.iter().enumerate() {
let y = 750.0 - f64::from(i as u32) * 30.0;
let text = PdfText::new(line).font(PdfFont::helvetica(14.0));
writer.write_text(&text, 72.0, y)?;
}
let detail_path = out_dir.path().join("invoice_detailed.pdf");
writer.finish(&detail_path)?;
println!("\nCreated invoice PDF at: {}", detail_path.display());
Ok(())
}