KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > BookMaker


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17
18 /* $Id: BookMaker.java 426576 2006-07-28 15:44:37Z jeremias $ */
19
20 // Derived from examples/embedding/java/embedding/ExampleXML2PDF.java
21
// in FOP-0.20.5
22

23 //Java
24
import java.io.File JavaDoc;
25 import java.io.IOException JavaDoc;
26 import java.io.OutputStream JavaDoc;
27 import java.io.FileInputStream JavaDoc;
28 import java.io.FileOutputStream JavaDoc;
29
30 import java.util.Vector JavaDoc;
31
32 //JAXP
33
import javax.xml.transform.Transformer JavaDoc;
34 import javax.xml.transform.TransformerFactory JavaDoc;
35 import javax.xml.transform.TransformerException JavaDoc;
36 import javax.xml.transform.Source JavaDoc;
37 import javax.xml.transform.Result JavaDoc;
38 import javax.xml.transform.stream.StreamSource JavaDoc;
39 import javax.xml.transform.stream.StreamResult JavaDoc;
40 import javax.xml.transform.sax.SAXSource JavaDoc;
41 import javax.xml.transform.sax.SAXResult JavaDoc;
42
43 import javax.xml.parsers.SAXParserFactory JavaDoc;
44 import javax.xml.parsers.FactoryConfigurationError JavaDoc;
45 import javax.xml.parsers.SAXParser JavaDoc;
46 import javax.xml.parsers.ParserConfigurationException JavaDoc;
47
48 // SAX
49
import org.xml.sax.InputSource JavaDoc;
50 import org.xml.sax.XMLReader JavaDoc;
51 import org.xml.sax.SAXException JavaDoc;
52 import org.xml.sax.SAXParseException JavaDoc;
53 import org.xml.sax.ErrorHandler JavaDoc;
54
55 // XML Commons
56
import org.apache.xml.resolver.tools.CatalogResolver;
57
58 import org.apache.commons.cli.Options;
59 import org.apache.commons.cli.Option;
60 import org.apache.commons.cli.OptionGroup;
61 import org.apache.commons.cli.CommandLine;
62 import org.apache.commons.cli.HelpFormatter;
63 import org.apache.commons.cli.Parser;
64 import org.apache.commons.cli.GnuParser;
65 import org.apache.commons.cli.ParseException;
66
67 //Avalon
68
import org.apache.avalon.framework.ExceptionUtil;
69 import org.apache.avalon.framework.logger.ConsoleLogger;
70 import org.apache.avalon.framework.logger.Logger;
71
72 //FOP
73
import org.apache.fop.apps.Driver;
74 import org.apache.fop.apps.FOPException;
75 import org.apache.fop.messaging.MessageHandler;
76
77 /**
78  * This class converts an XML file to PDF using
79  * JAXP (XSLT) and FOP (XSL:FO).
80  */

81 public class BookMaker implements ErrorHandler JavaDoc {
82
83     private Logger logger;
84
85     private File JavaDoc xmlFile, xsltFile, outFile, pdfFile;
86     private boolean useCatalog;
87     private Vector JavaDoc xsltParams = null;
88
89     public BookMaker() {
90         //Setup logger
91
logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);
92     }
93
94     /**
95      * org.xml.sax.ErrorHandler#warning
96      **/

97     public void warning(SAXParseException JavaDoc e) {
98         logger.warn(e.toString());
99     }
100
101     /**
102      * org.xml.sax.ErrorHandler#error
103      **/

104     public void error(SAXParseException JavaDoc e) {
105         logger.error(e.toString());
106     }
107
108     /**
109      * org.xml.sax.ErrorHandler#fatalError
110      **/

