From 5ba4efa907c8b4d91afb6cc0cfd7c7bb07f78158 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 11 Apr 2021 14:37:33 +0200 Subject: Write a PDF with fields filled in from the TOML file Add a new `--fill` command line argument that instructs the program to fill in the form using the values in the TOML file. --- src/main.rs | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index a943a9f..0577197 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,19 @@ use derive_builder::Builder; use pdf_forms::{Form, FieldType}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; -use std::fs::OpenOptions; -use std::io::Write; +use std::env; +use std::fs::{File, OpenOptions}; +use std::io::{Read, Write}; +use std::path::Path; -#[derive(Debug, Default, Serialize)] +#[derive(Debug, Default, Deserialize, Serialize)] struct TextForm<'a> { + #[serde(borrow)] fields: Vec>, } -#[derive(Debug, Builder, Serialize)] +#[derive(Debug, Builder, Deserialize, Serialize)] struct Field<'a> { id: usize, @@ -22,8 +25,16 @@ struct Field<'a> { } fn main() { + let args: Vec = env::args().collect(); + let mut form = Form::load("./f1040.pdf").unwrap(); + if args.len() == 2 && args[1] == "--fill" { + fill("./f1040.toml", &mut form); + + return; + } + let mut data = TextForm::default(); for i in 0..form.len() { @@ -61,3 +72,21 @@ fn main() { form.save("./f1040-new.pdf").unwrap(); } + +fn fill>(data_path: P, form: &mut Form) { + let mut buf = Vec::new(); + let mut file = File::open(data_path).unwrap(); + file.read_to_end(&mut buf).unwrap(); + + let data: TextForm = toml::from_slice(&buf).unwrap(); + + for field in data.fields { + if let Some(value) = field.value { + form.set_text(field.id, value.to_owned()).unwrap(); + } else if let Some(state) = field.state { + form.set_check_box(field.id, state).unwrap(); + } + } + + form.save("./f1040-filled.pdf").unwrap(); +} -- cgit v1.2.3