aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils.rs
diff options
context:
space:
mode:
authorJake Sandler2020-09-28 14:35:52 -0400
committerGitHub2020-09-28 14:35:52 -0400
commit3d42dcdc89ddf4b4982fecc64e5cd8eb94bb9026 (patch)
treed292a6f88820d48236b5551e566cba59c83be7d8 /src/utils.rs
parent2eff696d2dd769d04e4c95b9029c529c9e283c2d (diff)
parent6a1c7e10cbe5cddaeae59a2d70e9d7256d2a5267 (diff)
downloadpdf_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.rs78
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),
+ }
+}