forked from 1b-agent/opencadstudio-upstream
fix(pdf): Flate-compress the exported PDF streams
printpdf 0.9's `PdfSaveOptions::optimize` is a no-op — its `doc.compress()` call is commented out — so every page's content stream (megabytes of vector operators for a CAD sheet) was written uncompressed: a 16-sheet drawing set exported as 280 MB. Serialise through `printpdf::to_lopdf_doc` and run lopdf's `compress()` before writing; the same export is now 49 MB and readers see ordinary FlateDecode streams. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
876513d009
commit
4826cd7989
3 files changed
+13
-1
No files matched your search
Generated
+1
@@ -38,6 +38,7 @@ dependencies = [
|
|||||||
"js-sys",
|
"js-sys",
|
||||||
"libloading",
|
"libloading",
|
||||||
"log",
|
"log",
|
||||||
|
"lopdf",
|
||||||
"lyon_tessellation",
|
"lyon_tessellation",
|
||||||
"meshopt",
|
"meshopt",
|
||||||
"naga 27.0.3",
|
"naga 27.0.3",
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ i18n-embed = { version = "0.16", features = ["desktop-requester"] }
|
|||||||
rayon = "1"
|
rayon = "1"
|
||||||
open = "5"
|
open = "5"
|
||||||
printpdf = { version = "0.9.1", default-features = false, features = ["images"] }
|
printpdf = { version = "0.9.1", default-features = false, features = ["images"] }
|
||||||
|
# The lopdf printpdf builds on: used to Flate-compress the exported PDF streams.
|
||||||
|
lopdf = { version = "0.39.0", default-features = false, features = ["time"] }
|
||||||
ureq = { version = "3", default-features = false, features = ["rustls", "platform-verifier", "win-system-proxy"] }
|
ureq = { version = "3", default-features = false, features = ["rustls", "platform-verifier", "win-system-proxy"] }
|
||||||
|
|
||||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||||
|
|||||||
+10
-1
@@ -424,7 +424,16 @@ fn build_pdf_pages(pages: &[PdfPageInput], plot_style: Option<&PlotStyleTable>)
|
|||||||
.map_err(|error| format!("Page {}: {error}", index + 1))?;
|
.map_err(|error| format!("Page {}: {error}", index + 1))?;
|
||||||
}
|
}
|
||||||
let mut warnings = Vec::new();
|
let mut warnings = Vec::new();
|
||||||
Ok(doc.save(&PdfSaveOptions::default(), &mut warnings))
|
// printpdf 0.9's `optimize` is a no-op (its `doc.compress()` is commented
|
||||||
|
// out), so every page's content stream — megabytes of vector operators
|
||||||
|
// for a CAD sheet — went out uncompressed: a 16-sheet set weighed 280 MB.
|
||||||
|
// Serialise through lopdf ourselves and Flate-compress the streams.
|
||||||
|
let mut lo = printpdf::to_lopdf_doc(&doc, &PdfSaveOptions::default(), &mut warnings);
|
||||||
|
lo.compress();
|
||||||
|
let mut bytes = Vec::new();
|
||||||
|
lo.save_to(&mut bytes)
|
||||||
|
.map_err(|error| format!("PDF serialisation failed: {error}"))?;
|
||||||
|
Ok(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
|
|||||||
Reference in new issue
Block a user