diff options
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/lib.rs | 53 | ||||
| -rw-r--r-- | src/utils.rs | 55 | 
3 files changed, 80 insertions, 30 deletions
| @@ -1,6 +1,6 @@  [package]  name = "pdf_form" -version = "0.3.0" +version = "0.4.0"  authors = ["Jake <jsandler18@gmail.com>", "Malte <voos.malte@gmail.com>", "Emulator000 <emulator@hotmail.it>"]  readme = "README.md"  keywords = ["pdf", "form"] @@ -515,41 +515,36 @@ impl Form {              Operation::new("BT", vec![]),          ]); -        // The default font object (/Helv 12 Tf 0 g) -        let default_font = ("Helv", 12, 0, "g"); - -        // Build the font basing on the default appearance, if exists, if not, -        // assume a default font (surely to be improved!) -        let font = match da { -            Object::String(ref bytes, _) => { -                let values = from_utf8(bytes)? -                    .trim_start_matches('/') -                    .split(' ') -                    .collect::<Vec<_>>(); - -                if values.len() != 5 { -                    default_font -                } else { -                    ( -                        values[0], -                        values[1].parse::<i32>().unwrap_or(0), -                        values[3].parse::<i32>().unwrap_or(0), -                        values[4], -                    ) -                } -            } -            _ => default_font, -        }; +        let font = parse_font(match da { +            Object::String(ref bytes, _) => Some(from_utf8(bytes)?), +            _ => None, +        });          // Define some helping font variables -        let font_name = font.0; -        let font_size = font.1; -        let font_color = (font.2, font.3); +        let font_name = (font.0).0; +        let font_size = (font.0).1; +        let font_color = font.1;          // Set the font type and size and color          content.operations.append(&mut vec![              Operation::new("Tf", vec![font_name.into(), font_size.into()]), -            Operation::new(font_color.1, vec![font_color.0.into()]), +            Operation::new( +                font_color.0, +                match font_color.0 { +                    "k" => vec![ +                        font_color.1.into(), +                        font_color.2.into(), +                        font_color.3.into(), +                        font_color.4.into(), +                    ], +                    "rg" => vec![ +                        font_color.1.into(), +                        font_color.2.into(), +                        font_color.3.into(), +                    ], +                    _ => vec![font_color.1.into()], +                }, +            ),          ]);          // Calcolate the text offset diff --git a/src/utils.rs b/src/utils.rs index 12db115..0aa342a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -70,3 +70,58 @@ pub fn get_on_value(field: &Dictionary) -> String {      option.unwrap_or("Yes".into())  } + +pub fn parse_font(font_string: Option<&str>) -> ((&str, i32), (&str, i32, i32, i32, i32)) { +    // The default font object (/Helv 12 Tf 0 g) +    let default_font = ("Helv", 12); +    let default_color = ("g", 0, 0, 0, 0); + +    // Build the font basing on the default appearance, if exists, if not, +    // assume a default font (surely to be improved!) +    match font_string { +        Some(font_string) => { +            let font = font_string +                .trim_start_matches('/') +                .split("Tf") +                .collect::<Vec<_>>(); + +            if font.len() < 2 { +                (default_font, default_color) +            } else { +                let font_family = font[0].trim().split(' ').collect::<Vec<_>>(); +                let font_color = font[1].trim().split(' ').collect::<Vec<_>>(); + +                let font = if font_family.len() >= 2 { +                    (font_family[0], font_family[1].parse::<i32>().unwrap_or(0)) +                } else { +                    default_font +                }; + +                let color = if font_color.len() == 2 { +                    ("g", font_color[0].parse::<i32>().unwrap_or(0), 0, 0, 0) +                } else if font_color.len() == 4 { +                    ( +                        "rg", +                        font_color[0].parse::<i32>().unwrap_or(0), +                        font_color[1].parse::<i32>().unwrap_or(0), +                        font_color[2].parse::<i32>().unwrap_or(0), +                        0, +                    ) +                } else if font_color.len() == 5 { +                    ( +                        "k", +                        font_color[0].parse::<i32>().unwrap_or(0), +                        font_color[1].parse::<i32>().unwrap_or(0), +                        font_color[2].parse::<i32>().unwrap_or(0), +                        font_color[3].parse::<i32>().unwrap_or(0), +                    ) +                } else { +                    default_color +                }; + +                (font, color) +            } +        } +        _ => (default_font, default_color), +    } +} | 
