Skip to content

Commit

Permalink
First deserialization + SVG fix
Browse files Browse the repository at this point in the history
  • Loading branch information
fschutt committed Feb 21, 2025
1 parent 3569a5e commit f3a409f
Show file tree
Hide file tree
Showing 12 changed files with 1,138 additions and 426 deletions.
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ lopdf = { git = "https://github.com/J-F-Liu/lopdf", rev = "80a6c505bf8303c74b305
] }
time = { version = "0.3.25", default-features = false, features = ["std"] }
allsorts = { version = "0.15", git = "https://github.com/fschutt/allsorts", branch = "optional-brotli", default-features = false, features = ["flate2_rust"] }
pdf-writer = { version = "0.12.0" }
image = { version = "0.25", default-features = false }
svg2pdf = { version = "0.12.0" }
# dependencies for wasm demo
Expand Down
159 changes: 5 additions & 154 deletions examples/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,165 +6,16 @@ static SVG: &str = include_str!("./assets/svg/tiger.svg");
fn main() {
let mut doc = PdfDocument::new("My first document");

// shape 1 (line)
let line1 = Line {
points: vec![
(Point::new(Mm(100.0), Mm(100.0)), false),
(Point::new(Mm(100.0), Mm(200.0)), false),
(Point::new(Mm(300.0), Mm(200.0)), false),
(Point::new(Mm(300.0), Mm(100.0)), false),
],
is_closed: true,
};
let outline_color = Color::Rgb(Rgb::new(0.75, 1.0, 0.64, None));

let mut ops = vec![
Op::SetOutlineColor { col: outline_color },
Op::SetOutlineThickness { pt: Pt(10.0) },
Op::DrawLine { line: line1 },
];

// shape 2 (polygon)
let line2 = Polygon {
rings: vec![vec![
(Point::new(Mm(150.0), Mm(150.0)), false),
(Point::new(Mm(150.0), Mm(250.0)), false),
(Point::new(Mm(350.0), Mm(250.0)), false),
]],
mode: PaintMode::FillStroke,
winding_order: WindingOrder::NonZero,
};

let fill_color_2 = Color::Cmyk(Cmyk::new(0.0, 0.0, 0.0, 0.0, None));
let outline_color_2 = Color::Greyscale(Greyscale::new(0.45, None));
let dash_pattern = LineDashPattern {
dash_1: Some(20),
..Default::default()
};

let extgstate = ExtendedGraphicsStateBuilder::new()
.with_overprint_stroke(true)
.with_blend_mode(BlendMode::multiply())
.build();

ops.extend_from_slice(&[
Op::SaveGraphicsState,
Op::LoadGraphicsState {
gs: doc.add_graphics_state(extgstate),
},
Op::SetLineDashPattern { dash: dash_pattern },
Op::SetLineJoinStyle {
join: LineJoinStyle::Round,
},
Op::SetLineCapStyle {
cap: LineCapStyle::Round,
},
Op::SetFillColor { col: fill_color_2 },
Op::SetOutlineThickness { pt: Pt(15.0) },
Op::SetOutlineColor {
col: outline_color_2,
},
Op::DrawPolygon { polygon: line2 },
Op::RestoreGraphicsState,
]);

// font loading
let font = ParsedFont::from_bytes(ROBOTO_TTF, 0).unwrap();
let font_id = doc.add_font(&font);

let fontsize = Pt(33.0);
let fontsize2 = Pt(18.0);
ops.extend_from_slice(&[
Op::StartTextSection,
Op::SetTextCursor {
pos: Point {
x: Mm(10.0).into(),
y: Mm(100.0).into(),
},
}, // from bottom left
Op::SetLineHeight { lh: fontsize },
Op::SetWordSpacing { percent: 300.0 },
Op::SetCharacterSpacing { multiplier: 10.0 },
Op::WriteText {
text: "Lorem ipsum".to_string(),
font: font_id.clone(),
size: fontsize,
},
Op::AddLineBreak,
Op::WriteText {
text: "dolor sit amet".to_string(),
font: font_id.clone(),
size: fontsize,
},
Op::AddLineBreak,
Op::SetTextRenderingMode {
mode: TextRenderingMode::FillStroke,
},
Op::SetCharacterSpacing { multiplier: 0.0 },
Op::SetTextMatrix {
matrix: TextMatrix::Rotate(10.0 /* degrees ccw */),
},
Op::WriteText {
text: "Lorem ipsum".to_string(),
font: font_id.clone(),
size: fontsize2,
},
Op::SetLineOffset { multiplier: 10.0 },
Op::SetTextRenderingMode {
mode: TextRenderingMode::Stroke,
},
Op::WriteText {
text: "dolor sit amet".to_string(),
font: font_id.clone(),
size: fontsize2,
},
Op::SetTextRenderingMode {
mode: TextRenderingMode::FillStroke,
},
Op::WriteTextBuiltinFont {
text: "dolor sit amet".to_string(),
size: Pt(45.0),
font: BuiltinFont::Courier,
},
Op::EndTextSection,
]);
let mut ops = vec![];

let svg = Svg::parse(SVG).unwrap();
let rotation_center_x = Px((svg.width.unwrap_or_default().0 as f32 / 2.0) as usize);
let rotation_center_y = Px((svg.height.unwrap_or_default().0 as f32 / 2.0) as usize);
let xobject_id = doc.add_xobject(&svg);

let svg_layer = doc.add_layer(&Layer::new("SVG content"));
ops.push(Op::BeginLayer {
layer_id: svg_layer.clone(),
});

for i in 0..10 {
let transform = XObjectTransform {
rotate: Some(XObjectRotation {
angle_ccw_degrees: i as f32 * 36.0,
rotation_center_x,
rotation_center_y,
}),
translate_x: Some(Mm(i as f32 * 20.0 % 50.0).into()),
translate_y: Some(Mm(i as f32 * 30.0).into()),
dpi: Some(300.0),
scale_x: None,
scale_y: None,
};

ops.extend_from_slice(&[Op::UseXObject {
id: xobject_id.clone(),
transform,
}]);
}

ops.push(Op::EndLayer {
layer_id: svg_layer.clone(),
});

let _bookmark_id = doc.add_bookmark("Chapter 1", /* page */ 0);

ops.extend_from_slice(&[Op::UseXObject {
id: xobject_id.clone(),
transform: XObjectTransform::default(),
}]);
// collect pages
let pages = vec![
PdfPage::new(Mm(210.0), Mm(297.0), ops.clone()),
Expand Down
Loading

0 comments on commit f3a409f

Please sign in to comment.