--- /dev/null
+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