1
2 package org.freehep.graphicsio.pdf;
3
4 import java.io.IOException;
5 import java.text.DecimalFormat;
6 import java.util.Hashtable;
7 import java.util.Vector;
8
9
10
11
12
13
14
15
16 public class PDF {
17
18 private int generationNumber = 0;
19
20 private Hashtable refsByName = new Hashtable();
21
22 private Vector refsByNumber = new Vector();
23
24 private Vector xrefsByNumber = new Vector();
25
26
27 private int startXref = 0;
28
29 protected PDFByteWriter out;
30
31 PDF(PDFByteWriter out) {
32 this.out = out;
33
34 refsByNumber.addElement(new PDFRef("Dummy", 0, 0));
35 xrefsByNumber.addElement(new Integer(999999));
36 }
37
38 public PDFName name(String name) {
39 return new PDFName(name);
40 }
41
42 public PDFRef ref(String name) {
43 if (name == null)
44 return null;
45 PDFRef ref = (PDFRef) refsByName.get(name);
46 if (ref == null) {
47 int refNumber = refsByNumber.size();
48 ref = new PDFRef(name, refNumber, generationNumber);
49 refsByName.put(name, ref);
50 refsByNumber.add(ref);
51 xrefsByNumber.add(null);
52 }
53 return ref;
54 }
55
56 public PDFRef[] ref(String[] names) {
57 PDFRef[] refs = new PDFRef[names.length];
58 for (int i = 0; i < names.length; i++) {
59 refs[i] = ref(names[i]);
60 }
61 return refs;
62 }
63
64 protected void setXRef(int objectNumber, int offset) {
65 xrefsByNumber.set(objectNumber, new Integer(offset));
66 }
67
68 protected void xref() throws IOException {
69 DecimalFormat offsetFormat = new DecimalFormat("0000000000");
70 DecimalFormat linkFormat = new DecimalFormat("00000");
71 startXref = out.getCount();
72 out.printPlain("xref");
73 out.println();
74 out.printPlain(0 + " " + xrefsByNumber.size());
75 out.println();
76
77
78 out.printPlain(offsetFormat.format(0) + " " + linkFormat.format(65535)
79 + " f\r\n");
80
81
82 for (int i = 1; i < xrefsByNumber.size(); i++) {
83 Integer offsetObject = (Integer) xrefsByNumber.get(i);
84 if (offsetObject != null) {
85 int offset = offsetObject.intValue();
86 out.printPlain(offsetFormat.format(offset) + " "
87 + linkFormat.format(0) + " n\r\n");
88 } else {
89 PDFRef ref = (PDFRef) refsByNumber.get(i);
90 System.err.println("PDFWriter: PDFRef '" + ref.getName()
91 + "' is used but not defined.");
92 }
93 }
94
95 out.println();
96 }
97
98 protected void trailer(String rootName, String docInfoName)
99 throws IOException {
100 out.println("trailer");
101 PDFDictionary dictionary = new PDFDictionary(this, out);
102 dictionary.entry("Size", refsByName.size());
103 dictionary.entry("Root", ref(rootName));
104 if (docInfoName != null)
105 dictionary.entry("Info", ref(docInfoName));
106 dictionary.close();
107
108 out.println();
109 }
110
111 protected void startxref() throws IOException {
112 out.println("startxref");
113 out.println(startXref);
114
115 out.println();
116 }
117 }