1 /*
2  * $Id$
3  *
4  * Copyright 2003, 2004 by Mark Hall
5  *
6  * The contents of this file are subject to the Mozilla Public License Version 1.1
7  * (the "License"); you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at http://www.mozilla.org/MPL/
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the License.
13  *
14  * The Original Code is 'iText, a free JAVA-PDF library'.
15  *
16  * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
17  * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
18  * All Rights Reserved.
19  * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
20  * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
21  *
22  * Contributor(s): all the names of the contributors are added in the source code
23  * where applicable.
24  *
25  * Alternatively, the contents of this file may be used under the terms of the
26  * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
27  * provisions of LGPL are applicable instead of those above.  If you wish to
28  * allow use of your version of this file only under the terms of the LGPL
29  * License and not to allow others to use your version of this file under
30  * the MPL, indicate your decision by deleting the provisions above and
31  * replace them with the notice and other provisions required by the LGPL.
32  * If you do not delete the provisions above, a recipient may use your version
33  * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
34  *
35  * This library is free software; you can redistribute it and/or modify it
36  * under the terms of the MPL as stated above or under the terms of the GNU
37  * Library General Public License as published by the Free Software Foundation;
38  * either version 2 of the License, or any later version.
39  *
40  * This library is distributed in the hope that it will be useful, but WITHOUT
41  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
42  * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
43  * details.
44  *
45  * If you didn't download this code from the following link, you should check if
46  * you aren't using an obsolete version:
47  * http://www.lowagie.com/iText/
48  */
49 
50 package com.lowagie.text.rtf.document;
51 
52 import java.io.IOException;
53 import java.io.OutputStream;
54 import java.text.ParseException;
55 import java.text.SimpleDateFormat;
56 import java.util.Date;
57 
58 import com.lowagie.text.DocWriter;
59 import com.lowagie.text.Meta;
60 import com.lowagie.text.rtf.RtfElement;
61 
62 
63 /**
64  * Stores one information group element. Valid elements are
65  * author, title, subject, keywords, producer and creationdate.
66  *
67  * @version $Id$
68  * @author Mark Hall (Mark.Hall@mail.room3b.eu)
69  * @author Thomas Bickel (tmb99@inode.at)
70  */
71 public class RtfInfoElement extends RtfElement {
72 
73     /**
74      * Constant for the author element
75      */
76     private static final byte[] INFO_AUTHOR = DocWriter.getISOBytes("\\author");
77     /**
78      * Constant for the subject element
79      */
80     private static final byte[] INFO_SUBJECT = DocWriter.getISOBytes("\\subject");
81     /**
82      * Constant for the keywords element
83      */
84     private static final byte[] INFO_KEYWORDS = DocWriter.getISOBytes("\\keywords");
85     /**
86      * Constant for the title element
87      */
88     private static final byte[] INFO_TITLE = DocWriter.getISOBytes("\\title");
89     /**
90      * Constant for the producer element
91      */
92     private static final byte[] INFO_PRODUCER = DocWriter.getISOBytes("\\operator");
93     /**
94      * Constant for the creationdate element
95      */
96     private static final byte[] INFO_CREATION_DATE =DocWriter.getISOBytes( "\\creationdate");
97 
98     /**
99      * The type of this RtfInfoElement. The values from Element.INFO_ELEMENT_NAME are used.
100      */
101     private int infoType = -1;
102     /**
103      * The content of this RtfInfoElement
104      */
105     private String content = "";
106 
107     /**
108      * Constructs a RtfInfoElement based on the given Meta object
109      *
110      * @param doc The RtfDocument this RtfInfoElement belongs to
111      * @param meta The Meta object this RtfInfoElement is based on
112      */
RtfInfoElement(RtfDocument doc, Meta meta)113     public RtfInfoElement(RtfDocument doc, Meta meta) {
114         super(doc);
115         infoType = meta.type();
116         content = meta.getContent();
117     }
118 
119     /**
120      * Writes the content of one RTF information element.
121      */
writeContent(final OutputStream result)122     public void writeContent(final OutputStream result) throws IOException
123     {
124         result.write(OPEN_GROUP);
125         switch(infoType) {
126             case Meta.AUTHOR:
127                 result.write(INFO_AUTHOR);
128             	break;
129             case Meta.SUBJECT:
130                 result.write(INFO_SUBJECT);
131         		break;
132             case Meta.KEYWORDS:
133                 result.write(INFO_KEYWORDS);
134         		break;
135             case Meta.TITLE:
136                 result.write(INFO_TITLE);
137         		break;
138             case Meta.PRODUCER:
139                 result.write(INFO_PRODUCER);
140         		break;
141             case Meta.CREATIONDATE:
142                 result.write(INFO_CREATION_DATE);
143             	break;
144             default:
145                 result.write(INFO_AUTHOR);
146             	break;
147         }
148         result.write(DELIMITER);
149         if(infoType == Meta.CREATIONDATE) {
150             result.write(DocWriter.getISOBytes(convertDate(content)));
151         } else {
152             document.filterSpecialChar(result, content, false, false);
153         }
154         result.write(CLOSE_GROUP);
155     }
156 
157     /**
158      * Converts a date from the format used by iText to the format required by
159      * rtf.<br>iText: EEE MMM dd HH:mm:ss zzz yyyy - rtf: \\'yr'yyyy\\'mo'MM\\'dy'dd\\'hr'HH\\'min'mm\\'sec'ss
160      *
161      * @param date The date formated by iText
162      * @return The date formated for rtf
163      */
convertDate(String date)164     private String convertDate(String date) {
165         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
166         try {
167             Date creationDate = sdf.parse(date);
168             sdf = new SimpleDateFormat("\\'yr'yyyy\\'mo'MM\\'dy'dd\\'hr'HH\\'min'mm\\'sec'ss");
169             return sdf.format(creationDate);
170         } catch(ParseException pe) {
171             pe.printStackTrace();
172             return "";
173         }
174     }
175 }
176