]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.export.core/src/org/simantics/export/core/pdf/ImportPdfReader.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.export.core / src / org / simantics / export / core / pdf / ImportPdfReader.java
diff --git a/bundles/org.simantics.export.core/src/org/simantics/export/core/pdf/ImportPdfReader.java b/bundles/org.simantics.export.core/src/org/simantics/export/core/pdf/ImportPdfReader.java
new file mode 100644 (file)
index 0000000..f15df92
--- /dev/null
@@ -0,0 +1,104 @@
+package org.simantics.export.core.pdf;\r
+\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.lowagie.text.pdf.PRStream;\r
+import com.lowagie.text.pdf.PdfArray;\r
+import com.lowagie.text.pdf.PdfDictionary;\r
+import com.lowagie.text.pdf.PdfName;\r
+import com.lowagie.text.pdf.PdfReader;\r
+import com.lowagie.text.pdf.PdfString;\r
+\r
+public class ImportPdfReader {\r
+\r
+       /** File if opened from file */\r
+       public File file;\r
+       \r
+       /** iText pdf reader */\r
+       public PdfReader reader;\r
+       \r
+       List<Attachment> attachments;\r
+       \r
+       public ImportPdfReader() {              \r
+       }\r
+       \r
+       public ImportPdfReader(File file) throws IOException {\r
+               this.file = file;\r
+               reader = new PdfReader(file.getAbsolutePath());\r
+       }\r
+\r
+       public List<Attachment> getAttachments() {\r
+               if ( attachments != null ) return attachments;          \r
+               attachments = new ArrayList<Attachment>();\r
+               PdfDictionary root = reader.getCatalog();\r
+               PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(root.get(PdfName.NAMES));\r
+               if (names == null)\r
+                       return attachments;\r
+               PdfDictionary embeddedfiles = names.getAsDict(PdfName.EMBEDDEDFILES);\r
+               if (embeddedfiles == null)\r
+                       return attachments;\r
+               PdfArray filespecs = embeddedfiles.getAsArray(PdfName.NAMES);\r
+               if (filespecs == null)\r
+                       return attachments;\r
+               for (int i = 0; i < filespecs.size();) {\r
+                       Attachment a = new Attachment();\r
+                       filespecs.getAsString(i++);\r
+                       a.filespec = filespecs.getAsDict(i++);\r
+                       a.refs = a.filespec.getAsDict(PdfName.EF);\r
+                       for (Object _key : a.refs.getKeys()) {\r
+                               a.key = (PdfName) _key;\r
+                               a.filename = a.filespec.getAsString(a.key);\r
+                               attachments.add( a );\r
+                       }\r
+               }               \r
+               return attachments;\r
+       }\r
+       \r
+       public List<Attachment> getAttachments(String extension) {\r
+               ArrayList<Attachment> result = new ArrayList<Attachment>();\r
+               for ( Attachment a : getAttachments() ) {\r
+                       if ( a.getFilename().endsWith(extension) ) {\r
+                               result.add( a );\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       public void close() {\r
+               if ( reader!=null ) {\r
+                       reader.close();\r
+                       reader = null;\r
+               }\r
+       }\r
+\r
+       public static class Attachment {\r
+               PdfDictionary filespec;\r
+               PdfDictionary refs;\r
+               PdfName key;\r
+               PdfString filename;\r
+               \r
+               public String getFilename() {\r
+                       return filename.toUnicodeString();\r
+               }\r
+               \r
+               public void saveTo(File file) throws IOException {\r
+                       FileOutputStream fos;\r
+                       PRStream stream;\r
+                       if ( !file.exists() ) file.createNewFile();\r
+                       fos = new FileOutputStream(file); \r
+                       try {\r
+                               stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject(key));\r
+                               fos.write(PdfReader.getStreamBytes(stream));\r
+                               fos.flush();\r
+                       } finally {\r
+                               fos.close();\r
+                       }\r
+               }\r
+               \r
+       }\r
+       \r
+}\r