1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 package graphical; 25 26 import helper.OSHelper; 27 import helper.ProcessHandler; 28 import helper.StringHelper; 29 import java.io.File; 30 31 /** 32 * 33 * @author ll93751 34 */ 35 public class JPEGCreator extends EnhancedComplexTestCase 36 { 37 // @Override 38 public String[] getTestMethodNames() 39 { 40 return new String[]{"PostscriptOrPDFToJPEG"}; 41 } 42 43 /** 44 * test function. 45 */ 46 public void PostscriptOrPDFToJPEG() 47 { 48 GlobalLogWriter.set(log); 49 ParameterHelper aParam = new ParameterHelper(param); 50 51 // run through all documents found in Inputpath 52 foreachPSorPDFinInputPath(aParam); 53 } 54 55 56 public void checkOneFile(String _sDocumentName, String _sResult, ParameterHelper _aParams) throws OfficeException 57 { 58 GlobalLogWriter.println(" Document: " + _sDocumentName); 59 GlobalLogWriter.println(" results: " + _sResult); 60 // IOffice aOffice = new Office(_aParams, _sResult); 61 // aOffice.start(); 62 // aOffice.load(_sDocumentName); 63 // aOffice.storeAsPostscript(); 64 // aOffice.close(); 65 String sJPEGNameSchema = createJPEG(_sDocumentName, "", _aParams); 66 67 // store information only if jpeg files exists 68 int nPages = countPages(sJPEGNameSchema); 69 if (nPages > 0) 70 { 71 createSmallPictures(sJPEGNameSchema); 72 73 // read out tolerance file 74 String sFileDir = FileHelper.getPath(_sDocumentName); 75 String sBasename = FileHelper.getBasename(_sDocumentName); 76 int nTolerance = 0; 77 String sToleranceFile = FileHelper.appendPath(sFileDir, "tolerance.ini"); 78 File aToleranceFile = new File(sToleranceFile); 79 if (aToleranceFile.exists()) 80 { 81 IniFile aIniFile = new IniFile(sToleranceFile); 82 nTolerance = aIniFile.getIntValue(sBasename, "accept", 0); // default for all pages 83 aIniFile.close(); 84 } 85 86 String sIndexFile = FileHelper.appendPath(_sResult, "index.ini"); 87 File aIndexFile = new File(sIndexFile); 88 if (aIndexFile.exists()) 89 { 90 // store only if an index file exists 91 IniFile aIniFile = new IniFile(sIndexFile); 92 aIniFile.insertValue(sBasename, "jpegschema", sJPEGNameSchema); 93 aIniFile.insertValue(sBasename, "pages", nPages); 94 aIniFile.insertValue(sBasename, "tolerance", nTolerance); 95 aIniFile.close(); 96 } 97 } 98 else 99 { 100 assure("There are no pages in document:'" + _sDocumentName + "', maybe document currupt?", false, true); 101 } 102 } 103 104 /** 105 * Create a lot of smaller and nicer Pictures of the big fat pages. 106 * Looks better 107 * @param _sJPEGSchema 108 */ 109 public void createSmallPictures(String _sJPEGSchema) 110 { 111 ParameterHelper aParam = new ParameterHelper(param); 112 if (! aParam.createSmallPictures()) 113 { 114 return; 115 } 116 117 int nPages = 0; 118 if (_sJPEGSchema.length() > 0) 119 { 120 // TODO: if there doesn't exists a '%04d' in the schema we will return 9999 which is a little bit wrong here. 121 for (int i=1;i<10000;i++) 122 { 123 String sJPEGFilename = getFilenameForJPEGSchema(_sJPEGSchema, i); 124 if (FileHelper.exists(sJPEGFilename)) 125 { 126 convertToNearSameFileWithWidth340(sJPEGFilename); 127 // m_aFileList.add(sNewJPEGFilename); // as long as the files exist, fill the array 128 nPages ++; 129 } 130 else 131 { 132 break; // stop file check 133 } 134 } 135 } 136 // return nPages; 137 } 138 139 /** 140 * convert a picture to a new picture with 340 pixel width. 141 * @param _sJPEGFilename 142 */ 143 public static void convertToNearSameFileWithWidth340(String _sJPEGFilename) 144 { 145 ParameterHelper aParam = new ParameterHelper(param); 146 if (! aParam.createSmallPictures()) 147 { 148 return; 149 } 150 String sJPEGFilename = _sJPEGFilename.replaceAll("\\\\", "/"); 151 // if (OSHelper.isWindows()) 152 // { 153 // sJPEGFilename = sJPEGFilename.replaceAll("/", "\\\\"); 154 // } 155 String sNewJPEGFilename; 156 sNewJPEGFilename = util.utils.replaceAll13(sJPEGFilename, ".jpg", "_w340.jpg"); 157 convertToWidth340(sJPEGFilename, sNewJPEGFilename); 158 } 159 160 /** 161 * convert chart2_Regression.ods.ps_180DPI_0001.jpg -filter Catrom -resize 162 340x chart2_Regression.ods.ps_180DPI_0001_w340.jpg 163 164 Point wie bisher 165 Cubic schlecht, weil unscharf 166 ... 167 Triangle ganz brauchbar (default?) 168 Catrom am besten 169 170 * @param _sFrom 171 * @param _To 172 */ 173 private static void convertToWidth340(String _sFrom, String _To) 174 { 175 // int nResult = 0; 176 177 String sConvertEXE = "convert"; 178 if (OSHelper.isLinuxIntel()) 179 { 180 sConvertEXE = "convert"; 181 } 182 if (OSHelper.isWindows()) 183 { 184 // TODO! 185 // HACK Hard coded! 186 // sConvertEXE = "C:\\Programme\\ImageMagick-6.0.3-q8\\convert.exe"; 187 sConvertEXE = "convert.exe"; 188 String sConvertPath = (String)param.get("imagemagick.path"); 189 if (sConvertPath != null) 190 { 191 sConvertEXE = FileHelper.appendPath(sConvertPath, sConvertEXE); 192 } 193 } 194 195 String[] sCommandArray = 196 { 197 sConvertEXE, 198 _sFrom, 199 "-filter", "Catrom", 200 "-resize", "340x", 201 _To 202 }; 203 ProcessHandler aHandler = new ProcessHandler(sCommandArray); 204 boolean bBackValue = aHandler.executeSynchronously(); 205 int nExitCode = aHandler.getExitCode(); 206 207 String sBack = aHandler.getOutputText(); 208 if (sBack.length() > 0) 209 { 210 GlobalLogWriter.println("'" + sBack + "'"); 211 } 212 // try to interpret the result, which we get as a String 213 // try 214 // { 215 // int nIdx = sBack.indexOf("\n"); 216 // if (nIdx > 0) 217 // { 218 // sBack = sBack.substring(0, nIdx); 219 // } 220 // 221 // nResult = Integer.valueOf(sBack).intValue(); 222 // } 223 // catch(java.lang.NumberFormatException e) 224 // { 225 // GlobalLogWriter.get().println("Number format exception"); 226 // nResult = 0; 227 // } 228 // return nResult; 229 } 230 231 /** 232 * create out of a given Postscript/PDF _sFile a list of JPEGs, one for every page 233 * @param _sFile 234 * @param _sAdditional 235 * @param _aParam 236 * @return the schema of the first jpeg name 237 */ 238 String createJPEG(String _sFile, String _sAdditional, ParameterHelper _aParam) 239 { 240 if (_sFile.startsWith("file:///")) 241 { 242 _sFile = FileHelper.getSystemPathFromFileURL(_sFile); 243 } 244 File aFile = new File(_sFile); 245 if (aFile.exists()) 246 { 247 String sAbsFile = aFile.getAbsolutePath(); 248 if (!sAbsFile.equals(_sFile)) 249 { 250 _sFile = sAbsFile; 251 } 252 } 253 else 254 { 255 GlobalLogWriter.println("File: '" + _sFile + "' doesn't exist."); 256 return ""; 257 } 258 String sFileDir = FileHelper.getPath(_sFile); 259 String sBasename = FileHelper.getBasename(_sFile); 260 // String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename); 261 262 String sTmpDir = util.utils.getUsersTempDir(); 263 if (_aParam.getOutputPath() != null) 264 { 265 sTmpDir = _aParam.getOutputPath(); 266 } 267 268 String sJPEGNameSchema = ""; 269 if (_sFile.toLowerCase().endsWith("ps") || 270 _sFile.toLowerCase().endsWith("prn") || 271 _sFile.toLowerCase().endsWith("pdf")) 272 { 273 // seems to be a Postscript of PDF file 274 275 sJPEGNameSchema = createJPEGsFromPostscript(sTmpDir, sFileDir, sBasename, _aParam.getResolutionInDPI()); 276 } 277 else if (_sFile.toLowerCase().endsWith("jpg") || 278 _sFile.toLowerCase().endsWith("jpeg")) 279 { 280 // do nothing, it's already a picture. 281 return _sFile; 282 } 283 else 284 { 285 // we assume it's an office document. 286 // Office files will not handled here, we need a PS or PDF file 287 } 288 return sJPEGNameSchema; 289 } 290 291 private String getJPEGName(String _sOutputPath, String _sBasename, int _nResolutionInDPI, String _sGS_PageOutput) 292 { 293 // String fs = System.getProperty("file.separator"); 294 String sName = _sBasename + "_" + String.valueOf(_nResolutionInDPI) + "DPI_" + _sGS_PageOutput + ".jpg"; 295 String sJPEGName = FileHelper.appendPath(_sOutputPath, sName); 296 return sJPEGName; 297 } 298 299 /** 300 * Create via ghostscript (gs) from the reference file for every page a JPEG file 301 * 302 * MUST set: 303 * m_sOutputPath, m_sReferenceFile, m_sReferencePath 304 * 305 * return exit code from gs command 306 */ 307 308 private static final String m_sGS_PageOutput = "%04d"; 309 310 private String createJPEGsFromPostscript(String _sOutputPath, String _sSourcePath, String _sSourceFile, int _nResolutionInDPI) 311 { 312 FileHelper.makeDirectories("", _sOutputPath); 313 314 // create a jpeg from original prn 315 // String fs = System.getProperty("file.separator"); 316 317 String sJPEGNameSchema = getJPEGName(_sOutputPath, _sSourceFile, _nResolutionInDPI, m_sGS_PageOutput); 318 String sPostscriptOrPDFFile = FileHelper.appendPath(_sSourcePath, _sSourceFile); 319 String sGhostscriptEXE = "gs"; 320 if (OSHelper.isWindows()) 321 { 322 sGhostscriptEXE = "gswin32c.exe"; 323 String sGhostscriptEXE2 = (String)param.get("gs.exe"); 324 if (sGhostscriptEXE2 != null) 325 { 326 sGhostscriptEXE = sGhostscriptEXE2; 327 } 328 String sGhostscriptPath = (String)param.get("gs.path"); 329 if (sGhostscriptPath != null) 330 { 331 sGhostscriptEXE = FileHelper.appendPath(sGhostscriptPath, sGhostscriptEXE); 332 } 333 } 334 335 // String sCommand = sGhostscriptEXE + " -dNOPROMPT -dBATCH -sDEVICE=jpeg -r" + String.valueOf(_nResolutionInDPI) + " -dNOPAUSE -sOutputFile=" + StringHelper.doubleQuoteIfNeed(sJPGFilename) + " " + StringHelper.doubleQuoteIfNeed(sOriginalFile); 336 String[] sCommandArray = 337 { 338 sGhostscriptEXE, 339 "-dNOPROMPT", 340 "-dBATCH", 341 "-sDEVICE=jpeg", 342 "-r" + String.valueOf(_nResolutionInDPI), 343 "-dNOPAUSE", 344 "-sOutputFile=" + sJPEGNameSchema, 345 sPostscriptOrPDFFile 346 347 348 349 }; 350 // System.out.println("Start Command array"); 351 // try 352 // { 353 // Runtime.getRuntime().exec(sCommandArray); 354 // } catch (Exception e) { 355 // System.out.println("FAILED"); 356 // } 357 // System.out.println("done"); 358 359 // TODO: gives ghostscript an error we can handle? 360 ProcessHandler aHandler = new ProcessHandler(sCommandArray); 361 boolean bBackValue = aHandler.executeSynchronously(); 362 assure("There seems to be a problem with ghostscript", bBackValue, true); 363 int nExitCode = aHandler.getExitCode(); 364 // ArrayList m_aFileList = new ArrayList(); 365 366 // String sJPEGNameSchema = ""; 367 if (nExitCode == 0) 368 { 369 // TODO: return a real filename, due to the fact we don't know how much files are created, maybe better to return a list 370 int nPages = countPages(sJPEGNameSchema); 371 if (nPages == 0) 372 { 373 // return only a valid schema name if there at least one page. 374 sJPEGNameSchema = ""; 375 assure("Document '" + sPostscriptOrPDFFile + "' doesn't create pages.", false, true); 376 } 377 } 378 else 379 { 380 assure("There seems to be a problem with ghostscript and '" + sPostscriptOrPDFFile + "' exit code: " + nExitCode, false, true); 381 GlobalLogWriter.println("Warning: There seems to be a problem with '" + sGhostscriptEXE + "'..."); 382 } 383 // String[] aList = new String[m_aFileList.size()]; 384 // aList = (String[])m_aFileList.toArray(aList); 385 return sJPEGNameSchema; // sNewJPEGFilename; 386 } 387 388 public static String getFilenameForJPEGSchema(String _sJPEGSchema, int _nPage) 389 { 390 if (_nPage < 1 || _nPage > 9999) 391 { 392 return ""; 393 } 394 final String sFilename = util.utils.replaceAll13(_sJPEGSchema, m_sGS_PageOutput, StringHelper.createValueString(_nPage, 4)); 395 return sFilename; 396 } 397 398 /** 399 * Return the number of really exists JPEG files 400 * Give a JPEG Schema which contains something like '%04d' which will be converted by a number between 0001 and 9999 always 401 * with leading '0' (zero) 402 * @param _sJPEGSchema 403 * @return number of really existing pages of a given JPEG schema 404 */ 405 public int countPages(String _sJPEGSchema) 406 { 407 int nPages = 0; 408 if (_sJPEGSchema.length() > 0) 409 { 410 // TODO: if there doesn't exists a '%04d' in the schema we will return 9999 which is a little bit wrong here. 411 for (int i=1;i<10000;i++) 412 { 413 String sNewJPEGFilename = getFilenameForJPEGSchema(_sJPEGSchema, i); 414 if (FileHelper.exists(sNewJPEGFilename)) 415 { 416 // m_aFileList.add(sNewJPEGFilename); // as long as the files exist, fill the array 417 nPages ++; 418 } 419 else 420 { 421 break; // stop file check 422 } 423 } 424 } 425 return nPages; 426 } 427 428 // public static void main(String [] _args) 429 // { 430 //// DONE: give an index.ini file ok 431 //// String args[] = { 432 //// "-TimeOut", "3600000", 433 //// "-tb", "java_complex", 434 //// "-o", "graphical.JPEGCreator", 435 //// "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\index.ini", 436 //// "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output", 437 //// "-DOC_COMPARATOR_PRINT_MAX_PAGE", "9999", 438 //// "-DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION", "180", 439 //// "-DOC_COMPARATOR_HTML_OUTPUT_PREFIX", "http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/cw.php?inifile=", 440 ////// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "PDF", /* default: "OOo" */ 441 ////// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "msoffice", /* default: "OOo" */ 442 ////// "-OFFICE_VIEWABLE", "false", 443 //// "-AppExecutionCommand", "\"C:/Programme/sun/staroffice 9/program/soffice.exe\" -norestore -nocrashreport -accept=pipe,name=ll93751;urp;", 444 //// "-NoOffice" 445 //// }; 446 // 447 //// Done: give a directory, where exist pdf/ps files ok. 448 //// Done: inputpath (given file) doesn't exists, ok. 449 //// Done: give a ps/pdf file. ok. 450 // 451 // String args[] = { 452 // "-TimeOut", "3600000", 453 // "-tb", "java_complex", 454 // "-o", "graphical.JPEGCreator", 455 // "-DOC_COMPARATOR_INPUT_PATH", "C:\\CWS\\temp\\output\\Names7.odt.pdf", 456 // "-DOC_COMPARATOR_OUTPUT_PATH", "C:\\CWS\\temp\\output", 457 // "-DOC_COMPARATOR_PRINT_MAX_PAGE", "9999", 458 // "-DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION", "180", 459 // "-DOC_COMPARATOR_HTML_OUTPUT_PREFIX", "http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/cw.php?inifile=", 460 //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "PDF", /* default: "OOo" */ 461 //// "-DOC_COMPARATOR_REFERENCE_CREATOR_TYPE", "msoffice", /* default: "OOo" */ 462 //// "-OFFICE_VIEWABLE", "false", 463 // "-AppExecutionCommand", "\"C:/Programme/sun/staroffice 9/program/soffice.exe\" -norestore -nocrashreport -accept=pipe,name=ll93751;urp;", 464 // "-NoOffice" 465 // }; 466 // 467 // org.openoffice.Runner.main(args); 468 // } 469 470 } 471