View Javadoc

1   // Copyright 2000-2005 FreeHEP
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   * Implements the lookup tables.
11   * <p>
12   * 
13   * @author Mark Donszelmann
14   * @version $Id: PDF.java 8584 2006-08-10 23:06:37Z duns $
15   */
16  public class PDF {
17  
18      private int generationNumber = 0;
19  
20      private Hashtable refsByName = new Hashtable(); // of PDFRefs stored by name
21  
22      private Vector refsByNumber = new Vector(); // of PDFRefs stored by number
23  
24      private Vector xrefsByNumber = new Vector(); // of offsets stored by
25                                                      // refnumber
26  
27      private int startXref = 0;
28  
29      protected PDFByteWriter out;
30  
31      PDF(PDFByteWriter out) {
32          this.out = out;
33          // add dummy element to refsByNumber and xrefsByNumber
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          // the free list header
78          out.printPlain(offsetFormat.format(0) + " " + linkFormat.format(65535)
79                  + " f\r\n");
80  
81          // the used list
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 }