/**
* the object's number
*/
- protected int number;
+ private int objnum;
/**
* the object's generation (0 in new documents)
*/
- protected int generation = 0;
+ private int generation = 0;
/**
- * create an empty object
- *
- * @param number the object's number
+ * the parent PDFDocument
*/
- public PDFObject(int number) {
- this.number = number;
- }
+ private PDFDocument document;
/**
* Create a PDFObject
}
/**
+ * Returns the object's number.
* @return the PDF Object number
*/
- public int getNumber() {
- return this.number;
+ public int getObjectNumber() {
+ if (this.objnum == 0) {
+ throw new IllegalStateException("Object has no number assigned: " + this.toString());
+ //System.out.println("Object has no number assigned: " + this.toString());
+ }
+ return this.objnum;
+ }
+
+ /**
+ * Indicates whether this PDFObject has already been assigned an
+ * object number.
+ * @return True if it has an object number
+ */
+ public boolean hasObjectNumber() {
+ return this.objnum > 0;
+ }
+
+ /**
+ * Sets the object number
+ * @param objnum the object number
+ */
+ public void setObjectNumber(int objnum) {
+ this.objnum = objnum;
+ //System.out.println("Assigning "+this+" object number "+objnum);
+ }
+
+ /**
+ * Returns the object's generation.
+ * @return the PDF Object generation
+ */
+ public int getGeneration() {
+ return this.generation;
+ }
+
+ /**
+ * Returns the parent PDFDocument if assigned.
+ * @return the parent PDFDocument (May be null if the parent PDFDocument
+ * has not been assigned)
+ */
+ public final PDFDocument getDocument() {
+ return this.document;
+ }
+
+ /**
+ * Returns the parent PDFDocument, but unlike <code>getDocument()</code>
+ * it throws an informative Exception if the parent document is unavailable
+ * instead of having a NullPointerException somewhere without a message.
+ * @return the parent PDFDocument
+ */
+ public final PDFDocument getDocumentSafely() {
+ final PDFDocument doc = getDocument();
+ if (doc == null) {
+ throw new IllegalStateException("Parent PDFDocument is unavailable");
+ }
+ return doc;
+ }
+
+ /**
+ * Sets the parent PDFDocument.
+ * @param doc the PDFDocument.
+ */
+ public void setDocument(PDFDocument doc) {
+ this.document = doc;
+ }
+
+ /**
+ * Returns the PDF representation of the Object ID.
+ * @return the Object ID
+ */
+ public String getObjectID() {
+ return getObjectNumber() + " " + getGeneration() + " obj\n";
}
/**
- * write the PDF represention of this object
+ * Returns the PDF representation of a reference to this object.
+ * @return the reference string
+ */
+ public String referencePDF() {
+ String ref = getObjectNumber() + " " + getGeneration() + " R";
+ return ref;
+ }
+
+ /**
+ * Write the PDF represention of this object
*
* @param stream the stream to write the PDF to
* @throws IOException if there is an error writing to the stream
}
/**
- * the PDF representation of a reference to this object
+ * Encodes the object as a byte array for output to a PDF file.
*
- * @return the reference string
+ * @return PDF string
*/
- public String referencePDF() {
- String p = this.number + " " + this.generation + " R";
- return p;
+ protected byte[] toPDF() {
+ return encode(toPDFString());
}
-
+
+
/**
- * represent object as PDF
- *
- * @return PDF string
+ * This method returns a String representation of the PDF object. The result
+ * is normally converted/encoded to a byte array by toPDF(). Only use
+ * this method to implement the serialization if the object can be fully
+ * represented as text. If the PDF representation of the object contains
+ * binary content use toPDF() or output(OutputStream) instead.
+ * @return String the String representation
*/
- abstract byte[] toPDF();
+ protected String toPDFString() {
+ throw new UnsupportedOperationException("Not implemented. "
+ + "Use output(OutputStream) instead.");
+ }
+
+
+ /**
+ * Converts text to a byte array for writing to a PDF file.
+ * @param text text to convert/encode
+ * @return byte[] the resulting byte array
+ */
+ public static final byte[] encode(String text) {
+ return PDFDocument.encode(text);
+ }
+
+ /**
+ * Encodes a Text String (3.8.1 in PDF 1.4 specs)
+ * @param text the text to encode
+ * @return byte[] the encoded text
+ */
+ protected byte[] encodeText(String text) {
+ if (getDocumentSafely().isEncryptionActive()) {
+ final byte[] buf = PDFText.toUTF16(text);
+ return PDFText.escapeByteArray(
+ getDocument().getEncryption().encrypt(buf, this));
+ } else {
+ return encode(PDFText.escapeText(text, true));
+ }
+ }
+
+ /**
+ * Encodes a String (3.2.3 in PDF 1.4 specs)
+ * @param string the string to encode
+ * @return byte[] the encoded string
+ */
+ protected byte[] encodeString(String string) {
+ return encodeText(string);
+ /*
+ final byte[] buf = encode(PDFText.escapeString(string));
+ if (getDocumentSafely().isEncryptionActive()) {
+ return PDFText.escapeByteArray(
+ getDocument().getEncryption().encrypt(buf, this));
+ } else {
+ return buf;
+ }*/
+ }
+
}