diff options
| author | Jake Sandler | 2020-09-28 14:35:52 -0400 |
|---|---|---|
| committer | GitHub | 2020-09-28 14:35:52 -0400 |
| commit | 3d42dcdc89ddf4b4982fecc64e5cd8eb94bb9026 (patch) | |
| tree | d292a6f88820d48236b5551e566cba59c83be7d8 /src/utils.rs | |
| parent | 2eff696d2dd769d04e4c95b9029c529c9e283c2d (diff) | |
| parent | 6a1c7e10cbe5cddaeae59a2d70e9d7256d2a5267 (diff) | |
| download | pdf_form-3d42dcdc89ddf4b4982fecc64e5cd8eb94bb9026.tar.bz2 | |
Merge pull request #6 from Emulator000/fields-appearance
Fix for Textbox and Checkbox fields appearance issue when filled
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/utils.rs b/src/utils.rs index 7ff4e41..0aa342a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,7 @@ use lopdf::{Dictionary, Object}; +use crate::from_utf8; + bitflags! { pub struct FieldFlags: u32 { const READONLY = 0x1; @@ -47,3 +49,79 @@ pub fn get_field_flags(field: &Dictionary) -> u32 { .as_i64() .unwrap() as u32 } + +pub fn get_on_value(field: &Dictionary) -> String { + let mut option = None; + if let Ok(ap) = field.get(b"AP") { + if let Ok(dict) = ap.as_dict() { + if let Ok(values) = dict.get(b"N") { + if let Ok(options) = values.as_dict() { + for (name, _) in options { + if let Ok(name) = from_utf8(name) { + if name != "Off" && option.is_none() { + option = Some(name.into()); + } + } + } + } + } + } + } + + 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), + } +} |
