1
2 package org.freehep.graphicsio.pdf;
3
4 import java.awt.Color;
5 import java.awt.image.RenderedImage;
6 import java.io.IOException;
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.LinkedList;
10 import java.util.List;
11 import java.util.Map;
12
13
14
15
16
17
18
19
20
21 public class PDFImageDelayQueue {
22
23 private int currentNumber = 0;
24
25 private class Entry {
26 private RenderedImage image;
27
28 private String name, maskName;
29
30 private Color bkg;
31
32 private String writeAs;
33
34 private boolean written;
35
36 private Entry(RenderedImage image, Color bkg, String writeAs) {
37 this.image = image;
38 this.bkg = bkg;
39 this.writeAs = writeAs;
40 this.name = "Img" + (currentNumber++);
41 if (image.getColorModel().hasAlpha() && (bkg == null)) {
42 maskName = name + "Mask";
43 } else {
44 maskName = null;
45 }
46 this.written = false;
47 }
48 }
49
50 private Map
51
52 private List
53
54 private PDFWriter pdf;
55
56 public PDFImageDelayQueue(PDFWriter pdf) {
57 this.pdf = pdf;
58 this.imageMap = new HashMap();
59 this.imageList = new LinkedList();
60 }
61
62 public PDFName delayImage(RenderedImage image, Color bkg, String writeAs) {
63 Entry entry = (Entry) imageMap.get(image);
64 if (entry == null) {
65 entry = new Entry(image, bkg, writeAs);
66 imageMap.put(image, entry);
67 imageList.add(entry);
68 }
69
70 return pdf.name(entry.name);
71 }
72
73
74 public void processAll() throws IOException {
75 for (Iterator i = imageList.iterator(); i.hasNext();) {
76 Entry entry = (Entry) i.next();
77
78 if (!entry.written) {
79 entry.written = true;
80
81 PDFStream img = pdf.openStream(entry.name);
82 img.entry("Subtype", pdf.name("Image"));
83 if (entry.maskName != null)
84 img.entry("SMask", pdf.ref(entry.maskName));
85 img.image(entry.image, entry.bkg, entry.writeAs);
86 pdf.close(img);
87
88 if (entry.maskName != null) {
89 PDFStream mask = pdf.openStream(entry.maskName);
90 mask.entry("Subtype", pdf.name("Image"));
91 mask.imageMask(entry.image, entry.writeAs);
92 pdf.close(mask);
93 }
94 }
95 }
96 }
97
98
99
100
101
102 public int addXObjects() throws IOException {
103 if (imageList.size() > 0) {
104 PDFDictionary xobj = pdf.openDictionary("XObjects");
105 for (Iterator i = imageList.iterator(); i.hasNext();) {
106 Entry entry = (Entry) i.next();
107 xobj.entry(entry.name, pdf.ref(entry.name));
108 if (entry.maskName != null)
109 xobj.entry(entry.maskName, pdf.ref(entry.maskName));
110 }
111 pdf.close(xobj);
112 }
113 return imageList.size();
114 }
115 }