001: package org.objectweb.salome_tmf.tools.docbook2pdf;
002:
003: import java.awt.BorderLayout;
004: import java.awt.Container;
005: import java.awt.Cursor;
006: import java.awt.Dimension;
007: import java.awt.FlowLayout;
008: import java.awt.event.ActionEvent;
009: import java.awt.event.ActionListener;
010: import java.awt.event.WindowAdapter;
011: import java.awt.event.WindowEvent;
012: import java.io.BufferedOutputStream;
013: import java.io.BufferedReader;
014: import java.io.File;
015: import java.io.FileInputStream;
016: import java.io.FileOutputStream;
017: import java.io.IOException;
018: import java.io.InputStreamReader;
019: import java.io.OutputStream;
020: import java.io.StringReader;
021: import java.util.Locale;
022: import java.util.Properties;
023:
024: import javax.swing.Box;
025: import javax.swing.BoxLayout;
026: import javax.swing.JButton;
027: import javax.swing.JDialog;
028: import javax.swing.JFileChooser;
029: import javax.swing.JFrame;
030: import javax.swing.JLabel;
031: import javax.swing.JOptionPane;
032: import javax.swing.JPanel;
033: import javax.swing.JProgressBar;
034: import javax.swing.JTextField;
035: import javax.swing.border.TitledBorder;
036: import javax.xml.transform.OutputKeys;
037: import javax.xml.transform.Result;
038: import javax.xml.transform.Source;
039: import javax.xml.transform.Transformer;
040: import javax.xml.transform.TransformerFactory;
041: import javax.xml.transform.sax.SAXResult;
042: import javax.xml.transform.stream.StreamResult;
043: import javax.xml.transform.stream.StreamSource;
044:
045: import org.apache.fop.apps.FOPException;
046: import org.apache.fop.apps.FOUserAgent;
047: import org.apache.fop.apps.Fop;
048: import org.apache.fop.apps.FopFactory;
049: import org.apache.fop.apps.FormattingResults;
050: import org.apache.fop.apps.MimeConstants;
051: import org.objectweb.salome_tmf.tools.docbook2pdf.languages.Language;
052: import org.objectweb.salome_tmf.tools.docbook2pdf.utils.ScriptFileFilter;
053:
054: public class Docbook2Pdf extends JFrame {
055:
056: // configure fopFactory as desired
057: private FopFactory fopFactory = FopFactory.newInstance();
058: private final static String xsltFilePath = "resources/docbook-xsl-1.73.2/fo/docbook2Pdf.xsl";
059: private final static String languageCfgPath = "cfg/language.properties";
060:
061: public JTextField docbookTF;
062: public JTextField pdfTF;
063: public JProgressBar progress;
064:
065: public Thread transformProcess;
066: public boolean cancelled = false;
067:
068: private Locale locale;
069:
070: public Docbook2Pdf() {
071: super ("Docbook2Pdf Tool");
072:
073: Properties properties = new Properties();
074: try {
075: properties.load(new FileInputStream(languageCfgPath));
076: } catch (Exception e1) {
077: locale = new Locale(properties.getProperty("en"));
078: }
079:
080: locale = new Locale(properties.getProperty("language"));
081:
082: JLabel docbookLabel = new JLabel(Language.getInstance(locale)
083: .getText("Fichier_Docbook_:"));
084: docbookTF = new JTextField(30);
085: JButton docbookButton = new JButton(Language
086: .getInstance(locale).getText("Choisir..."));
087: docbookButton.addActionListener(new ActionListener() {
088: public void actionPerformed(ActionEvent e) {
089: JFileChooser fileChooser = new JFileChooser();
090: String docbookFilePath = "";
091: fileChooser
092: .addChoosableFileFilter(new ScriptFileFilter(
093: Language.getInstance(locale).getText(
094: "Fichier_Docbook_[*.xml]"),
095: ".xml"));
096: if (docbookTF.getText().length() != 0) {
097: fileChooser.setSelectedFile(new File(docbookTF
098: .getText()));
099: } else if (pdfTF.getText().length() != 0) {
100: String pdfPath = pdfTF.getText();
101: System.out.println(pdfPath.substring(0, pdfPath
102: .lastIndexOf(File.separator) + 1));
103: fileChooser.setSelectedFile(new File(pdfPath
104: .substring(0, pdfPath
105: .lastIndexOf(File.separator) + 1)
106: + "docbook.xml"));
107: }
108: int returnVal = fileChooser.showDialog(
109: Docbook2Pdf.this , Language.getInstance(locale)
110: .getText("Selectionner"));
111: if (returnVal == JFileChooser.APPROVE_OPTION) {
112: docbookFilePath = fileChooser.getSelectedFile()
113: .getAbsolutePath();
114: if (docbookFilePath.indexOf(".") != -1) {
115: if (!docbookFilePath.substring(
116: docbookFilePath.lastIndexOf("."))
117: .equals(".xml")) {
118: docbookFilePath += ".xml";
119: }
120: } else {
121: docbookFilePath += ".xml";
122: }
123: docbookTF.setText(docbookFilePath);
124: }
125: }
126: });
127:
128: JPanel docbookLabelPanel = new JPanel(new FlowLayout(
129: FlowLayout.LEFT));
130: docbookLabelPanel.add(docbookLabel);
131: JPanel docbookTFPanel = new JPanel(new FlowLayout(
132: FlowLayout.LEFT));
133: docbookTFPanel.add(docbookTF);
134: JPanel docbookButtonPanel = new JPanel(new FlowLayout(
135: FlowLayout.LEFT));
136: docbookButtonPanel.add(docbookButton);
137:
138: JPanel docbookPanel = new JPanel();
139: docbookPanel.setLayout(new BoxLayout(docbookPanel,
140: BoxLayout.Y_AXIS));
141: docbookPanel.setBorder(new TitledBorder(""));
142: docbookPanel.add(docbookLabelPanel);
143: docbookPanel.add(docbookTFPanel);
144: docbookPanel.add(docbookButtonPanel);
145:
146: JLabel pdfLabel = new JLabel(Language.getInstance(locale)
147: .getText("Fichier_PDF_:"));
148: pdfTF = new JTextField(30);
149: JButton pdfButton = new JButton(Language.getInstance(locale)
150: .getText("Choisir..."));
151: pdfButton.addActionListener(new ActionListener() {
152: public void actionPerformed(ActionEvent e) {
153: JFileChooser fileChooser = new JFileChooser();
154: String pdfFilePath = "";
155: fileChooser
156: .addChoosableFileFilter(new ScriptFileFilter(
157: Language.getInstance(locale).getText(
158: "Fichier_PDF_[*.pdf]"), ".pdf"));
159: if (pdfTF.getText().length() != 0) {
160: fileChooser.setSelectedFile(new File(pdfTF
161: .getText()));
162: } else if (docbookTF.getText().length() != 0) {
163: String docbookPath = docbookTF.getText();
164: fileChooser.setSelectedFile(new File(docbookPath
165: .substring(0, docbookPath
166: .lastIndexOf(File.separator))
167: + File.separator + "docbook.pdf"));
168: } else {
169: fileChooser
170: .setSelectedFile(new File("docbook.pdf"));
171: }
172: int returnVal = fileChooser.showDialog(
173: Docbook2Pdf.this , Language.getInstance(locale)
174: .getText("Selectionner"));
175: if (returnVal == JFileChooser.APPROVE_OPTION) {
176: pdfFilePath = fileChooser.getSelectedFile()
177: .getAbsolutePath();
178: if (pdfFilePath.indexOf(".") != -1) {
179: if (!pdfFilePath.substring(
180: pdfFilePath.lastIndexOf(".")).equals(
181: ".pdf")) {
182: pdfFilePath += ".pdf";
183: }
184: } else {
185: pdfFilePath += ".pdf";
186: }
187: pdfTF.setText(pdfFilePath);
188: }
189: }
190: });
191:
192: JPanel pdfLabelPanel = new JPanel(new FlowLayout(
193: FlowLayout.LEFT));
194: pdfLabelPanel.add(pdfLabel);
195: JPanel pdfTFPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
196: pdfTFPanel.add(pdfTF);
197: JPanel pdfButtonPanel = new JPanel(new FlowLayout(
198: FlowLayout.LEFT));
199: pdfButtonPanel.add(pdfButton);
200:
201: JPanel pdfPanel = new JPanel();
202: pdfPanel.setLayout(new BoxLayout(pdfPanel, BoxLayout.Y_AXIS));
203: pdfPanel.setBorder(new TitledBorder(""));
204: pdfPanel.add(pdfLabelPanel);
205: pdfPanel.add(pdfTFPanel);
206: pdfPanel.add(pdfButtonPanel);
207:
208: JPanel filesPanel = new JPanel();
209: filesPanel
210: .setLayout(new BoxLayout(filesPanel, BoxLayout.Y_AXIS));
211: filesPanel.add(docbookPanel);
212: filesPanel.add(pdfPanel);
213:
214: JButton transformButton = new JButton(Language.getInstance(
215: locale).getText("Transformer"));
216: transformButton.addActionListener(new ActionListener() {
217: public void actionPerformed(ActionEvent e) {
218: if (transformProcess != null
219: && transformProcess.isAlive()) {
220: return;
221: } else {
222: transformProcess = new Thread(
223: new TransformProcess());
224: transformProcess.start();
225: }
226: }
227: });
228: JButton cancelButton = new JButton(Language.getInstance(locale)
229: .getText("Annuler"));
230: cancelButton.addActionListener(new ActionListener() {
231: public void actionPerformed(ActionEvent e) {
232: cancelled = true;
233: Docbook2Pdf.this .dispose();
234: }
235: });
236:
237: JPanel buttonsPanel = new JPanel();
238: buttonsPanel.add(transformButton);
239: buttonsPanel.add(cancelButton);
240:
241: progress = new JProgressBar();
242: JPanel progression = new JPanel(new FlowLayout(
243: FlowLayout.CENTER));
244: progression.add(progress);
245:
246: JPanel commonPanel = new JPanel();
247: commonPanel.setLayout(new BoxLayout(commonPanel,
248: BoxLayout.Y_AXIS));
249: commonPanel.add(buttonsPanel);
250: commonPanel.add(Box.createRigidArea(new Dimension(1, 5)));
251: commonPanel.add(progression);
252:
253: Container contentPaneFrame = this .getContentPane();
254: contentPaneFrame.add(filesPanel, BorderLayout.CENTER);
255: contentPaneFrame.add(commonPanel, BorderLayout.SOUTH);
256:
257: setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
258: addWindowListener(new WindowAdapter() {
259: public void windowClosing(WindowEvent we) {
260: if (transformProcess != null
261: && transformProcess.isAlive()) {
262: return;
263: } else {
264: dispose();
265: }
266: }
267: });
268:
269: getRootPane().setDefaultButton(transformButton);
270: this .setLocation(400, 100);
271: this .pack();
272: this .setVisible(true);
273: }
274:
275: public class TransformProcess implements Runnable {
276:
277: public void run() {
278: String docbookFilePath = docbookTF.getText();
279: String pdfFilePath = pdfTF.getText();
280: if (docbookFilePath.length() == 0) {
281: JOptionPane
282: .showMessageDialog(
283: Docbook2Pdf.this ,
284: Language
285: .getInstance(locale)
286: .getText(
287: "Vous_devez_entrer_un_nom_de_fichier_Docbook"),
288: Language.getInstance(locale).getText(
289: "Erreur_!"),
290: JOptionPane.ERROR_MESSAGE);
291: } else if (pdfFilePath.length() == 0) {
292: JOptionPane
293: .showMessageDialog(
294: Docbook2Pdf.this ,
295: Language
296: .getInstance(locale)
297: .getText(
298: "Vous_devez_entrer_un_nom_de_fichier_PDF"),
299: Language.getInstance(locale).getText(
300: "Erreur_!"),
301: JOptionPane.ERROR_MESSAGE);
302: } else {
303: File docbookFile = new File(docbookFilePath);
304: if (!docbookFile.exists()) {
305: JOptionPane
306: .showMessageDialog(
307: Docbook2Pdf.this ,
308: Language
309: .getInstance(locale)
310: .getText(
311: "Vous_devez_entrer_le_nom_d_un_fichier_Docbook_existant"),
312: Language.getInstance(locale)
313: .getText("Erreur_!"),
314: JOptionPane.ERROR_MESSAGE);
315: } else {
316: File pdfFile = new File(pdfFilePath);
317: try {
318: setCursor(Cursor
319: .getPredefinedCursor(Cursor.WAIT_CURSOR));
320: progress.setIndeterminate(true);
321: transform(docbookFile, pdfFile);
322: progress.setVisible(false);
323: setCursor(Cursor
324: .getPredefinedCursor(Cursor.DEFAULT_CURSOR));
325: if (!cancelled) {
326: JOptionPane
327: .showMessageDialog(
328: Docbook2Pdf.this ,
329: Language
330: .getInstance(locale)
331: .getText(
332: "Le_fichier_PDF_a_ete_genere_avec_succes"),
333: Language
334: .getInstance(locale)
335: .getText(
336: "Information..."),
337: JOptionPane.INFORMATION_MESSAGE);
338: }
339: Docbook2Pdf.this .dispose();
340: } catch (Exception e1) {
341: progress.setVisible(false);
342: setCursor(Cursor
343: .getPredefinedCursor(Cursor.DEFAULT_CURSOR));
344: JOptionPane
345: .showMessageDialog(
346: Docbook2Pdf.this ,
347: Language
348: .getInstance(locale)
349: .getText(
350: "Erreur_lors_de_la_creation_du_fichier_pdf,_pour_plus_de_details_voir_la_console_java"),
351: Language.getInstance(locale)
352: .getText("Erreur_!"),
353: JOptionPane.ERROR_MESSAGE);
354: e1.printStackTrace();
355: }
356: }
357: }
358: }
359:
360: }
361:
362: public void transform(File docbookFile, File pdfFile)
363: throws Exception {
364: File temporaryFoFile = File.createTempFile("docbook", ".fo");
365: temporaryFoFile.deleteOnExit();
366: transformDocbook2Fo(docbookFile, temporaryFoFile);
367: transformFo2Pdf(temporaryFoFile, pdfFile);
368: }
369:
370: private void transformDocbook2Fo(File docbookFile,
371: File temporaryFoFile) throws Exception {
372: //to use Saxon XSLT processor
373: System.setProperty("javax.xml.transform.TransformerFactory",
374: "net.sf.saxon.TransformerFactoryImpl");
375:
376: File xsltFile = new File(xsltFilePath);
377: StreamSource styleSource = new StreamSource(xsltFile);
378: TransformerFactory factory = TransformerFactory.newInstance();
379: factory.setAttribute(net.sf.saxon.FeatureKeys.DTD_VALIDATION,
380: new Boolean(false));
381: Transformer x = factory.newTransformer(styleSource);
382: x.setOutputProperty(OutputKeys.INDENT, "yes");
383: x.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
384:
385: String docbookString = readFileAsString(docbookFile, "UTF-8");
386: docbookString = docbookString.substring(0, docbookString
387: .indexOf("<!DOCTYPE"))
388: + docbookString.substring(docbookString
389: .indexOf("<article"));
390: Source source = new StreamSource(
391: new StringReader(docbookString));
392: FileOutputStream tempFoOutputStream = new FileOutputStream(
393: temporaryFoFile);
394: Result target = new StreamResult(tempFoOutputStream);
395: x.transform(source, target);
396: tempFoOutputStream.close();
397: }
398:
399: private String readFileAsString(File file, String encoding)
400: throws java.io.IOException {
401: StringBuffer fileData = new StringBuffer(1000);
402: BufferedReader reader = new BufferedReader(
403: new InputStreamReader(new FileInputStream(file),
404: encoding));
405: char[] buf = new char[1024];
406: int numRead = 0;
407: while ((numRead = reader.read(buf)) != -1) {
408: String readData = String.valueOf(buf, 0, numRead);
409: fileData.append(readData);
410: buf = new char[1024];
411: }
412: reader.close();
413: return fileData.toString();
414: }
415:
416: /**
417: * Converts an FO file to a PDF file using FOP
418: * @param fo the FO file
419: * @param pdf the target PDF file
420: * @throws IOException In case of an I/O problem
421: * @throws FOPException In case of a FOP problem
422: */
423: private void transformFo2Pdf(File temporaryFoFile, File pdfFile)
424: throws Exception {
425: OutputStream out = null;
426:
427: FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
428: // configure foUserAgent as desired
429:
430: // Setup output stream. Note: Using BufferedOutputStream
431: // for performance reasons (helpful with FileOutputStreams).
432: out = new FileOutputStream(pdfFile);
433: out = new BufferedOutputStream(out);
434:
435: // Construct fop with desired output format
436: Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,
437: foUserAgent, out);
438:
439: // Setup JAXP using identity transformer
440: TransformerFactory factory = TransformerFactory.newInstance();
441: Transformer transformer = factory.newTransformer(); // identity transformer
442:
443: // Setup input stream
444: Source src = new StreamSource(temporaryFoFile);
445:
446: // Resulting SAX events (the generated FO) must be piped through to FOP
447: Result res = new SAXResult(fop.getDefaultHandler());
448:
449: // Start XSLT transformation and FOP processing
450: transformer.transform(src, res);
451:
452: // Result processing
453: FormattingResults foResults = fop.getResults();
454: System.out.println("Generated " + foResults.getPageCount()
455: + " pages in total.");
456: out.close();
457: }
458:
459: public static void main(String[] argv) {
460: new Docbook2Pdf();
461: }
462: }
|