001: /**
002: * Copyright (c) 2003, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdfwriter;
031:
032: import java.io.FilterOutputStream;
033: import java.io.IOException;
034: import java.io.OutputStream;
035:
036: /**
037: * simple output stream with some minor features for generating "pretty"
038: * pdf files.
039: *
040: * @author Michael Traut
041: * @version $Revision: 1.5 $
042: */
043: public class COSStandardOutputStream extends FilterOutputStream {
044:
045: /**
046: * To be used when 2 byte sequence is enforced.
047: */
048: public static final byte[] CRLF = "\r\n".getBytes();
049:
050: /**
051: * Line feed character.
052: */
053: public static final byte[] LF = "\n".getBytes();
054:
055: /**
056: * standard line separator on this platform.
057: */
058: public static final byte[] EOL = System.getProperty(
059: "line.separator").getBytes();
060:
061: // current byte pos in the output stream
062: private long pos = 0;
063: // flag to prevent generating two newlines in sequence
064: private boolean onNewLine = false;
065:
066: /**
067: * COSOutputStream constructor comment.
068: *
069: * @param out The underlying stream to write to.
070: */
071: public COSStandardOutputStream(OutputStream out) {
072: super (out);
073: }
074:
075: /**
076: * This will get the current position in the stream.
077: *
078: * @return The current position in the stream.
079: */
080: public long getPos() {
081: return pos;
082: }
083:
084: /**
085: * This will tell if we are on a newling.
086: *
087: * @return true If we are on a newline.
088: */
089: public boolean isOnNewLine() {
090: return onNewLine;
091: }
092:
093: /**
094: * This will set a flag telling if we are on a newline.
095: *
096: * @param newOnNewLine The new value for the onNewLine attribute.
097: */
098: public void setOnNewLine(boolean newOnNewLine) {
099: onNewLine = newOnNewLine;
100: }
101:
102: /**
103: * This will write some byte to the stream.
104: *
105: * @param b The source byte array.
106: * @param off The offset into the array to start writing.
107: * @param len The number of bytes to write.
108: *
109: * @throws IOException If the underlying stream throws an exception.
110: */
111: public void write(byte[] b, int off, int len) throws IOException {
112: setOnNewLine(false);
113: out.write(b, off, len);
114: pos += len;
115: }
116:
117: /**
118: * This will write a single byte to the stream.
119: *
120: * @param b The byte to write to the stream.
121: *
122: * @throws IOException If there is an error writing to the underlying stream.
123: */
124: public void write(int b) throws IOException {
125: setOnNewLine(false);
126: out.write(b);
127: pos++;
128: }
129:
130: /**
131: * This will write a CRLF to the stream.
132: *
133: * @throws IOException If there is an error writing the data to the stream.
134: */
135: public void writeCRLF() throws IOException {
136: write(CRLF);
137: // setOnNewLine(true);
138: }
139:
140: /**
141: * This will write an EOL to the stream.
142: *
143: * @throws IOException If there is an error writing to the stream
144: */
145: public void writeEOL() throws IOException {
146: if (!isOnNewLine()) {
147: write(EOL);
148: setOnNewLine(true);
149: }
150: }
151:
152: /**
153: * This will write a Linefeed to the stream.
154: *
155: * @throws IOException If there is an error writing to the underlying stream.
156: */
157: public void writeLF() throws IOException {
158: write(LF);
159: // setOnNewLine(true);
160: }
161: }
|