From 0b9878ed318d23e96a853ef025ea6b036673c2a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Ara=C3=BAjo?= Date: Wed, 3 Apr 2024 05:39:47 -0300 Subject: [PATCH] Fix wrong PDF page labels (#3836) (#3837) --- crates/typst-pdf/src/page.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/crates/typst-pdf/src/page.rs b/crates/typst-pdf/src/page.rs index aa3c92cc5..c31d12040 100644 --- a/crates/typst-pdf/src/page.rs +++ b/crates/typst-pdf/src/page.rs @@ -229,17 +229,24 @@ fn write_page(ctx: &mut PdfContext, i: usize, resources_ref: Ref) { /// Write the page labels. pub(crate) fn write_page_labels(ctx: &mut PdfContext) -> Vec<(NonZeroUsize, Ref)> { + // If there is no page labeled, we skip the writing + if !ctx.pages.iter().any(|p| { + p.label + .as_ref() + .is_some_and(|l| l.prefix.is_some() || l.style.is_some()) + }) { + return Vec::new(); + } + let mut result = vec![]; + let empty_label = PdfPageLabel::default(); let mut prev: Option<&PdfPageLabel> = None; for (i, page) in ctx.pages.iter().enumerate() { let nr = NonZeroUsize::new(1 + i).unwrap(); - let Some(label) = &page.label else { continue }; - - // Don't create a label if neither style nor prefix are specified. - if label.prefix.is_none() && label.style.is_none() { - continue; - } + // If there are pages with empty labels between labeled pages, we must + // write empty PageLabel entries. + let label = page.label.as_ref().unwrap_or(&empty_label); if let Some(pre) = prev { if label.prefix == pre.prefix