diff options
| author | Teddy Wing | 2021-04-11 14:37:33 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2021-04-11 14:37:33 +0200 | 
| commit | 5ba4efa907c8b4d91afb6cc0cfd7c7bb07f78158 (patch) | |
| tree | 06615e4c9c28599cef886fa3aabc0de5cd331dd8 /src | |
| parent | 6d1797446ef20aaf221ad49387e0967800cf9720 (diff) | |
| download | formurapid-5ba4efa907c8b4d91afb6cc0cfd7c7bb07f78158.tar.bz2 | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 39 | 
1 files changed, 34 insertions, 5 deletions
| 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<Field<'a>>,  } -#[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<String> = 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<P: AsRef<Path>>(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(); +} | 
