aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmulator0002020-09-26 23:05:46 +0200
committerEmulator0002020-09-26 23:05:46 +0200
commit7fb301df6d21b403c5e39e2d9d8685fd7fc7988f (patch)
tree7e1d4f5b8cb2ba0f566b8cac3c52ae328444cdf0
parent96f39fea9921292d5aa67f478bd3d8e947f127be (diff)
downloadpdf_form-7fb301df6d21b403c5e39e2d9d8685fd7fc7988f.tar.bz2
Fixed bad font parsing in case of other formats
-rw-r--r--Cargo.toml2
-rw-r--r--src/lib.rs53
-rw-r--r--src/utils.rs55
3 files changed, 80 insertions, 30 deletions
diff --git a/Cargo.toml b/Cargo.toml
index c1396d8..2898adc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"]
diff --git a/src/lib.rs b/src/lib.rs
index e6200c1..7ead2c4 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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),
+ }
+}