]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.export.core.pdf;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileOutputStream;\r
5 import java.io.IOException;\r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \r
9 import com.lowagie.text.pdf.PRStream;\r
10 import com.lowagie.text.pdf.PdfArray;\r
11 import com.lowagie.text.pdf.PdfDictionary;\r
12 import com.lowagie.text.pdf.PdfName;\r
13 import com.lowagie.text.pdf.PdfReader;\r
14 import com.lowagie.text.pdf.PdfString;\r
15 \r
16 public class ImportPdfReader {\r
17 \r
18         /** File if opened from file */\r
19         public File file;\r
20         \r
21         /** iText pdf reader */\r
22         public PdfReader reader;\r
23         \r
24         List<Attachment> attachments;\r
25         \r
26         public ImportPdfReader() {              \r
27         }\r
28         \r
29         public ImportPdfReader(File file) throws IOException {\r
30                 this.file = file;\r
31                 reader = new PdfReader(file.getAbsolutePath());\r
32         }\r
33 \r
34         public List<Attachment> getAttachments() {\r
35                 if ( attachments != null ) return attachments;          \r
36                 attachments = new ArrayList<Attachment>();\r
37                 PdfDictionary root = reader.getCatalog();\r
38                 PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(root.get(PdfName.NAMES));\r
39                 if (names == null)\r
40                         return attachments;\r
41                 PdfDictionary embeddedfiles = names.getAsDict(PdfName.EMBEDDEDFILES);\r
42                 if (embeddedfiles == null)\r
43                         return attachments;\r
44                 PdfArray filespecs = embeddedfiles.getAsArray(PdfName.NAMES);\r
45                 if (filespecs == null)\r
46                         return attachments;\r
47                 for (int i = 0; i < filespecs.size();) {\r
48                         Attachment a = new Attachment();\r
49                         filespecs.getAsString(i++);\r
50                         a.filespec = filespecs.getAsDict(i++);\r
51                         a.refs = a.filespec.getAsDict(PdfName.EF);\r
52                         for (Object _key : a.refs.getKeys()) {\r
53                                 a.key = (PdfName) _key;\r
54                                 a.filename = a.filespec.getAsString(a.key);\r
55                                 attachments.add( a );\r
56                         }\r
57                 }               \r
58                 return attachments;\r
59         }\r
60         \r
61         public List<Attachment> getAttachments(String extension) {\r
62                 ArrayList<Attachment> result = new ArrayList<Attachment>();\r
63                 for ( Attachment a : getAttachments() ) {\r
64                         if ( a.getFilename().endsWith(extension) ) {\r
65                                 result.add( a );\r
66                         }\r
67                 }\r
68                 return result;\r
69         }\r
70         \r
71         public void close() {\r
72                 if ( reader!=null ) {\r
73                         reader.close();\r
74                         reader = null;\r
75                 }\r
76         }\r
77 \r
78         public static class Attachment {\r
79                 PdfDictionary filespec;\r
80                 PdfDictionary refs;\r
81                 PdfName key;\r
82                 PdfString filename;\r
83                 \r
84                 public String getFilename() {\r
85                         return filename.toUnicodeString();\r
86                 }\r
87                 \r
88                 public void saveTo(File file) throws IOException {\r
89                         FileOutputStream fos;\r
90                         PRStream stream;\r
91                         if ( !file.exists() ) file.createNewFile();\r
92                         fos = new FileOutputStream(file); \r
93                         try {\r
94                                 stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject(key));\r
95                                 fos.write(PdfReader.getStreamBytes(stream));\r
96                                 fos.flush();\r
97                         } finally {\r
98                                 fos.close();\r
99                         }\r
100                 }\r
101                 \r
102         }\r
103         \r
104 }\r