diff options
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/main.rs | 41 | 
3 files changed, 38 insertions, 11 deletions
| @@ -7,6 +7,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"  [[package]] +name = "anyhow" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" + +[[package]]  name = "autocfg"  version = "1.0.1"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -245,6 +251,7 @@ dependencies = [  name = "pdf-form-replace-font"  version = "0.0.1"  dependencies = [ + "anyhow",   "getopts",   "lopdf",  ] @@ -4,5 +4,6 @@ version = "0.0.1"  edition = "2018"  [dependencies] +anyhow = "1.0.40"  getopts = "0.2.21"  lopdf = "0.26.0" diff --git a/src/main.rs b/src/main.rs index 7c1e077..492707f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,20 @@ +use anyhow::{self, Context};  use getopts::Options;  use lopdf::{Document, Object};  use std::env; -fn main() -> Result<(), Box<dyn std::error::Error>> { +fn main() { +    match run() { +        Ok(_) => (), +        Err(e) => { +            eprintln!("error: {}", e); +        }, +    }; +} + +fn run () -> Result<(), anyhow::Error> {      let args: Vec<String> = env::args().collect();      let mut opts = Options::new(); @@ -23,27 +33,34 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {          &opt_matches.free[0]      }; -    let find = opt_matches.opt_str("find").unwrap(); -    let replace = opt_matches.opt_str("replace").unwrap(); -    let output_pdf = opt_matches.opt_str("output").unwrap_or("-".to_owned()); +    let find = opt_matches.opt_str("find") +        .ok_or(anyhow::anyhow!("no original font"))?; +    let replace = opt_matches.opt_str("replace") +        .ok_or(anyhow::anyhow!("no replacement font"))?; +    let output_pdf = opt_matches.opt_str("output") +        .unwrap_or("-".to_owned());      let mut doc = if input_pdf == "=" { -        Document::load_from(&mut std::io::stdin()).unwrap() +        Document::load_from(&mut std::io::stdin()) +            .context("failed reading from stdin")?      } else { -        Document::load(input_pdf).unwrap() +        Document::load(input_pdf) +            .with_context(|| format!("failed to read PDF '{}'", input_pdf))?      };      for (_, mut obj) in &mut doc.objects {          match &mut obj {              Object::Dictionary(ref mut d) => {                  for (k, v) in d.iter_mut() { -                    let key = std::str::from_utf8(k).unwrap(); +                    let key = std::str::from_utf8(k) +                        .context("unable to convert PDF object key to UTF-8")?;                      if key == "DA" { -                        let properties = v.as_str_mut().unwrap(); +                        let properties = v.as_str_mut() +                            .context("unable to get properties of form field")?;                          let new_properties = std::str::from_utf8(properties) -                            .unwrap() +                            .context("unable to convert form field properties to UTF-8")?                              .replace(&find, &replace);                          *properties = new_properties.into_bytes(); @@ -55,9 +72,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {      }      if output_pdf == "-" { -        doc.save_to(&mut std::io::stdout()).unwrap(); +        doc.save_to(&mut std::io::stdout()) +            .context("failed writing to stdout")?;      } else { -        doc.save(output_pdf).unwrap(); +        doc.save(&output_pdf) +            .with_context(|| format!("failed to write PDF '{}'", output_pdf))?;      }      Ok(()) | 
