merged tag ooo/DEV300_m102
[LibreOffice.git] / qadevOOo / runner / graphical / MSOfficePostscriptCreator.java
blob86eb28143ed2bde21da55ffced37629f00321554
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
28 package graphical;
30 import java.io.File;
31 import java.io.FileWriter;
32 import java.io.RandomAccessFile;
33 import helper.ProcessHandler;
34 import java.util.ArrayList;
35 import helper.OSHelper;
36 import javax.xml.parsers.DocumentBuilder;
37 import javax.xml.parsers.DocumentBuilderFactory;
38 import org.w3c.dom.Document;
39 import org.w3c.dom.Node;
41 /**
42 * This object gives all functionallity to print msoffice documents.
43 * It also offers functions to check what type of document it is.
44 * It handles *.doc as word documents and use word to print
45 * *.xls as excel
46 * *.ppt as powerpoint
49 //class ProcessHelper
50 //{
51 // ArrayList m_aArray;
52 //}
54 public class MSOfficePostscriptCreator implements IOffice
56 private String m_sPrinterName; // within Windows the tools need a printer name;
58 public void setPrinterName(String _s)
60 m_sPrinterName = _s;
63 private ParameterHelper m_aParameterHelper;
64 private String m_sDocumentName;
65 private String m_sResult;
67 // CTor
68 public MSOfficePostscriptCreator(ParameterHelper _aParam, String _sResult)
70 m_aParameterHelper = _aParam;
71 m_sResult = _sResult;
72 // String sKillCommand = (String)_aParam.getTestParameters().get(util.PropertyName.APP_KILL_COMMAND);
73 // if (sKillCommand == null)
74 // {
75 // sKillCommand = "";
76 // }
77 // if (sKillCommand.length() > 0)
78 // {
79 // sKillCommand += ";";
80 // }
81 String sKillCommand = "C:/bin/kill.exe -9 winword;C:/bin/kill.exe -9 excel";
82 _aParam.getTestParameters().put(util.PropertyName.APP_KILL_COMMAND, sKillCommand);
85 public void load(String _sDocumentName) throws OfficeException
87 m_sDocumentName = _sDocumentName;
89 if (! isMSOfficeDocumentFormat(m_sDocumentName))
91 GlobalLogWriter.println("This document type is not recognized as MSOffice format, as default fallback StarOffice/OpenOffice.org instead is used.");
92 throw new OfficeException("This document type is not recognized as MSOffice format, as default fallback StarOffice/OpenOffice.org instead is used.");
96 public void storeAsPostscript() throws OfficeException
98 GlobalLogWriter.println("USE MSOFFICE AS EXPORT FORMAT.");
99 try
101 String sDocumentName = m_sDocumentName + ".ps";
102 printToFileWithMSOffice(m_aParameterHelper,
103 m_sDocumentName,
104 m_sResult);
105 File aFile = new File(sDocumentName);
106 if (aFile.exists())
108 String sBasename = FileHelper.getBasename(sDocumentName);
109 FileHelper.addBasenameToIndex(m_sResult, sBasename, "msoffice", "postscript", m_sDocumentName);
112 catch(OfficeException e)
114 e.printStackTrace();
115 GlobalLogWriter.println(e.getMessage());
116 throw new OfficeException("Exception caught. Problem with MSOffice printer methods.");
118 catch(java.io.IOException e)
120 GlobalLogWriter.println(e.getMessage());
121 throw new OfficeException("IOException caught. Problem with MSOffice printer methods.");
125 public void start() throws OfficeException
127 // we don't have an office to start
130 public void close() throws OfficeException
132 // we don't have an office to stop
135 // -----------------------------------------------------------------------------
136 private boolean isWordDocument(String _sSuffix)
138 if (_sSuffix.toLowerCase().endsWith(".doc") ||
139 _sSuffix.toLowerCase().endsWith(".rtf") ||
140 _sSuffix.toLowerCase().endsWith(".dot"))
142 return true;
144 return false;
147 private boolean isExcelDocument(String _sSuffix)
149 // xlt templates
150 // xlw
151 // xla addin
152 if (_sSuffix.toLowerCase().endsWith(".xls"))
154 return true;
156 /* temporal insertion by SUS
157 if (_sSuffix.endsWith(".xml"))
159 return true;
161 return false;
164 private boolean isPowerPointDocument(String _sSuffix)
166 if (_sSuffix.toLowerCase().endsWith(".pps") ||
167 _sSuffix.toLowerCase().endsWith(".ppt"))
169 return true;
171 return false;
175 * returns true, if the given filename has a MS Office suffix.
177 private boolean isMSOfficeDocumentFormat(String _sFile)
179 String sDocumentSuffix = FileHelper.getSuffix(_sFile);
180 if (isWordDocument(sDocumentSuffix)) {return true;}
181 if (isExcelDocument(sDocumentSuffix)) {return true;}
182 if (isPowerPointDocument(sDocumentSuffix)) {return true;}
183 // if suffix is xml, return also true, but we can't decide if word or excel
184 if (sDocumentSuffix.toLowerCase().endsWith(".xml")) {return true;}
185 return false;
188 public void storeToFileWithMSOffice( ParameterHelper _aGTA,
189 String _sInputFile,
190 String _sOutputFile) throws OfficeException, java.io.IOException
192 String sDocumentSuffix = FileHelper.getSuffix(_sInputFile);
193 String sFilterName = _aGTA.getExportFilterName();
194 ArrayList<String> aStartCommand = new ArrayList<String>();
195 if (isWordDocument(sDocumentSuffix))
197 aStartCommand = createWordStoreHelper();
199 else if (isExcelDocument(sDocumentSuffix))
201 aStartCommand = createExcelStoreHelper();
203 else if (isPowerPointDocument(sDocumentSuffix))
206 else if (sDocumentSuffix.toLowerCase().equals(".xml"))
208 // special case, if xml we prefer word, but with DEFAULT_XML_FORMAT_APP=excel it's changeable.
209 String sDocFormat = getXMLDocumentFormat(_sInputFile);
210 // if (_aGTA.getDefaultXMLFormatApp().toLowerCase().equals("excel"))
211 if (sDocFormat.equals("excel"))
213 aStartCommand = createExcelStoreHelper();
215 else
217 aStartCommand = createWordStoreHelper();
219 // else
220 // {
221 // }
223 else
225 GlobalLogWriter.println("No Microsoft Office document format found.");
227 throw new WrongSuffixException("No MS office document format found.");
229 if (aStartCommand != null)
231 if (sFilterName == null)
233 // TODO: hardcoded FilterName in perl script
234 sFilterName = ""; // xlXMLSpreadsheet";
237 // String sCommand = sStartCommand + " " +
238 // _sInputFile + " " +
239 // StringHelper.doubleQuote(sFilterName) + " " +
240 // _sOutputFile;
242 aStartCommand.add(_sInputFile);
243 aStartCommand.add(sFilterName);
244 aStartCommand.add(_sOutputFile);
245 realStartCommand(aStartCommand);
249 // -----------------------------------------------------------------------------
251 * print the given file (_sInputFile) to the file name (_sPrintFile)
252 * @param _aGTA
253 * @param _sInputFile
254 * @param _sPrintFilename
255 * @throws OfficeException
256 * @throws java.io.IOException
258 public void printToFileWithMSOffice( ParameterHelper _aGTA,
259 String _sInputFile,
260 String _sPrintFilename) throws OfficeException, java.io.IOException
262 String sDocumentSuffix = FileHelper.getSuffix(_sInputFile);
264 setPrinterName(_aGTA.getPrinterName());
266 ArrayList<String> aStartCommand = new ArrayList<String>();
267 if (isWordDocument(sDocumentSuffix))
269 aStartCommand = createWordPrintHelper();
271 else if (isExcelDocument(sDocumentSuffix))
273 aStartCommand = createExcelPrintHelper();
275 else if (isPowerPointDocument(sDocumentSuffix))
277 aStartCommand = createPowerPointPrintHelper();
279 else if (sDocumentSuffix.toLowerCase().equals(".xml"))
281 // TODO: Open XML File and check if we need excel or word
282 String sOfficeType = getOfficeType(_sInputFile);
284 // special case, if xml we prefer word, but with DEFAULT_XML_FORMAT_APP=excel it's changeable.
285 // if (_aGTA.getDefaultXMLFormatApp().toLowerCase().equals("excel"))
286 if (sOfficeType.equals("excel"))
288 aStartCommand = createExcelPrintHelper();
290 else if (sOfficeType.equals("word"))
292 aStartCommand = createWordPrintHelper();
294 else
296 return;
299 else
301 GlobalLogWriter.println("No Microsoft Office document format found.");
302 // TODO: use a better Exception!!!
303 throw new WrongSuffixException("No Mircosoft Office document format found.");
306 if (aStartCommand.isEmpty() == false)
308 String sPrinterName = m_sPrinterName;
309 if (sPrinterName == null)
311 sPrinterName = "";
314 // String sCommand = sStartCommand + " " +
315 // _sInputFile + " " +
316 // StringHelper.doubleQuote(m_sPrinterName) + " " +
317 // _sPrintFilename;
318 aStartCommand.add(_sInputFile);
319 aStartCommand.add(m_sPrinterName);
320 aStartCommand.add(_sPrintFilename);
322 realStartCommand(aStartCommand);
324 String sUserDir = System.getProperty("user.home");
325 _aGTA.getPerformance().readWordValuesFromFile(FileHelper.appendPath(sUserDir, "msofficeloadtimes.txt"));
326 FileHelper.createInfoFile(_sPrintFilename, _aGTA, "msoffice");
327 TimeHelper.waitInSeconds(2, "Give Microsoft Office some time to print.");
330 public void realStartCommand(ArrayList _aStartCommand) throws OfficeException
332 if (_aStartCommand.isEmpty())
334 throw new OfficeException/*WrongEnvironmentException*/("Given list is empty.");
339 // Convert the StartCommand ArrayList to a String List
340 int nValues = _aStartCommand.size();
341 String[] aList = new String[nValues];
342 for (int i=0;i<nValues;i++)
344 String aStr = (String) _aStartCommand.get(i);
345 if (aStr == null)
347 aStr = "";
349 if (aStr.length() == 0)
351 aStr = "\"\"";
353 aList[i] = new String(aStr);
356 // This is really the latest point where we can check if we are running within windows environment
357 if (! OSHelper.isWindows())
359 // TODO: use a better Exception!!!
360 throw new WrongEnvironmentException("We doesn't work within windows environment.");
364 ProcessHandler aHandler = new ProcessHandler(aList);
365 boolean bBackValue = aHandler.executeSynchronously();
367 catch (IndexOutOfBoundsException e)
369 throw new WrongEnvironmentException("Given list is too short.");
372 // return aHandler.getExitCode();
376 private String getPerlExe()
378 final String sPerlExe = System.getProperty("perl.exe", "perl");
379 return sPerlExe;
382 ArrayList<String> createWordPrintHelper() throws java.io.IOException
384 // create a program in tmp file
385 String sTmpPath = util.utils.getUsersTempDir();
386 String ls = System.getProperty("line.separator");
388 String sPrintViaWord = "printViaWord.pl";
390 ArrayList<String> aList = searchLocalFile(sPrintViaWord);
391 if (aList.isEmpty() == false)
393 return aList;
396 String sFileName = FileHelper.appendPath(sTmpPath, sPrintViaWord);
397 File aFile = new File(sFileName);
398 FileWriter out = new FileWriter(aFile);
401 out.write( "eval 'exec perl -wS $0 ${1+\"$@\"}' " + ls );
402 out.write( " if 0; " + ls );
403 out.write( "use strict; " + ls );
404 out.write( "use Time::HiRes; " + ls );
405 out.write( "if ( $^O ne \"MSWin32\") " + ls );
406 out.write( "{ " + ls );
407 out.write( " print 'Windows only.\\n'; " + ls );
408 out.write( " print_usage(); " + ls );
409 out.write( " exit(1); " + ls );
410 out.write( "} " + ls );
411 out.write( " " + ls );
412 out.write( "use Win32::OLE; " + ls );
413 out.write( "use Win32::OLE::Const 'Microsoft Word'; " + ls );
414 out.write( " " + ls );
415 out.write( "# ------ usage ------ " + ls );
416 out.write( "sub print_usage() " + ls );
417 out.write( "{ " + ls );
418 out.write( " print STDERR \"Usage: word_print.pl <Word file> <name of printer> <output file> .\\n " + ls );
419 out.write( " Please use the same string for the name of the printer as you can find \\n " + ls );
420 out.write( " under Start-Control Panel-Printer and Faxes \\n " + ls );
421 out.write( " The name could look like the the following line: \\n " + ls );
422 out.write( " Apple LaserWriter II NT v47.0 \\n " + ls );
423 out.write( " Sample command line: \\n " + ls );
424 out.write( " execl_print.pl c:\\book1.doc Apple LaserWriter II NT v47.0 c:\\output\\book1.ps \\n\"; " + ls );
425 out.write( "} " + ls );
426 out.write( " " + ls );
427 out.write( " " + ls );
428 out.write( "if ($#ARGV != 2) " + ls );
429 out.write( "{ " + ls );
430 out.write( " print 'Too less arguments.\\n'; " + ls );
431 out.write( " print_usage(); " + ls );
432 out.write( " exit(1); " + ls );
433 out.write( "} " + ls );
434 out.write( " " + ls );
435 out.write( "my $startWordTime = Time::HiRes::time(); " + ls );
436 out.write( "my $Word = Win32::OLE->new('Word.Application'); " + ls );
437 out.write( "my $stopWordTime = Time::HiRes::time() - $startWordTime; " + ls );
438 out.write( "# $Word->{'Visible'} = 1; # if you want to see what's going on " + ls );
439 out.write( "# , ReadOnly => 1})" + ls );
440 out.write(ls);
441 out.write( "my $startLoadWordTime = Time::HiRes::time(); " + ls );
442 out.write( "$Word->Documents->Open({Filename => $ARGV[0]}) " + ls );
443 out.write( " || die('Unable to open document ', Win32::OLE->LastError()); " + ls );
444 out.write( "my $stopLoadWordTime = Time::HiRes::time() - $startLoadWordTime; " + ls );
445 out.write(ls);
446 out.write( "my $startPrintWordTime = Time::HiRes::time(); " + ls);
447 out.write( "my $oldActivePrinte = $Word->{ActivePrinter} ; " + ls );
448 out.write( "$Word->{ActivePrinter} = $ARGV[1]; " + ls );
449 out.write( "$Word->ActiveDocument->PrintOut({ " + ls );
450 out.write( " Background => 0, " + ls );
451 out.write( " Append => 0, " + ls );
452 out.write( " Range => wdPrintAllDocument, " + ls );
453 out.write( " Item => wdPrintDocumentContent, " + ls );
454 out.write( " Copies => 1, " + ls );
455 out.write( " PageType => wdPrintAllPages, " + ls );
456 out.write( " PrintToFile => 1, " + ls );
457 out.write( " OutputFileName => $ARGV[2] " + ls );
458 out.write( " }); " + ls );
459 out.write( "$Word->{ActivePrinter} = $oldActivePrinte; " + ls );
460 out.write( "my $stopPrintWordTime = Time::HiRes::time() - $startPrintWordTime;" + ls);
462 out.write( "# ActiveDocument.Close(SaveChanges:=WdSaveOptions.wdDoNotSaveChanges)" + ls );
463 out.write( "my $sVersion = $Word->Application->Version();"+ls);
464 out.write( "$Word->ActiveDocument->Close({SaveChanges => 0}); " + ls );
465 out.write( "$Word->Quit(); " + ls );
467 out.write( "local *FILE;" + ls);
468 out.write( "if (open(FILE, \">$ENV{HOME}/msofficeloadtimes.txt\"))" + ls);
469 out.write( "{" + ls);
470 out.write( " print FILE \"name=$ARGV[0]\\n\";" + ls);
471 out.write( " print FILE \"WordVersion=$sVersion\\n\";" + ls);
472 out.write( " print FILE \"WordStartTime=$stopWordTime\\n\";" + ls);
473 out.write( " print FILE \"WordLoadTime=$stopLoadWordTime\\n\";" + ls);
474 out.write( " print FILE \"WordPrintTime=$stopPrintWordTime\\n\";" + ls);
475 out.write( " close(FILE);" + ls);
476 out.write( "}" + ls);
477 out.close();
479 aList.add(getPerlExe());
480 aList.add(sFileName);
481 return aList;
484 // TODO: Maybe give a possibility to say where search the script from outside
486 ArrayList<String> searchLocalFile(String _sScriptName)
488 String userdir = System.getProperty("user.dir");
490 ArrayList<String> aList = new ArrayList<String>();
491 String sFileName = FileHelper.appendPath(userdir, _sScriptName);
492 File aPerlScript = new File(sFileName);
493 if (FileHelper.isDebugEnabled())
495 GlobalLogWriter.println("Search for local existance of " + aPerlScript.getAbsolutePath());
498 if (aPerlScript.exists())
500 if (FileHelper.isDebugEnabled())
502 GlobalLogWriter.println("OK, found it, use this instead the internal one.");
505 String sName = aPerlScript.getAbsolutePath();
506 // String sCommand = "perl " + sName;
507 // System.out.println(sCommand);
508 aList.add("perl");
509 aList.add(sName);
510 return aList;
512 return aList;
515 ArrayList<String> createWordStoreHelper() throws java.io.IOException
517 // create a program in tmp file
518 String sTmpPath = util.utils.getUsersTempDir();
519 String ls = System.getProperty("line.separator");
521 // ArrayList aList = new ArrayList();
522 String sSaveViaWord = "saveViaWord.pl";
524 ArrayList<String> aList = searchLocalFile(sSaveViaWord);
525 if (aList.isEmpty() == false)
527 return aList;
530 String sName = FileHelper.appendPath(sTmpPath, sSaveViaWord);
531 if (FileHelper.isDebugEnabled())
533 GlobalLogWriter.println("No local found, create a perl script: " + sName);
536 File aFile = new File(sName);
537 FileWriter out = new FileWriter(aFile);
539 out.write( "eval 'exec perl -wS $0 ${1+\"$@\"}' " + ls );
540 out.write( " if 0; " + ls );
541 out.write( "use strict; " + ls );
542 out.write( " " + ls );
543 out.write( "if ( $^O ne \"MSWin32\") " + ls );
544 out.write( "{ " + ls );
545 out.write( " print 'Windows only.\\n'; " + ls );
546 out.write( " print_usage(); " + ls );
547 out.write( " exit(1); " + ls );
548 out.write( "} " + ls );
549 out.write( " " + ls );
550 out.write( "use Win32::OLE; " + ls );
551 out.write( "use Win32::OLE::Const 'Microsoft Word'; " + ls );
552 out.write( " " + ls );
553 out.write( "# ------ usage ------ " + ls );
554 out.write( "sub print_usage() " + ls );
555 out.write( "{ " + ls );
556 out.write( " print STDERR \"Usage: storeViaWord.pl <Word file> <output filer> <output file> \\n\" " + ls );
557 out.write( "} " + ls );
558 out.write( " " + ls );
559 out.write( " " + ls );
560 out.write( "if ($#ARGV != 2) " + ls );
561 out.write( "{ " + ls );
562 out.write( " print 'Too less arguments.\\n'; " + ls );
563 out.write( " print_usage(); " + ls );
564 out.write( " exit(1); " + ls );
565 out.write( "} " + ls );
566 out.write( " " + ls );
567 out.write( " " + ls );
568 out.write( "my $Word = Win32::OLE->new('Word.Application'); " + ls );
569 out.write( "# $Word->{'Visible'} = 1; # if you want to see what's going on " + ls );
570 out.write( "my $Book = $Word->Documents->Open($ARGV[0]) " + ls );
571 out.write( " || die('Unable to open document ', Win32::OLE->LastError()); " + ls );
572 out.write( "# my $oldActivePrinte = $Word->{ActivePrinter} ; " + ls );
573 out.write( "# $Word->{ActivePrinter} = $ARGV[1]; " + ls );
574 out.write( "# $Word->ActiveDocument->PrintOut({ " + ls );
575 out.write( "# Background => 0, " + ls );
576 out.write( "# Append => 0, " + ls );
577 out.write( "# Range => wdPrintAllDocument, " + ls );
578 out.write( "# Item => wdPrintDocumentContent, " + ls );
579 out.write( "# Copies => 1, " + ls );
580 out.write( "# PageType => wdPrintAllPages, " + ls );
581 out.write( "# PrintToFile => 1, " + ls );
582 out.write( "# OutputFileName => $ARGV[2] " + ls );
583 out.write( "# }); " + ls );
584 out.write( "# $Word->{ActivePrinter} = $oldActivePrinte; " + ls );
585 out.write( "$Book->savaAs($ARGV[2], $ARGV[1]); " + ls );
586 out.write( "# ActiveDocument.Close(SaveChanges:=WdSaveOptions.wdDoNotSaveChanges)" + ls );
587 out.write( "$Book->Close({SaveChanges => 0}); " + ls );
588 out.write( "$Word->Quit(); " + ls );
589 out.close();
591 aList.add(getPerlExe());
592 aList.add(sName);
593 return aList;
597 ArrayList<String> createExcelPrintHelper() throws java.io.IOException
599 // create a program in tmp file
600 String sTmpPath = util.utils.getUsersTempDir();
601 String ls = System.getProperty("line.separator");
603 String sPrintViaExcel = "printViaExcel.pl";
605 ArrayList<String> aList = searchLocalFile(sPrintViaExcel);
606 if (aList.isEmpty() == false)
608 return aList;
610 String sName = FileHelper.appendPath(sTmpPath, sPrintViaExcel);
611 if (FileHelper.isDebugEnabled())
613 GlobalLogWriter.println("No local found, create a perl script: " + sName);
616 File aFile = new File(sName);
617 FileWriter out = new FileWriter(aFile);
619 // out.write( "eval 'exec perl -wS $0 ${1+\"$@\"}' " + ls );
620 // out.write( " if 0; " + ls );
621 out.write("#BEGIN" + ls);
622 out.write("#{" + ls);
623 out.write("#" + ls);
624 out.write("# # insert HACK" + ls);
625 out.write("# unshift(@INC, '');" + ls);
626 out.write("#}" + ls);
627 out.write( "use strict; " + ls );
628 out.write( " " + ls );
629 out.write( "if ( $^O ne \"MSWin32\") " + ls );
630 out.write( "{ " + ls );
631 out.write( " print \"Windows only.\\n\"; " + ls );
632 out.write( " print_usage(); " + ls );
633 out.write( " exit(1); " + ls );
634 out.write( "} " + ls );
635 out.write( " " + ls );
636 out.write( " " + ls );
637 out.write( "use Win32::OLE qw(in with); " + ls );
638 out.write( "use Win32::OLE::Const 'Microsoft Excel'; " + ls );
639 out.write( " " + ls );
640 out.write( "# ------ usage ------ " + ls );
641 out.write( "sub print_usage() " + ls );
642 out.write( "{ " + ls );
643 out.write( " print STDERR \"Usage: printViaExcel.pl <Excel file> <name of printer> <output file> .\\n " + ls );
644 out.write( " Please use the same string for the name of the printer as you can find \\n " + ls );
645 out.write( " under Start-Control Panel-Printer and Faxes \\n " + ls );
646 out.write( " The name could look like the the following line: \\n " + ls );
647 out.write( " Apple LaserWriter II NT v47.0 \\n " + ls );
648 out.write( " Sample command line: \\n " + ls );
649 out.write( " execl_print.pl c:\\book1.xls Apple LaserWriter II NT v47.0 c:\\output\\book1.ps \\n\"; " + ls );
650 out.write( "} " + ls );
651 out.write( " " + ls );
652 out.write( " " + ls );
653 out.write( " " + ls );
654 out.write( "$Win32::OLE::Warn = 3; # die on errors... " + ls );
655 out.write( " " + ls );
656 out.write( " " + ls );
657 out.write( "if ($#ARGV != 2) " + ls );
658 out.write( "{ " + ls );
659 out.write( " print STDERR \"Too less arguments.\\n\"; " + ls );
660 out.write( " print STDERR \"ARGV[0] $ARGV[0]\\n\"; " + ls );
661 out.write( " print STDERR \"ARGV[1] $ARGV[1]\\n\"; " + ls );
662 out.write( " print STDERR \"ARGV[2] $ARGV[2]\\n\"; " + ls );
663 out.write( " print_usage(); " + ls );
664 out.write( " exit(1); " + ls );
665 out.write( "} " + ls );
666 out.write( " " + ls );
667 out.write( "my $Excel = Win32::OLE->GetActiveObject('Excel.Application') " + ls );
668 out.write( " || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel " + ls );
669 out.write( " # application or open new " + ls );
670 out.write( " " + ls );
671 out.write( " " + ls );
672 out.write( " " + ls );
673 out.write( "my $Book = $Excel->Workbooks->Open( $ARGV[0] ); " + ls );
674 out.write( " $Book->PrintOut({Copies => 1, " + ls );
675 out.write( " ActivePrinter => $ARGV[1], " + ls );
676 out.write( " PrToFileName => $ARGV[2], " + ls );
677 out.write( " Collate => 1 " + ls );
678 out.write( " }); " + ls );
679 out.write( "# Close worksheets without store changes" + ls );
680 out.write( "# $Book->Close({SaveChanges => 0}); " + ls );
681 out.write( "my $sVersion = $Excel->Application->Version();"+ls);
682 out.write( "$Excel->Quit(); " + ls );
683 out.write( "local *FILE;" + ls);
684 out.write( "if (open(FILE, \">$ENV{HOME}/msofficeloadtimes.txt\"))" + ls);
685 out.write( "{" + ls);
686 out.write( " print FILE \"name=$ARGV[0]\\n\";" + ls);
687 out.write( " print FILE \"ExcelVersion=$sVersion\\n\";" + ls);
688 // out.write( " print FILE \"WordStartTime=$stopWordTime\\n\";" + ls);
689 // out.write( " print FILE \"WordLoadTime=$stopLoadWordTime\\n\";" + ls);
690 // out.write( " print FILE \"WordPrintTime=$stopPrintWordTime\\n\";" + ls);
691 out.write( " close(FILE);" + ls);
692 out.write( "}" + ls);
693 out.close();
695 aList.add(getPerlExe());
696 aList.add(sName);
697 return aList;
700 ArrayList<String> createExcelStoreHelper() throws java.io.IOException
702 // create a program in tmp file
703 String sTmpPath = util.utils.getUsersTempDir();
704 String ls = System.getProperty("line.separator");
706 String sSaveViaExcel = "saveViaExcel.pl";
708 ArrayList<String> aList = searchLocalFile(sSaveViaExcel);
709 if (aList.isEmpty() == false)
711 return aList;
713 String sName = FileHelper.appendPath(sTmpPath, sSaveViaExcel);
714 if (FileHelper.isDebugEnabled())
716 GlobalLogWriter.println("No local found, create a script: " + sName);
719 File aFile = new File(sName);
720 FileWriter out = new FileWriter(aFile);
722 out.write( "eval 'exec perl -wS $0 ${1+\"$@\"}' " + ls );
723 out.write( " if 0; " + ls );
724 out.write( "use strict; " + ls );
725 out.write( "# This script is automatically created. " + ls );
726 out.write( " " + ls );
727 out.write( "use Win32::OLE qw(in with); " + ls );
728 out.write( "use Win32::OLE::Const 'Microsoft Excel'; " + ls );
729 out.write( " " + ls );
730 out.write( "# ------ usage ------ " + ls );
731 out.write( "sub print_usage() " + ls );
732 out.write( "{ " + ls );
733 out.write( " print STDERR \"Usage: savaViaExcel.pl <Excel file> <filefilter> <output file> .\\n " + ls );
734 out.write( " execl_print.pl c:\\book1.xls Apple LaserWriter II NT v47.0 c:\\output\\book1.ps \\n\"; " + ls );
735 out.write( "} " + ls );
736 out.write( " " + ls );
737 out.write( " " + ls );
738 out.write( " " + ls );
739 out.write( "$Win32::OLE::Warn = 3; # die on errors... " + ls );
740 out.write( " " + ls );
741 out.write( " " + ls );
742 out.write( "if ($#ARGV != 2) " + ls );
743 out.write( "{ " + ls );
744 out.write( " print \"Too less arguments.\\n\"; " + ls );
745 out.write( " print_usage(); " + ls );
746 out.write( " exit(1); " + ls );
747 out.write( "} " + ls );
748 out.write( " " + ls );
749 out.write( "my $Excel = Win32::OLE->GetActiveObject('Excel.Application') " + ls );
750 out.write( " || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel " + ls );
751 out.write( " # application or open new " + ls );
752 out.write( "my $sFilterParameter = $ARGV[1]; " + ls );
753 out.write( "my $sFilterName = xlHTML; " + ls );
754 out.write( "if ($sFilterParameter eq 'xlXMLSpreadsheet') " + ls );
755 out.write( "{ " + ls );
756 out.write( " $sFilterName = xlXMLSpreadsheet; " + ls );
757 out.write( "} " + ls );
758 out.write( "elsif ($sFilterParameter eq 'xlHTML') " + ls );
759 out.write( "{ " + ls );
760 out.write( " $sFilterName = xlHTML; " + ls );
761 out.write( "} " + ls );
762 out.write( "else " + ls );
763 out.write( "{ " + ls );
764 out.write( " my $undefined; " + ls);
765 out.write( " $sFilterName = $undefined; " + ls );
766 out.write( "} " + ls );
767 out.write( " " + ls );
768 out.write( "my $Book = $Excel->Workbooks->Open( $ARGV[0] ); " + ls );
769 out.write( "$Excel->{DisplayAlerts} = 0; " + ls );
770 out.write( "$Book->saveAs($ARGV[2], " + ls );
771 out.write( " $sFilterName, " + ls );
772 out.write( " '', " + ls );
773 out.write( " '', " + ls );
774 out.write( " 0, " + ls );
775 out.write( " 0, " + ls );
776 out.write( " xlNoChange, " + ls );
777 out.write( " xlLocalSessionChanges, " + ls );
778 out.write( " 1); " + ls );
779 out.write( "# Close worksheets without store changes" + ls );
780 out.write( "# $Book->Close({SaveChanges => 0}); " + ls );
781 out.write( "$Excel->Quit(); " + ls );
782 out.close();
784 aList.add(getPerlExe());
785 aList.add(sName);
786 return aList;
789 ArrayList<String> createPowerPointPrintHelper() throws java.io.IOException
791 // create a program in tmp file
792 String sTmpPath = util.utils.getUsersTempDir();
793 String ls = System.getProperty("line.separator");
795 String sPrintViaPowerPoint = "printViaPowerPoint.pl";
797 ArrayList<String> aList = searchLocalFile(sPrintViaPowerPoint);
798 if (aList.isEmpty() == false)
800 return aList;
802 String sName = FileHelper.appendPath(sTmpPath, sPrintViaPowerPoint);
803 if (FileHelper.isDebugEnabled())
805 GlobalLogWriter.println("No local found, create a script: " + sName);
808 File aFile = new File(sName);
809 FileWriter out = new FileWriter(aFile);
812 out.write( "eval 'exec perl -wS $0 $1 $2 ' " + ls );
813 out.write( " if 0; " + ls );
814 out.write( "use strict; " + ls );
815 out.write( " " + ls );
816 out.write( "if ( $^O ne \"MSWin32\") " + ls );
817 out.write( "{ " + ls );
818 out.write( " print \"Windows only.\\n\"; " + ls );
819 out.write( " print_usage(); " + ls );
820 out.write( " exit(1); " + ls );
821 out.write( "} " + ls );
822 out.write( " " + ls );
823 out.write( " " + ls );
824 out.write( "use Win32::OLE qw(in with); " + ls );
825 out.write( "use Win32::OLE::Const 'Microsoft PowerPoint'; " + ls );
826 out.write( " " + ls );
827 out.write( "# ------ usage ------ " + ls );
828 out.write( "sub print_usage() " + ls );
829 out.write( "{ " + ls );
830 out.write( " print STDERR \"Usage: powerpoint_print.pl <PowerPoint file> <name of printer> <output file> .\\n " + ls );
831 out.write( " Please use the same string for the name of the printer as you can find \\n " + ls );
832 out.write( " under Start-Control Panel-Printer and Faxes \\n " + ls );
833 out.write( " The name could look like the the following line: \\n " + ls );
834 out.write( " Apple LaserWriter II NT v47.0 \\n " + ls );
835 out.write( " Sample command line: \\n " + ls );
836 out.write( " powerpoint_print.pl c:\\book.ppt Apple LaserWriter II NT v47.0 c:\\output\\book.ps \\n\"; " + ls );
837 out.write( "} " + ls );
838 out.write( " " + ls );
839 out.write( " " + ls );
840 out.write( " " + ls );
841 out.write( "$Win32::OLE::Warn = 3; # die on errors... " + ls );
842 out.write( " " + ls );
843 out.write( " " + ls );
844 out.write( "if ($#ARGV < 2) " + ls );
845 out.write( "{ " + ls );
846 out.write( " print \"Too less arguments.\\n\"; " + ls );
847 out.write( " print_usage(); " + ls );
848 out.write( " exit(1); " + ls );
849 out.write( "} " + ls );
850 out.write( " " + ls );
851 out.write( "my $PowerPoint = Win32::OLE->GetActiveObject('PowerPoint.Application') " + ls );
852 out.write( " || Win32::OLE->new('PowerPoint.Application', 'Quit'); # get already active Excel " + ls );
853 out.write( " # application or open new " + ls );
854 out.write( " " + ls );
855 out.write( " " + ls );
856 out.write( " " + ls );
857 out.write( " $PowerPoint->{'Visible'} = 1; " + ls );
858 out.write( " my $Presentation = $PowerPoint->Presentations->Add; " + ls );
859 out.write( " my $Presentation = $PowerPoint->Presentations->Open( $ARGV[0] ); " + ls );
860 out.write( "# we can't change active printer in powerpoint " + ls );
861 out.write( "# $Presentation->PrintOptions->{ActivePrinter} = $ARGV[1]; " + ls );
862 out.write( " print \"Active printer is: \" . $Presentation->PrintOptions->{ActivePrinter} . \"\\n\"; " + ls );
863 out.write( " $Presentation->PrintOptions->{PrintInBackground} = 0; " + ls );
864 out.write( " # PrintColorType = 1 means print in color and PrintColorType = 2 means print in gray " + ls );
865 out.write( " $Presentation->PrintOptions->{PrintColorType} = 1; " + ls );
866 out.write( " " + ls );
867 out.write( " $Presentation->PrintOut({PrintToFile => $ARGV[2]}); " + ls );
868 out.write( " sleep 5; " + ls );
869 out.write( " print \"Presentation has been printed\\n\"; " + ls );
870 out.write( "my $sVersion = $Presentation->Application->Version();"+ls);
871 out.write( " $PowerPoint->Quit(); " + ls );
873 out.write( "local *FILE;" + ls);
874 out.write( "if (open(FILE, \">$ENV{HOME}/msofficeloadtimes.txt\"))" + ls);
875 out.write( "{" + ls);
876 out.write( " print FILE \"name=$ARGV[0]\\n\";" + ls);
877 out.write( " print FILE \"PowerPointVersion=$sVersion\\n\";" + ls);
878 // out.write( " print FILE \"WordStartTime=$stopWordTime\\n\";" + ls);
879 // out.write( " print FILE \"WordLoadTime=$stopLoadWordTime\\n\";" + ls);
880 // out.write( " print FILE \"WordPrintTime=$stopPrintWordTime\\n\";" + ls);
881 out.write( " close(FILE);" + ls);
882 out.write( "}" + ls);
883 out.close();
885 aList.add(getPerlExe());
886 aList.add(sName);
887 return aList;
891 @param _sFilename a name to a ms office xml file
892 @return 'word' or 'excel' or '' if type not known
894 public String getOfficeType(String _sFilename)
896 File aFile = new File(_sFilename);
897 if (! aFile.exists())
899 GlobalLogWriter.println("couldn't find file " + _sFilename);
900 return "";
902 RandomAccessFile aReader = null;
903 String sOfficeType = "";
906 aReader = new RandomAccessFile(aFile,"r");
907 String aLine = "";
908 while (aLine != null)
910 aLine = aReader.readLine();
911 if (aLine != null)
913 aLine = aLine.trim();
914 if ( (! (aLine.length() < 2) ) &&
915 (! aLine.startsWith("#")) &&
916 (! aLine.startsWith(";")) )
918 int nIdx = aLine.indexOf("mso-application");
919 if (nIdx > 0)
921 if (aLine.indexOf("Word.Document") > 0)
923 sOfficeType = "word";
925 else if (aLine.indexOf("Excel") > 0)
927 sOfficeType = "excel";
929 else
931 GlobalLogWriter.println("Unknown/unsupported data file: " + aLine);
938 catch (java.io.FileNotFoundException fne)
940 System.out.println("couldn't open file " + _sFilename);
941 System.out.println("Message: " + fne.getMessage());
943 catch (java.io.IOException ie)
945 System.out.println("Exception while reading file " + _sFilename);
946 System.out.println("Message: " + ie.getMessage());
950 aReader.close();
952 catch (java.io.IOException ie)
954 System.out.println("Couldn't close file " + _sFilename);
955 System.out.println("Message: " + ie.getMessage());
957 return sOfficeType;
960 private static String getXMLDocumentFormat(String _sInputFile)
962 String sType = "word"; // default
965 // ---- Parse XML file ----
966 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
967 // factory.setNamespaceAware( true );
968 // factory.setValidating( true );
969 DocumentBuilder builder = factory.newDocumentBuilder();
970 Document document = builder.parse( new File (_sInputFile) );
971 Node rootNode = document.getDocumentElement();
973 // ---- Get list of nodes to given tag ----
974 // document.
975 // NodeList ndList = document.getElementsByTagName( sToSearch /* argv[2] */ );
976 // System.out.println( "\nNode list at the beginning:" );
977 String sRootNodeName = rootNode.getNodeName();
978 if (sRootNodeName.equals("w:wordDocument"))
980 sType = "word";
982 else if (sRootNodeName.equals("WorkBook"))
984 sType = "excel";
986 // there exists no powerpoint xml representation in MSOffice 2003
987 else
989 GlobalLogWriter.println("Error: unknown root node: '" + sRootNodeName + "' please check the document. Try to use Word as default.");
990 sType = "word"; // default
992 // printNodesFromList( ndList );
994 catch (java.lang.Exception e)
997 return sType;
1000 // public static void main(String [] _args)
1001 // {
1002 // String sTest = getXMLDocumentFormat("c:/cws/temp/input/Blah Fasel.xml");
1003 // }