-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
+package org.simantics.export.core.pdf;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.lowagie.text.pdf.PRStream;
+import com.lowagie.text.pdf.PdfArray;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfString;
+
+public class ImportPdfReader implements Closeable {
+
+ /** File if opened from file */
+ public File file;
+
+ /** iText pdf reader */
+ public PdfReader reader;
+
+ List<Attachment> attachments;
+
+ public ImportPdfReader() {
+ }
+
+ public ImportPdfReader(File file) throws IOException {
+ this.file = file;
+ reader = new PdfReader(file.getAbsolutePath());
+ }
+
+ public List<Attachment> getAttachments() {
+ if ( attachments != null ) return attachments;
+ attachments = new ArrayList<Attachment>();
+ PdfDictionary root = reader.getCatalog();
+ PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(root.get(PdfName.NAMES));
+ if (names == null)
+ return attachments;
+ PdfDictionary embeddedfiles = names.getAsDict(PdfName.EMBEDDEDFILES);
+ if (embeddedfiles == null)
+ return attachments;
+ PdfArray filespecs = embeddedfiles.getAsArray(PdfName.NAMES);
+ if (filespecs == null)
+ return attachments;
+ for (int i = 0; i < filespecs.size();) {
+ Attachment a = new Attachment();
+ filespecs.getAsString(i++);
+ a.filespec = filespecs.getAsDict(i++);
+ a.refs = a.filespec.getAsDict(PdfName.EF);
+ for (Object _key : a.refs.getKeys()) {
+ a.key = (PdfName) _key;
+ a.filename = a.filespec.getAsString(a.key);
+ attachments.add( a );
+ }
+ }
+ return attachments;
+ }
+
+ public List<Attachment> getAttachments(String extension) {
+ ArrayList<Attachment> result = new ArrayList<Attachment>();
+ for ( Attachment a : getAttachments() ) {
+ if ( a.getFilename().endsWith(extension) ) {
+ result.add( a );
+ }
+ }
+ return result;
+ }
+
+ public synchronized void close() {
+ if ( reader!=null ) {
+ reader.close();
+ reader = null;
+ }
+ }
+
+ public static class Attachment {
+ PdfDictionary filespec;
+ PdfDictionary refs;
+ PdfName key;
+ PdfString filename;
+
+ public String getFilename() {
+ return filename.toUnicodeString();
+ }
+
+ public void saveTo(File file) throws IOException {
+ FileOutputStream fos;
+ PRStream stream;
+ if ( !file.exists() ) file.createNewFile();
+ fos = new FileOutputStream(file);
+ try {
+ stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject(key));
+ fos.write(PdfReader.getStreamBytes(stream));
+ fos.flush();
+ } finally {
+ fos.close();
+ }
+ }
+
+ }
+
+}