111     public void fatalError(SAXParseException JavaDoc e) throws SAXException JavaDoc {
112         logger.error(e.toString());
113         throw e;
114     }
115
116     public void makeBook()
117                 throws IOException JavaDoc, FOPException, TransformerException JavaDoc,
118                        FactoryConfigurationError JavaDoc,
119                        ParserConfigurationException JavaDoc, SAXException JavaDoc {
120
121         OutputStream JavaDoc out = null;
122
123         try {
124
125             Source JavaDoc xmlSource, xsltSource;
126             Result JavaDoc result;
127             CatalogResolver resolver = null;
128
129             // Setup entity and URI resolver
130
if (useCatalog) {
131                 resolver = new CatalogResolver();
132                 logger.info("Using " + resolver.getClass().getName()
133                             + " as entity/URI resolver");
134             }
135
136             //Setup XSLT transformer
137
TransformerFactory JavaDoc tFactory = TransformerFactory.newInstance();
138             if (useCatalog) {
139                 tFactory.setURIResolver(resolver);
140             }
141
142             //Setup input and xslt sources
143
if (useCatalog) {
144
145                 SAXParser JavaDoc parser;
146                 XMLReader JavaDoc xmlReader;
147                 FileInputStream JavaDoc fis;
148                 InputSource JavaDoc is;
149
150                 // throws FactoryConfigurationError
151
SAXParserFactory JavaDoc sFactory = SAXParserFactory.newInstance();
152                 sFactory.setNamespaceAware(true);
153
154                 // Setup input source
155
// throws ParserConfigurationException
156
parser = sFactory.newSAXParser();
157                 // throws SAXException
158
xmlReader = parser.getXMLReader();
159                 logger.info("Using " + xmlReader.getClass().getName()
160                             + " as SAX parser");
161                 xmlReader.setErrorHandler(this);
162                 xmlReader.setEntityResolver(resolver);
163         
164                 // Setup SAX source
165
fis = new FileInputStream JavaDoc(xmlFile);
166                 is = new InputSource JavaDoc(fis);
167                 xmlSource = new SAXSource JavaDoc(xmlReader, is);
168
169                 // Setup xslt source
170
// throws ParserConfigurationException
171
parser = sFactory.newSAXParser();
172                 // throws SAXException
173
xmlReader = parser.getXMLReader();
174                 logger.info("Using " + xmlReader.getClass().getName()
175                             + " as SAX parser");
176                 xmlReader.setErrorHandler(this);
177                 xmlReader.setEntityResolver(resolver);
178         
179                 // Setup SAX source
180
fis = new FileInputStream JavaDoc(xsltFile);
181                 is = new InputSource JavaDoc(fis);
182                 xsltSource = new SAXSource JavaDoc(xmlReader, is);
183
184             } else {
185                 xmlSource = new StreamSource JavaDoc(xmlFile);
186                 xsltSource = new StreamSource JavaDoc(xsltFile);
187             }
188
189             // Setup output result
190
if (pdfFile != null) {
191                 //Setup FOP
192
MessageHandler.setScreenLogger(logger);
193                 Driver driver = new Driver();
194                 driver.setLogger(logger);
195                 driver.setRenderer(Driver.RENDER_PDF);
196                 out = new FileOutputStream JavaDoc(pdfFile);
197                 driver.setOutputStream(out);
198                 //Resulting SAX events (the generated FO)
199
// must be piped through to FOP
200
result = new SAXResult JavaDoc(driver.getContentHandler());
201             } else {
202                 out = new FileOutputStream JavaDoc(outFile);
203                 result = new StreamResult JavaDoc(out);
204             }
205
206             // Setup the transformer
207
Transformer JavaDoc transformer
208                 = tFactory.newTransformer(xsltSource);
209             logger.info("Using " + transformer.getClass().getName()
210                         + " as TrAX transformer");
211
212             // Set the value of parameters, if any, defined for stylesheet
213
if (xsltParams != null) {
214                 for (int i = 0; i < xsltParams.size(); i += 2) {
215                     transformer.setParameter
216                         ((String JavaDoc) xsltParams.elementAt(i),
217                          (String JavaDoc) xsltParams.elementAt(i + 1));
218                 }
219             }
220
221             //Start XSLT transformation and FOP processing
222
transformer.transform(xmlSource, result);
223
224         } finally {
225             if (out != null) {
226                 out.close();
227             }
228         }
229     }
230
231     private static Options createOptions() {
232
233         Options options = new Options();
234         OptionGroup og;
235         Option o;
236
237         o = new Option("h", "help", false, "Print help");
238         options.addOption(o);
239
240         o = new Option("c", "useCatalog", false, "Use catalog");
241         options.addOption(o);
242
243         o = new Option("xml", "xmlFile", true, "XML input file");
244         o.setArgName("file");
245         options.addOption(o);
246
247         o = new Option("xsl", "xslFile", true, "XSLT stylesheet");
248         o.setArgName("file");
249         options.addOption(o);
250
251         // mutually exclusive output options
252
og = new OptionGroup();
253         o = new Option("out", "outFile", true, "(X)HTML/FO output file");
254         o.setArgName("file");
255         og.addOption(o);
256
257         o = new Option("pdf", "pdfFile", true, "PDF output file");
258         o.setArgName("file");
259         og.addOption(o);
260
261         options.addOptionGroup(og);
262
263         o = new Option("p", "parameter", true,
264                        "Parameter for the XSLT transformation");
265         o.setArgs(2);
266         o.setArgName("name value");
267         options.addOption(o);
268
269         return options;
270     }
271
272     public static void main(String JavaDoc[] args) {
273
274         BookMaker app = new BookMaker();
275
276         try {
277
278             // Setup options
279
Options options = createOptions();
280
281             // Parse command line
282
// GNU parser allow multi-letter short options
283
Parser JavaDoc parser = new GnuParser();
284             CommandLine cl = null;
285             cl = parser.parse(options, args);
286             if (cl.hasOption("h")) {
287                 // automatically generate the help statement
288
HelpFormatter formatter = new HelpFormatter();
289                 formatter.printHelp("BookMaker", options);
290                 System.exit(0);
291             }
292
293             //Setup input and output files and parameters
294
if (cl.hasOption("c")) {
295                 app.useCatalog = true;
296             }
297             if (cl.hasOption("xml")) {
298                 app.xmlFile = new File JavaDoc(cl.getOptionValue("xml"));
299             }
300             if (cl.hasOption("xsl")) {
301                 app.xsltFile = new File JavaDoc(cl.getOptionValue("xsl"));
302             }
303             if (cl.hasOption("out")) {
304                 app.outFile = new File JavaDoc(cl.getOptionValue("out"));
305             }
306             if (cl.hasOption("pdf")) {
307                 app.pdfFile = new File JavaDoc(cl.getOptionValue("pdf"));
308             }
309             if (cl.hasOption("p")) {
310                 String JavaDoc[] params = cl.getOptionValues("p");
311                 app.xsltParams = new Vector JavaDoc();
312                 for (int i = 0; i < params.length; ++i) {
313                     app.xsltParams.addElement(params[i]);
314                 }
315             }
316
317             app.logger.info("Input: XML (" + app.xmlFile + ")");
318             app.logger.info("Stylesheet: " + app.xsltFile);
319             if (app.pdfFile != null) {
320                 app.logger.info("Output: PDF (" + app.pdfFile + ")");
321             } else {
322                 app.logger.info("Output: (X)HTML/FO (" + app.outFile + ")");
323             }
324             app.logger.info("");
325             app.logger.info("Transforming...");
326             
327             app.makeBook();
328             
329             app.logger.info("Transforming done");
330         } catch (Exception JavaDoc e) {
331             app.logger.error(ExceptionUtil.printStackTrace(e));
332             System.exit(1);
333         }
334     }
335 }
336
Popular Tags