Skip to content

Commit 37cefd2

Browse files
committed
Add small test case
1 parent 6182c75 commit 37cefd2

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

src/document.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::serialize::{SerializeSettings, SerializerContext};
22
use crate::surface::PageBuilder;
33
use tiny_skia_path::Size;
4+
use crate::object::page::PageLabel;
45

56
pub struct Document {
67
serializer_context: SerializerContext,
@@ -21,6 +22,10 @@ impl Document {
2122
PageBuilder::new(&mut self.serializer_context, size)
2223
}
2324

25+
pub fn start_page_with(&mut self, size: Size, page_label: PageLabel) -> PageBuilder {
26+
PageBuilder::new_with(&mut self.serializer_context, size, page_label)
27+
}
28+
2429
pub fn finish(self) -> Vec<u8> {
2530
self.serializer_context.finish().finish()
2631
}

src/object/page.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ impl Object for Page {
6363

6464
impl RegisterableObject for Page {}
6565

66-
// TODO: Make sure that page 0 is always included.
67-
6866
/// A page label.
6967
#[derive(Debug, Hash, Eq, PartialEq, Default, Clone)]
7068
pub struct PageLabel {
@@ -80,12 +78,12 @@ impl PageLabel {
8078
pub fn new(
8179
style: Option<NumberingStyle>,
8280
prefix: Option<String>,
83-
offset: Option<NonZeroU32>,
81+
offset: NonZeroU32,
8482
) -> Self {
8583
Self {
8684
style,
8785
prefix,
88-
offset,
86+
offset: Some(offset),
8987
}
9088
}
9189

@@ -186,6 +184,7 @@ mod tests {
186184
use pdf_writer::types::NumberingStyle;
187185
use std::num::{NonZeroI32, NonZeroU32};
188186
use tiny_skia_path::{PathBuilder, Rect, Size};
187+
use crate::document::Document;
189188

190189
#[test]
191190
fn simple_page() {
@@ -243,11 +242,40 @@ mod tests {
243242
let page_label = PageLabel::new(
244243
Some(NumberingStyle::Arabic),
245244
Some("P".to_string()),
246-
NonZeroU32::new(2),
245+
NonZeroU32::new(2).unwrap(),
247246
);
248247

249248
sc.add(page_label);
250249

251250
check_snapshot("page/page_label", sc.finish().as_bytes());
252251
}
252+
253+
// TODO: Fix issues with not being able to create empty pages with just start_page_with.
254+
// TODO: Fix issue with two duplicate pages not showing up.
255+
256+
#[test]
257+
fn page_label_complex() {
258+
let mut db = Document::new(SerializeSettings::default_test());
259+
let mut page = db.start_page_with(Size::from_wh(200.0, 200.0).unwrap(), PageLabel::default());
260+
let mut surface = page.surface();
261+
surface.finish();
262+
page.finish();
263+
264+
let mut page = db.start_page_with(Size::from_wh(250.0, 200.0).unwrap(), PageLabel::default());
265+
let mut surface = page.surface();
266+
surface.finish();
267+
page.finish();
268+
269+
let mut page = db.start_page_with(Size::from_wh(200.0, 200.0).unwrap(), PageLabel::new(
270+
Some(NumberingStyle::LowerRoman),
271+
None,
272+
NonZeroU32::new(2).unwrap()
273+
));
274+
let mut surface = page.surface();
275+
surface.finish();
276+
page.finish();
277+
278+
279+
check_snapshot("page/page_label_complex", &db.finish());
280+
}
253281
}

src/serialize.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::resource::{ColorSpaceEnum, FontResource};
99
use crate::stream::PdfFont;
1010
use crate::util::NameExt;
1111
use fontdb::{Database, ID};
12-
use pdf_writer::{Chunk, Filter, Finish, Pdf, Ref};
12+
use pdf_writer::{Chunk, Filter, Finish, Name, Pdf, Ref};
1313
use siphasher::sip128::{Hasher128, SipHasher13};
1414
use skrifa::instance::Location;
1515
use std::borrow::Cow;
@@ -80,6 +80,7 @@ pub struct SerializerContext {
8080
font_map: HashMap<Font, FontContainer>,
8181
catalog_ref: Ref,
8282
page_tree_ref: Ref,
83+
page_labels_ref: Option<Ref>,
8384
page_refs: Vec<Ref>,
8485
page_labels: Vec<PageLabel>,
8586
cached_mappings: HashMap<u128, Ref>,
@@ -115,6 +116,7 @@ impl SerializerContext {
115116
chunks: Vec::new(),
116117
page_tree_ref,
117118
catalog_ref,
119+
page_labels_ref: None,
118120
page_refs: vec![],
119121
page_labels: vec![],
120122
chunks_len: 0,
@@ -277,7 +279,7 @@ impl SerializerContext {
277279
// Always needs to be called.
278280
pub fn finish(mut self) -> Pdf {
279281
if let Some(container) = PageLabelContainer::new(self.page_labels.clone()) {
280-
self.add(container);
282+
self.page_labels_ref = Some(self.add(container));
281283
}
282284

283285
// Write fonts
@@ -317,6 +319,11 @@ impl SerializerContext {
317319

318320
let mut catalog = pdf.catalog(self.catalog_ref);
319321
catalog.pages(self.page_tree_ref);
322+
323+
if let Some(plr) = self.page_labels_ref {
324+
catalog.pair(Name(b"PageLabels"), plr);
325+
}
326+
320327
catalog.finish();
321328

322329
pdf.extend(&page_tree_chunk);

0 commit comments

Comments
 (0)