Skip to content

Commit

Permalink
Add page label object
Browse files Browse the repository at this point in the history
  • Loading branch information
LaurenzV committed Aug 18, 2024
1 parent f339688 commit 75a4f01
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 6 deletions.
68 changes: 66 additions & 2 deletions src/object/page.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use crate::serialize::{Object, RegisterableObject, SerializerContext};
use crate::stream::Stream;
use crate::util::RectExt;
use pdf_writer::{Chunk, Finish, Ref};
use pdf_writer::types::NumberingStyle;
use pdf_writer::{Chunk, Finish, Ref, TextStr};
use std::num::{NonZeroI32, NonZeroU32};
use tiny_skia_path::{Rect, Size};

/// A page.
Expand Down Expand Up @@ -57,14 +59,61 @@ impl Object for Page {

impl RegisterableObject for Page {}

// TODO: Make sure that page 0 is always included.

/// A page label.
#[derive(Debug, Hash, Eq, PartialEq)]
pub(crate) struct PageLabel {
/// The numbering style of the page label.
style: NumberingStyle,
/// The prefix of the page label.
prefix: Option<String>,
/// The start numeric value of the page label.
offset: NonZeroI32,
}

impl PageLabel {
pub fn new(style: NumberingStyle, prefix: Option<String>, offset: NonZeroI32) -> Self {
Self {
style,
prefix,
offset,
}
}
}

impl Object for PageLabel {
fn serialize_into(self, _: &mut SerializerContext, root_ref: Ref) -> Chunk {
let mut chunk = Chunk::new();
let mut label = chunk
.indirect(root_ref)
.start::<pdf_writer::writers::PageLabel>();
label.style(self.style);

if let Some(prefix) = &self.prefix {
label.prefix(TextStr(prefix));
}

label.offset(self.offset.get());

label.finish();

chunk
}
}

impl RegisterableObject for PageLabel {}

#[cfg(test)]
mod tests {
use crate::object::page::Page;
use crate::object::page::{Page, PageLabel};
use crate::rgb::Rgb;
use crate::serialize::{SerializeSettings, SerializerContext};
use crate::surface::StreamBuilder;
use crate::test_utils::check_snapshot;
use crate::Fill;
use pdf_writer::types::NumberingStyle;
use std::num::NonZeroI32;
use tiny_skia_path::{PathBuilder, Rect, Size};

#[test]
Expand Down Expand Up @@ -113,4 +162,19 @@ mod tests {

check_snapshot("page/page_with_resources", sc.finish().as_bytes());
}

#[test]
fn page_label() {
let mut sc = SerializerContext::new(SerializeSettings::default_test());

let page_label = PageLabel::new(
NumberingStyle::Arabic,
Some("P".to_string()),
NonZeroI32::new(2).unwrap(),
);

sc.add(page_label);

check_snapshot("page/page_label", sc.finish().as_bytes());
}
}
43 changes: 39 additions & 4 deletions src/resource.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ use crate::object::ext_g_state::ExtGState;
use crate::object::image::Image;
use crate::object::shading_function::ShadingFunction;
use crate::object::shading_pattern::ShadingPattern;
use crate::object::tiling_pattern::TilingPattern;
use crate::object::xobject::XObject;
use crate::serialize::{hash_item, Object, RegisterableObject, SerializerContext};
use crate::util::NameExt;
use pdf_writer::traits::ResourcesExt;
use pdf_writer::writers::Resources;
use pdf_writer::{Chunk, Dict, Finish, Ref};
use std::collections::HashMap;
use std::fmt::Debug;
Expand Down Expand Up @@ -108,7 +105,7 @@ impl RegisterableObject for XObjectResource {}
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
pub enum PatternResource {
ShadingPattern(ShadingPattern),
TilingPattern(TilingPattern),
TilingPattern(crate::object::tiling_pattern::TilingPattern),
}

impl ResourceTrait for PatternResource {
Expand Down Expand Up @@ -404,3 +401,41 @@ impl ResourceTrait for FontResource {
"f"
}
}

use pdf_writer::writers::{FormXObject, Page, Pages, Resources, TilingPattern, Type3Font};

/// A trait for getting the resource dictionary of an object.
pub trait ResourcesExt {
/// Return the resources dictionary of the object.
fn resources(&mut self) -> Resources<'_>;
}

impl ResourcesExt for FormXObject<'_> {
fn resources(&mut self) -> Resources<'_> {
self.resources()
}
}

impl ResourcesExt for TilingPattern<'_> {
fn resources(&mut self) -> Resources<'_> {
self.resources()
}
}

impl ResourcesExt for Type3Font<'_> {
fn resources(&mut self) -> Resources<'_> {
self.resources()
}
}

impl ResourcesExt for Pages<'_> {
fn resources(&mut self) -> Resources<'_> {
self.resources()
}
}

impl ResourcesExt for Page<'_> {
fn resources(&mut self) -> Resources<'_> {
self.resources()
}
}
2 changes: 2 additions & 0 deletions src/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -416,3 +416,5 @@ fn hex_encode(data: &[u8]) -> Vec<u8> {
.collect::<String>()
.into_bytes()
}

pub struct PageLabel {}
12 changes: 12 additions & 0 deletions tests/snapshots/page/page_label.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
%PDF-1.7
%AAAA

3 0 obj
<<
/Type /PageLabel
/S /D
/P (P)
/St 2
>>
endobj

0 comments on commit 75a4f01

Please sign in to comment.