/* * ************************************************************************ * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * * *********************************************************************** */ package graphical; import helper.OSHelper; import helper.ProcessHandler; import helper.StringHelper; import java.io.File; /** * * @author ll93751 */ public class JPEGCreator extends EnhancedComplexTestCase { // @Override public String[] getTestMethodNames() { return new String[]{"PostscriptOrPDFToJPEG"}; } /** * test function. */ public void PostscriptOrPDFToJPEG() { GlobalLogWriter.set(log); ParameterHelper aParam = new ParameterHelper(param); // run through all documents found in Inputpath foreachPSorPDFinInputPath(aParam); } public void checkOneFile(String _sDocumentName, String _sResult, ParameterHelper _aParams) throws OfficeException { GlobalLogWriter.println("Document: " + _sDocumentName + " results: " + _sResult); // IOffice aOffice = new Office(_aParams, _sResult); // aOffice.start(); // aOffice.load(_sDocumentName); // aOffice.storeAsPostscript(); // aOffice.close(); String sJPEGNameSchema = createJPEG(_sDocumentName, "", _aParams); // store information only if jpeg files exists int nPages = countPages(sJPEGNameSchema); if (nPages > 0) { createSmallPictures(sJPEGNameSchema); // read out tolerance file String sFileDir = FileHelper.getPath(_sDocumentName); String sBasename = FileHelper.getBasename(_sDocumentName); int nTolerance = 0; String sToleranceFile = FileHelper.appendPath(sFileDir, "tolerance.ini"); File aToleranceFile = new File(sToleranceFile); if (aToleranceFile.exists()) { IniFile aIniFile = new IniFile(sToleranceFile); nTolerance = aIniFile.getIntValue(sBasename, "accept", 0); // default for all pages aIniFile.close(); } String sIndexFile = FileHelper.appendPath(_sResult, "index.ini"); File aIndexFile = new File(sIndexFile); if (aIndexFile.exists()) { // store only if an index file exists IniFile aIniFile = new IniFile(sIndexFile); aIniFile.insertValue(sBasename, "jpegschema", sJPEGNameSchema); aIniFile.insertValue(sBasename, "pages", nPages); aIniFile.insertValue(sBasename, "tolerance", nTolerance); aIniFile.close(); } } else { assure("There are no pages in document:'" + _sDocumentName + "', maybe document currupt?", false, true); } } /** * Create a lot of smaller and nicer Pictures of the big fat pages. * Looks better * @param _sJPEGSchema */ public void createSmallPictures(String _sJPEGSchema) { ParameterHelper aParam = new ParameterHelper(param); if (! aParam.createSmallPictures()) { return; } int nPages = 0; if (_sJPEGSchema.length() > 0) { // TODO: if there doesn't exists a '%04d' in the schema we will return 9999 which is a little bit wrong here. for (int i=1;i<10000;i++) { String sJPEGFilename = getFilenameForJPEGSchema(_sJPEGSchema, i); if (FileHelper.exists(sJPEGFilename)) { convertToNearSameFileWithWidth340(sJPEGFilename); // m_aFileList.add(sNewJPEGFilename); // as long as the files exist, fill the array nPages ++; } else { break; // stop file check } } } // return nPages; } /** * convert a picture to a new picture with 340 pixel width. * @param _sJPEGFilename */ public static void convertToNearSameFileWithWidth340(String _sJPEGFilename) { ParameterHelper aParam = new ParameterHelper(param); if (! aParam.createSmallPictures()) { return; } String sJPEGFilename = _sJPEGFilename.replaceAll("\\\\", "/"); // if (OSHelper.isWindows()) // { // sJPEGFilename = sJPEGFilename.replaceAll("/", "\\\\"); // } String sNewJPEGFilename; sNewJPEGFilename = util.utils.replaceAll13(sJPEGFilename, ".jpg", "_w340.jpg"); convertToWidth340(sJPEGFilename, sNewJPEGFilename); } /** * convert chart2_Regression.ods.ps_180DPI_0001.jpg -filter Catrom -resize 340x chart2_Regression.ods.ps_180DPI_0001_w340.jpg Point wie bisher Cubic schlecht, weil unscharf ... Triangle ganz brauchbar (default?) Catrom am besten * @param _sFrom * @param _To */ private static void convertToWidth340(String _sFrom, String _To) { // int nResult = 0; String sConvertEXE = "convert"; if (OSHelper.isLinuxIntel()) { sConvertEXE = "convert"; } if (OSHelper.isWindows()) { // TODO! // HACK Hard coded! // sConvertEXE = "C:\\Programme\\ImageMagick-6.0.3-q8\\convert.exe"; sConvertEXE = "convert.exe"; String sConvertPath = (String)param.get("imagemagick.path"); if (sConvertPath != null) { sConvertEXE = FileHelper.appendPath(sConvertPath, sConvertEXE); } } String[] sCommandArray = { sConvertEXE, _sFrom, "-filter", "Catrom", "-resize", "340x", _To }; ProcessHandler aHandler = new ProcessHandler(sCommandArray); boolean bBackValue = aHandler.executeSynchronously(); int nExitCode = aHandler.getExitCode(); String sBack = aHandler.getOutputText(); if (sBack.length() > 0) { GlobalLogWriter.println("'" + sBack + "'"); } // try to interpret the result, which we get as a String // try // { // int nIdx = sBack.indexOf("\n"); // if (nIdx > 0) // { // sBack = sBack.substring(0, nIdx); // } // // nResult = Integer.valueOf(sBack).intValue(); // } // catch(java.lang.NumberFormatException e) // { // GlobalLogWriter.get().println("Number format exception"); // nResult = 0; // } // return nResult; } /** * create out of a given Postscript/PDF _sFile a list of JPEGs, one for every page * @param _sFile * @param _sAdditional * @param _aParam * @return the schema of the first jpeg name */ String createJPEG(String _sFile, String _sAdditional, ParameterHelper _aParam) { if (_sFile.startsWith("file:///")) { _sFile = FileHelper.getSystemPathFromFileURL(_sFile); } File aFile = new File(_sFile); if (aFile.exists()) { String sAbsFile = aFile.getAbsolutePath(); if (!sAbsFile.equals(_sFile)) { _sFile = sAbsFile; } } else { GlobalLogWriter.println("File: '" + _sFile + "' doesn't exist."); return ""; } String sFileDir = FileHelper.getPath(_sFile); String sBasename = FileHelper.getBasename(_sFile); // String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename); String sTmpDir = util.utils.getUsersTempDir(); if (_aParam.getOutputPath() != null) { sTmpDir = _aParam.getOutputPath(); } String sJPEGNameSchema = ""; if (_sFile.toLowerCase().endsWith("ps") || _sFile.toLowerCase().endsWith("prn") || _sFile.toLowerCase().endsWith("pdf")) { // seems to be a Postscript of PDF file sJPEGNameSchema = createJPEGsFromPostscript(sTmpDir, sFileDir, sBasename, _aParam.getResolutionInDPI()); } else if (_sFile.toLowerCase().endsWith("jpg") || _sFile.toLowerCase().endsWith("jpeg")) { // do nothing, it's already a picture. return _sFile; } else { // we assume it's an office document. // Office files will not handled here, we need a PS or PDF file } return sJPEGNameSchema; } private String getJPEGName(String _sOutputPath, String _sBasename, int _nResolutionInDPI, String _sGS_PageOutput) { // String fs = System.getProperty("file.separator"); String sName = _sBasename + "_" + String.valueOf(_nResolutionInDPI) + "DPI_" + _sGS_PageOutput + ".jpg"; String sJPEGName = FileHelper.appendPath(_sOutputPath, sName); return sJPEGName; } /** * Create via ghostscript (gs) from the reference file for every page a JPEG file * * MUST set: * m_sOutputPath, m_sReferenceFile, m_sReferencePath * * return exit code from gs command */ private static final String m_sGS_PageOutput = "%04d"; private String createJPEGsFromPostscript(String _sOutputPath, String _sSourcePath, String _sSourceFile, int _nResolutionInDPI) { FileHelper.makeDirectories("", _sOutputPath); // create a jpeg from original prn // String fs = System.getProperty("file.separator"); String sJPEGNameSchema = getJPEGName(_sOutputPath, _sSourceFile, _nResolutionInDPI, m_sGS_PageOutput); String sPostscriptOrPDFFile = FileHelper.appendPath(_sSourcePath, _sSourceFile); String sGhostscriptEXE = "gs"; if (OSHelper.isWindows()) { sGhostscriptEXE = "gswin32c.exe"; String sGhostscriptEXE2 = (String)param.get("gs.exe"); if (sGhostscriptEXE2 != null) { sGhostscriptEXE = sGhostscriptEXE2; } String sGhostscriptPath = (String)param.get("gs.path"); if (sGhostscriptPath != null) { sGhostscriptEXE = FileHelper.appendPath(sGhostscriptPath, sGhostscriptEXE); } } // String sCommand = sGhostscriptEXE + " -dNOPROMPT -dBATCH -sDEVICE=jpeg -r" + String.valueOf(_nResolutionInDPI) + " -dNOPAUSE -sOutputFile=" + StringHelper.doubleQuoteIfNeed(sJPGFilename) + " " + StringHelper.doubleQuoteIfNeed(sOriginalFile); String[] sCommandArray = { sGhostscriptEXE, "-dNOPROMPT", "-dBATCH", "-sDEVICE=jpeg", "-r" + String.valueOf(_nResolutionInDPI), "-dNOPAUSE", "-sOutputFile=" + sJPEGNameSchema, sPostscriptOrPDFFile }; // System.out.println("Start Command array"); // try // { // Runtime.getRuntime().exec(sCommandArray); // } catch (Exception e) { // System.out.println("FAILED"); // } // System.out.println("done"); // TODO: gives ghostscript an error we can handle? ProcessHandler aHandler = new ProcessHandler(sCommandArray); boolean bBackValue = aHandler.executeSynchronously(); assure("There seems to be a problem with ghostscript", bBackValue, true); int nExitCode = aHandler.getExitCode(); // ArrayList m_aFileList = new ArrayList(); // String sJPEGNameSchema = ""; if (nExitCode == 0) { // TODO: return a real filename, due to the fact we don't know how much files are created, maybe better to return a list int nPages = countPages(sJPEGNameSchema); if (nPages == 0) { // return only a valid schema name if there at least one page. sJPEGNameSchema = ""; assure("Document '" + sPostscriptOrPDFFile + "' doesn't create pages.", false, true); } } else { assure("There seems to be a problem with ghostscript and '" + sPostscriptOrPDFFile + "' exit code: " + nExitCode, false, true); GlobalLogWriter.println("Warning: There seems to be a problem with '" + sGhostscriptEXE + "'..."); } // String[] aList = new String[m_aFileList.size()]; // aList = (String[])m_aFileList.toArray(aList); return sJPEGNameSchema; // sNewJPEGFilename; } public static String getFilenameForJPEGSchema(String _sJPEGSchema, int _nPage) { if (_nPage < 1 || _nPage > 9999) { return ""; } final String sFilename = util.utils.replaceAll13(_sJPEGSchema, m_sGS_PageOutput, StringHelper.createValueString(_nPage, 4)); return sFilename; } /** * Return the number of really exists JPEG files * Give a JPEG Schema which contains something like '%04d' which will be converted by a number between 0001 and 9999 always * with leading '0' (zero) * @param _sJPEGSchema * @return number of really existing pages of a given JPEG schema */ public int countPages(String _sJPEGSchema) { int nPages = 0; if (_sJPEGSchema.length() > 0) { // TODO: if there doesn't exists a '%04d' in the schema we will return 9999 which is a little bit wrong here. for (int i=1;i<10000;i++) { String sNewJPEGFilename = getFilenameForJPEGSchema(_sJPEGSchema, i); if (FileHelper.exists(sNewJPEGFilename)) { // m_aFileList.add(sNewJPEGFilename); // as long as the files exist, fill the array nPages ++; } else { break; // stop file check } } } return nPages; } // public static void main(String [] _args) // { //// DONE: give an index.ini file ok //// String args[] = { //// "-TimeOut", "3600000", //// "-tb", "java_complex", //// "-o", "graphical.JPEGCreator", //// "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\index.ini", //// "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output", //// "-DOC_COMPARATOR_PRINT_MAX_PAGE", "9999", //// "-DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION", "180", //// "-DOC_COMPARATOR_HTML_OUTPUT_PREFIX", "http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/cw.php?inifile=", ////// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "PDF", /* default: "OOo" */ ////// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "msoffice", /* default: "OOo" */ ////// "-OFFICE_VIEWABLE", "false", //// "-AppExecutionCommand", "\"C:/Programme/sun/staroffice 9/program/soffice.exe\" -norestore -nocrashreport -accept=pipe,name=ll93751;urp;", //// "-NoOffice" //// }; // //// Done: give a directory, where exist pdf/ps files ok. //// Done: inputpath (given file) doesn't exists, ok. //// Done: give a ps/pdf file. ok. // // String args[] = { // "-TimeOut", "3600000", // "-tb", "java_complex", // "-o", "graphical.JPEGCreator", // "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\Names7.odt.pdf", // "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output", // "-DOC_COMPARATOR_PRINT_MAX_PAGE", "9999", // "-DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION", "180", // "-DOC_COMPARATOR_HTML_OUTPUT_PREFIX", "http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/cw.php?inifile=", //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "PDF", /* default: "OOo" */ //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "msoffice", /* default: "OOo" */ //// "-OFFICE_VIEWABLE", "false", // "-AppExecutionCommand", "\"C:/Programme/sun/staroffice 9/program/soffice.exe\" -norestore -nocrashreport -accept=pipe,name=ll93751;urp;", // "-NoOffice" // }; // // org.openoffice.Runner.main(args); // } }