001/*
002 * $Id: PdfContents.java 4784 2011-03-15 08:33:00Z blowagie $
003 *
004 * This file is part of the iText (R) project.
005 * Copyright (c) 1998-2011 1T3XT BVBA
006 * Authors: Bruno Lowagie, Paulo Soares, et al.
007 *
008 * This program is free software; you can redistribute it and/or modify
009 * it under the terms of the GNU Affero General Public License version 3
010 * as published by the Free Software Foundation with the addition of the
011 * following permission added to Section 15 as permitted in Section 7(a):
012 * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY 1T3XT,
013 * 1T3XT DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
014 *
015 * This program is distributed in the hope that it will be useful, but
016 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
017 * or FITNESS FOR A PARTICULAR PURPOSE.
018 * See the GNU Affero General Public License for more details.
019 * You should have received a copy of the GNU Affero General Public License
020 * along with this program; if not, see http://www.gnu.org/licenses or write to
021 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
022 * Boston, MA, 02110-1301 USA, or download the license from the following URL:
023 * http://itextpdf.com/terms-of-use/
024 *
025 * The interactive user interfaces in modified source and object code versions
026 * of this program must display Appropriate Legal Notices, as required under
027 * Section 5 of the GNU Affero General Public License.
028 *
029 * In accordance with Section 7(b) of the GNU Affero General Public License,
030 * a covered work must retain the producer line in every PDF that is created
031 * or manipulated using iText.
032 *
033 * You can be released from the requirements of the license by purchasing
034 * a commercial license. Buying such a license is mandatory as soon as you
035 * develop commercial activities involving the iText software without
036 * disclosing the source code of your own applications.
037 * These activities include: offering paid services to customers as an ASP,
038 * serving PDFs on the fly in a web application, shipping iText with a closed
039 * source product.
040 *
041 * For more information, please contact iText Software Corp. at this
042 * address: sales@itextpdf.com
043 */
044package com.itextpdf.text.pdf;
045
046import java.io.ByteArrayOutputStream;
047import java.io.OutputStream;
048import java.util.zip.Deflater;
049import java.util.zip.DeflaterOutputStream;
050
051import com.itextpdf.text.DocWriter;
052import com.itextpdf.text.Document;
053import com.itextpdf.text.Rectangle;
054
055/**
056 * <CODE>PdfContents</CODE> is a <CODE>PdfStream</CODE> containing the contents (text + graphics) of a <CODE>PdfPage</CODE>.
057 */
058
059class PdfContents extends PdfStream {
060    
061    static final byte SAVESTATE[] = DocWriter.getISOBytes("q\n");
062    static final byte RESTORESTATE[] = DocWriter.getISOBytes("Q\n");
063    static final byte ROTATE90[] = DocWriter.getISOBytes("0 1 -1 0 ");
064    static final byte ROTATE180[] = DocWriter.getISOBytes("-1 0 0 -1 ");
065    static final byte ROTATE270[] = DocWriter.getISOBytes("0 -1 1 0 ");
066    static final byte ROTATEFINAL[] = DocWriter.getISOBytes(" cm\n");
067    // constructor
068    
069/**
070 * Constructs a <CODE>PdfContents</CODE>-object, containing text and general graphics.
071 *
072 * @param under the direct content that is under all others
073 * @param content the graphics in a page
074 * @param text the text in a page
075 * @param secondContent the direct content that is over all others
076 * @throws BadPdfFormatException on error
077 */
078    
079    PdfContents(PdfContentByte under, PdfContentByte content, PdfContentByte text, PdfContentByte secondContent, Rectangle page) throws BadPdfFormatException {
080        super();
081        try {
082            OutputStream out = null;
083            Deflater deflater = null;
084            streamBytes = new ByteArrayOutputStream();
085            if (Document.compress)
086            {
087                compressed = true;
088                compressionLevel = text.getPdfWriter().getCompressionLevel();
089                deflater = new Deflater(compressionLevel);
090                out = new DeflaterOutputStream(streamBytes, deflater);
091            }
092            else
093                out = streamBytes;
094            int rotation = page.getRotation();
095            switch (rotation) {
096                case 90:
097                    out.write(ROTATE90);
098                    out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.getTop())));
099                    out.write(' ');
100                    out.write('0');
101                    out.write(ROTATEFINAL);
102                    break;
103                case 180:
104                    out.write(ROTATE180);
105                    out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.getRight())));
106                    out.write(' ');
107                    out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.getTop())));
108                    out.write(ROTATEFINAL);
109                    break;
110                case 270:
111                    out.write(ROTATE270);
112                    out.write('0');
113                    out.write(' ');
114                    out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.getRight())));
115                    out.write(ROTATEFINAL);
116                    break;
117            }
118            if (under.size() > 0) {
119                out.write(SAVESTATE);
120                under.getInternalBuffer().writeTo(out);
121                out.write(RESTORESTATE);
122            }
123            if (content.size() > 0) {
124                out.write(SAVESTATE);
125                content.getInternalBuffer().writeTo(out);
126                out.write(RESTORESTATE);
127            }
128            if (text != null) {
129                out.write(SAVESTATE);
130                text.getInternalBuffer().writeTo(out);
131                out.write(RESTORESTATE);
132            }
133            if (secondContent.size() > 0) {
134                secondContent.getInternalBuffer().writeTo(out);
135            }
136            out.close();
137            if (deflater != null) {
138                deflater.end();
139            }
140        }
141        catch (Exception e) {
142            throw new BadPdfFormatException(e.getMessage());
143        }
144        put(PdfName.LENGTH, new PdfNumber(streamBytes.size()));
145        if (compressed)
146            put(PdfName.FILTER, PdfName.FLATEDECODE);
147    }
148}