From 5f20fb1ea71347448a2a960d46aed67f8fa21280 Mon Sep 17 00:00:00 2001 From: dangowans Date: Fri, 14 Dec 2018 13:59:23 -0500 Subject: [PATCH] Use system look and feel, Detect system memory If low memory, disable caching --- .../pdfflattener/FlattenPDF$1.class | Bin 0 -> 780 bytes .../pdfflattener/FlattenPDF.class | Bin 6785 -> 7921 bytes .../pdfflattener/FlattenPDF.java | 49 ++++++++++++++++-- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 bin/ca/saultstemarie/pdfflattener/FlattenPDF$1.class diff --git a/bin/ca/saultstemarie/pdfflattener/FlattenPDF$1.class b/bin/ca/saultstemarie/pdfflattener/FlattenPDF$1.class new file mode 100644 index 0000000000000000000000000000000000000000..80c1ca2d18e0bfbac87717874a6567f26158e206 GIT binary patch literal 780 zcma)4-AY?Q5dJ1fJsP9&udTL<3SLAJ7s0!f_9AIOI9Aaj-fm7d$;!#uaCRd;g5cA5 zC3xWj^r6JrlN7NH;=<1E%zWR>?9BdodUynIfVBWQ!cHWGm4nz>r+PBgO7vUpb}XG! ziAqIdcsr>#w)O)Q2zw^&2-%lWH$yhfH4}QKrD9Q6Z6D}VSu;o@Rr46a#5bL2_nnZh zY@ZVfHO3Z^$5aU)FhMAXI#Is{y{1Zk%Vx}sh0sJYKIdY*J~9?uS6jkv`2KpUoU=c0 zgwsm+f7Ow(qIP_C+`LqgtBwKueO4!x{jQFzIH_NZ(EcHlI%(;YxrEIz?APH5!L`XU zaRtNh|0y8Ho2SZpz&F7sdCSf{ChszLk)?M7 zH<)Hw8Upy7VT~}0GD}bX!P^I=e~GslabxHl5j}Md^I0(dKv?8T@>pVe4j=J}&jLPU N1*?23GRhag>lvpI#Lxf$ literal 0 HcmV?d00001 diff --git a/bin/ca/saultstemarie/pdfflattener/FlattenPDF.class b/bin/ca/saultstemarie/pdfflattener/FlattenPDF.class index 5954ef7c19950005a9e53e3816791124ba05c451..caca3600ca7320cfcc5b88c449a0bf64191a423e 100644 GIT binary patch literal 7921 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 ZbjtLMO2)-zrpa#Q0EIxbhNoH7{$KcN5ZnL& diff --git a/src/ca/saultstemarie/pdfflattener/FlattenPDF.java b/src/ca/saultstemarie/pdfflattener/FlattenPDF.java index 9b710f4..fbd3b3d 100644 --- a/src/ca/saultstemarie/pdfflattener/FlattenPDF.java +++ b/src/ca/saultstemarie/pdfflattener/FlattenPDF.java @@ -6,12 +6,17 @@ import javax.swing.JFileChooser; import javax.swing.JOptionPane; +import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; +import org.apache.pdfbox.cos.COSObject; +import org.apache.pdfbox.io.MemoryUsageSetting; +import org.apache.pdfbox.pdmodel.DefaultResourceCache; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.rendering.ImageType; @@ -25,8 +30,16 @@ public class FlattenPDF { public static void main(String[] args) { // Settings + System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider"); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch (Exception e) { + // ignore and use default + } + /* * Get the source file */ @@ -104,12 +117,32 @@ public static void main(String[] args) { */ public static int flattenPDF (File sourceFile, File destinationFile) { + long startMillis = System.currentTimeMillis(); + PDDocument sourceDoc = null; PDDocument destDoc = new PDDocument(); try { - - sourceDoc = PDDocument.load(sourceFile); + + long maxAvailableMemoryInMB = Runtime.getRuntime().maxMemory() / 1024 / 1024; + + // If less than 1GB available, be more memory conscious + if (maxAvailableMemoryInMB < 2048) { + + log("Max memory limited to " + maxAvailableMemoryInMB + "MB. Resource cache will be disabled."); + + sourceDoc = PDDocument.load(sourceFile, MemoryUsageSetting.setupTempFileOnly()); + + sourceDoc.setResourceCache(new DefaultResourceCache() { + public void put (COSObject indirect, PDXObject xobject) { + // discard + } + }); + } + else { + sourceDoc = PDDocument.load(sourceFile); + } + PDFRenderer pdfRenderer = new PDFRenderer(sourceDoc); final int pageCount = sourceDoc.getDocumentCatalog().getPages().getCount(); @@ -134,8 +167,14 @@ public static int flattenPDF (File sourceFile, File destinationFile) { log(" Image added successfully."); + /* + * Close and clear images + */ + imagePageContentStream.close(); + imgObj = null; + img.flush(); img = null; } @@ -147,7 +186,7 @@ public static int flattenPDF (File sourceFile, File destinationFile) { * Remove links to the source document before saving. * (Get back as much memory as possible.) */ - + pdfRenderer = null; sourceDoc.close(); @@ -162,10 +201,10 @@ public static int flattenPDF (File sourceFile, File destinationFile) { destDoc.save(destinationFile); destDoc.close(); - log("Saved successfully."); + log("Saved successfully (" + ((System.currentTimeMillis() - startMillis) / 1000.0) + " seconds)."); } catch (Exception e) { - JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + log("Error: " + e.getMessage()); return 1; } finally {