mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2026-02-17 13:52:14 +01:00
feat(compress): add advanced compression parameters and better optimization levels (#4703)
# Description of Changes This PR reworks the compression endpoints, to be more consistent and apply better compression on higher levels. Some improvement on lower is also expected. ### Overview: - Added new global flags: --recompress-flate --compress-streams=y --object-streams=generate - Added --decode-level=generalized, so that if the original PDF was poorly compressed then, it can re-compress it better - Added --stream-data=compress for better compression of vector/text parts - Now conditional: --preserve-unreferenced kept only for safe levels ≤3 - Added --optimize-images --jpeg-quality 35–75 depending on level (this brings significant drop in file size, compared to earlier.) - Added QPDF_ZOPFLI for level ≥8 which is better algorithm for compressing JPEG. Comes with approx 5% gain per JPEG on PDFs. See here for details: https://qpdf.readthedocs.io/en/stable/cli.html#zopfli-compression-algorithm - level 9, Ghostscript uses strongest downsampling (72/72/150) and CMYK -> RGB ### Images: - Scale factor now ramps 1 -> 9: 0.98, 0.95, 0.88, 0.78, 0.68, 0.58, 0.48, 0.38, 0.28. - JPEG quality ramps 1 -> 9: 0.92, 0.88, 0.85, 0.80, 0.72, 0.65, 0.55, 0.45, 0.35. ### Results: <img width="1491" height="731" alt="create-ms_pdf_sizes" src="https://github.com/user-attachments/assets/43ed2ce2-7524-4c03-8689-96a6cb68d046" /> <img width="1481" height="731" alt="img-doc_pdf_sizes" src="https://github.com/user-attachments/assets/3a217c33-3551-44ac-b499-8283cb36cf5d" /> <img width="1470" height="731" alt="lorem-ipsum_pdf_sizes" src="https://github.com/user-attachments/assets/12a6bc07-1d4b-4648-a66e-ba22d21a1202" /> <img width="1482" height="731" alt="pdf-dev-example_pdf_sizes" src="https://github.com/user-attachments/assets/00632d91-f7b9-4310-a283-f0fca9c922d5" /> <img width="1470" height="731" alt="sample-1_pdf_sizes" src="https://github.com/user-attachments/assets/317a26c2-dd1a-4d63-a578-279b14fd9f37" /> Sample files used: [image-doc.pdf](https://github.com/user-attachments/files/22984417/image-doc.pdf) [lorem-ipsum.pdf](https://github.com/user-attachments/files/22984418/lorem-ipsum.pdf) [Create Microsoft Word Document Templates.pdf](https://github.com/user-attachments/files/22984419/Create.Microsoft.Word.Document.Templates.pdf) [sample-1.pdf](https://github.com/user-attachments/files/22984420/sample-1.pdf) ### But is it better than the old? (On level 9) #### Old vs new: - image-doc: 1.0 MB vs 454 KB - create-word: 426 KB vs 247 KB - lorem-ipsum: 44.7 KB vs 44.4 Most of changes are focused on images, so more images = better gains. Even on lorem-ipsum text PDF (with no images) there still some gains but not significant. (so, it is better) Closes: #4442 Closes: #4720 <!-- Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --> --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. --------- Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
This commit is contained in: