From 5020dc05851b2c3bd6566db2d11fdba26f5e36f5 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 23 Oct 2026 16:50:49 -0400 Subject: [PATCH] PDF export: past the retry cap, one last run leaves out every image instead of failing --- crates/pdf/src/export.rs | 11 ++++++++--- crates/pdf/src/print/mod.rs | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/pdf/src/export.rs b/crates/pdf/src/export.rs index 60f4353e3..26482b137 100644 --- a/crates/pdf/src/export.rs +++ b/crates/pdf/src/export.rs @@ -38,7 +38,7 @@ pub fn export(doc: &Document, opts: &PdfOptions) -> Result, PdfError> { /// Like [`export`], also returning warnings: options accepted but not applied yet (see /// [`crate::PdfSettings::warnings`]) and features approximated or dropped. pub fn export_with_report(doc: &Document, opts: &PdfOptions) -> Result { - write::guard(|| leaving_out_undecodable(|left_out| export_with_report_inner(doc, opts, left_out))) + write::guard(|| leaving_out_undecodable(doc, |left_out| export_with_report_inner(doc, opts, left_out))) } /// Run `write` (a whole PDF written by a [`Writer`]), and run it again each time it fails on an @@ -46,9 +46,10 @@ pub fn export_with_report(doc: &Document, opts: &PdfOptions) -> Result(mut write: impl FnMut(&mut HashSet) -> Result) -> Result { +pub(crate) fn leaving_out_undecodable(doc: &Document, mut write: impl FnMut(&mut HashSet) -> Result) -> Result { // The most runs repeated: each is a whole export, and a document of many images that don't - // decode would make them quadratic. Past it the writer's error is the result. + // decode would make them quadratic. Past it, one last run leaves out every image of `doc`, so + // the export still finishes (the images left out are reported). const MAX_RETRIES: usize = 16; let mut left_out = HashSet::new(); let mut retries = 0; @@ -56,6 +57,10 @@ pub(crate) fn leaving_out_undecodable(mut write: impl FnMut(&mut HashSet known && retries < MAX_RETRIES => retries += 1, + Err(_) if left_out.len() > known && retries == MAX_RETRIES => { + left_out.extend(doc.images.keys().cloned()); + retries += 1; + } done => return done, } } diff --git a/crates/pdf/src/print/mod.rs b/crates/pdf/src/print/mod.rs index b3fa28508..56c8a2525 100644 --- a/crates/pdf/src/print/mod.rs +++ b/crates/pdf/src/print/mod.rs @@ -396,7 +396,7 @@ pub fn plan<'a>(doc: &'a Document, opts: &PrintOptions) -> Result, /// Print `doc` to a PDF as `opts` say. pub fn print(doc: &Document, opts: &PrintOptions) -> Result { - craft_pdf::write::guard(|| leaving_out_undecodable(|left_out| print_inner(doc, opts, left_out))) + craft_pdf::write::guard(|| leaving_out_undecodable(doc, |left_out| print_inner(doc, opts, left_out))) } fn print_inner(doc: &Document, opts: &PrintOptions, left_out: &mut HashSet) -> Result {