001/*
002 * $Id: ImgWMF.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;
045
046import java.io.IOException;
047import java.io.InputStream;
048import java.net.MalformedURLException;
049import java.net.URL;
050import com.itextpdf.text.error_messages.MessageLocalization;
051
052import com.itextpdf.text.pdf.PdfTemplate;
053import com.itextpdf.text.pdf.codec.wmf.InputMeta;
054import com.itextpdf.text.pdf.codec.wmf.MetaDo;
055
056/**
057 * An <CODE>ImgWMF</CODE> is the representation of a windows metafile
058 * that has to be inserted into the document
059 *
060 * @see         Element
061 * @see         Image
062 */
063
064public class ImgWMF extends Image {
065    
066    // Constructors
067    
068    ImgWMF(Image image) {
069        super(image);
070    }
071    
072    /**
073     * Constructs an <CODE>ImgWMF</CODE>-object, using an <VAR>url</VAR>.
074     *
075     * @param url the <CODE>URL</CODE> where the image can be found
076     * @throws BadElementException on error
077     * @throws IOException on error
078     */
079    
080    public ImgWMF(URL url) throws BadElementException, IOException {
081        super(url);
082        processParameters();
083    }
084    
085    /**
086     * Constructs an <CODE>ImgWMF</CODE>-object, using a <VAR>filename</VAR>.
087     *
088     * @param filename a <CODE>String</CODE>-representation of the file that contains the image.
089     * @throws BadElementException on error
090     * @throws MalformedURLException on error
091     * @throws IOException on error
092     */
093    
094    public ImgWMF(String filename) throws BadElementException, MalformedURLException, IOException {
095        this(Utilities.toURL(filename));
096    }
097    
098    /**
099     * Constructs an <CODE>ImgWMF</CODE>-object from memory.
100     *
101     * @param img the memory image
102     * @throws BadElementException on error
103     * @throws IOException on error
104     */
105    
106    public ImgWMF(byte[] img) throws BadElementException, IOException {
107        super((URL)null);
108        rawData = img;
109        originalData = img;
110        processParameters();
111    }
112    
113/**
114 * This method checks if the image is a valid WMF and processes some parameters.
115 * @throws BadElementException
116 * @throws IOException
117 */
118    
119    private void processParameters() throws BadElementException, IOException {
120        type = IMGTEMPLATE;
121        originalType = ORIGINAL_WMF;
122        InputStream is = null;
123        try {
124            String errorID;
125            if (rawData == null){
126                is = url.openStream();
127                errorID = url.toString();
128            }
129            else{
130                is = new java.io.ByteArrayInputStream(rawData);
131                errorID = "Byte array";
132            }
133            InputMeta in = new InputMeta(is);
134            if (in.readInt() != 0x9AC6CDD7)     {
135                throw new BadElementException(MessageLocalization.getComposedMessage("1.is.not.a.valid.placeable.windows.metafile", errorID));
136            }
137            in.readWord();
138            int left = in.readShort();
139            int top = in.readShort();
140            int right = in.readShort();
141            int bottom = in.readShort();
142            int inch = in.readWord();
143            dpiX = 72;
144            dpiY = 72;
145            scaledHeight = (float)(bottom - top) / inch * 72f;
146            setTop(scaledHeight);
147            scaledWidth = (float)(right - left) / inch * 72f;
148            setRight(scaledWidth);
149        }
150        finally {
151            if (is != null) {
152                is.close();
153            }
154            plainWidth = getWidth();
155            plainHeight = getHeight();
156        }
157    }
158    
159    /** Reads the WMF into a template.
160     * @param template the template to read to
161     * @throws IOException on error
162     * @throws DocumentException on error
163     */    
164    public void readWMF(PdfTemplate template) throws IOException, DocumentException {
165        setTemplateData(template);
166        template.setWidth(getWidth());
167        template.setHeight(getHeight());
168        InputStream is = null;
169        try {
170            if (rawData == null){
171                is = url.openStream();
172            }
173            else{
174                is = new java.io.ByteArrayInputStream(rawData);
175            }
176            MetaDo meta = new MetaDo(is, template);
177            meta.readAll();
178        }
179        finally {
180            if (is != null) {
181                is.close();
182            }
183        }
184    }
185}