2012-06-21 08:30:25 -05:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
2008-10-06 05:00:36 -05:00
|
|
|
|
|
|
|
package graphical;
|
|
|
|
|
|
|
|
import helper.OSHelper;
|
|
|
|
import helper.ProcessHandler;
|
|
|
|
import helper.StringHelper;
|
|
|
|
import java.io.File;
|
|
|
|
|
|
|
|
public class JPEGCreator extends EnhancedComplexTestCase
|
|
|
|
{
|
|
|
|
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
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
GlobalLogWriter.println(" Document: " + _sDocumentName);
|
|
|
|
GlobalLogWriter.println(" results: " + _sResult);
|
2008-10-06 05:00:36 -05:00
|
|
|
String sJPEGNameSchema = createJPEG(_sDocumentName, "", _aParams);
|
|
|
|
|
|
|
|
// store information only if jpeg files exists
|
|
|
|
int nPages = countPages(sJPEGNameSchema);
|
|
|
|
if (nPages > 0)
|
|
|
|
{
|
2009-09-07 11:59:04 -05:00
|
|
|
createSmallPictures(sJPEGNameSchema);
|
|
|
|
|
2010-05-10 06:10:10 -05:00
|
|
|
// 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();
|
|
|
|
}
|
|
|
|
|
2008-10-06 05:00:36 -05:00
|
|
|
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);
|
2010-05-10 06:10:10 -05:00
|
|
|
aIniFile.insertValue(sBasename, "tolerance", nTolerance);
|
2008-10-06 05:00:36 -05:00
|
|
|
aIniFile.close();
|
|
|
|
}
|
|
|
|
}
|
2010-05-10 06:10:10 -05:00
|
|
|
else
|
|
|
|
{
|
|
|
|
assure("There are no pages in document:'" + _sDocumentName + "', maybe document currupt?", false, true);
|
|
|
|
}
|
2008-10-06 05:00:36 -05:00
|
|
|
}
|
|
|
|
|
2009-09-07 11:59:04 -05:00
|
|
|
/**
|
|
|
|
* Create a lot of smaller and nicer Pictures of the big fat pages.
|
|
|
|
* Looks better
|
|
|
|
* @param _sJPEGSchema
|
|
|
|
*/
|
|
|
|
public void createSmallPictures(String _sJPEGSchema)
|
|
|
|
{
|
2010-05-10 06:10:10 -05:00
|
|
|
ParameterHelper aParam = new ParameterHelper(param);
|
|
|
|
if (! aParam.createSmallPictures())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-09-07 11:59:04 -05:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
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)
|
|
|
|
{
|
2010-05-10 06:10:10 -05:00
|
|
|
ParameterHelper aParam = new ParameterHelper(param);
|
|
|
|
if (! aParam.createSmallPictures())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2010-02-09 04:07:20 -06:00
|
|
|
String sJPEGFilename = _sJPEGFilename.replaceAll("\\\\", "/");
|
2009-09-07 11:59:04 -05:00
|
|
|
String sNewJPEGFilename;
|
2010-02-09 04:07:20 -06:00
|
|
|
sNewJPEGFilename = util.utils.replaceAll13(sJPEGFilename, ".jpg", "_w340.jpg");
|
|
|
|
convertToWidth340(sJPEGFilename, sNewJPEGFilename);
|
2009-09-07 11:59:04 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
{
|
|
|
|
String sConvertEXE = "convert";
|
|
|
|
if (OSHelper.isLinuxIntel())
|
|
|
|
{
|
|
|
|
sConvertEXE = "convert";
|
|
|
|
}
|
|
|
|
if (OSHelper.isWindows())
|
|
|
|
{
|
2010-02-09 04:07:20 -06:00
|
|
|
// TODO!
|
|
|
|
// HACK Hard coded!
|
2010-05-10 06:10:10 -05:00
|
|
|
// 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);
|
|
|
|
}
|
2009-09-07 11:59:04 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
String[] sCommandArray =
|
|
|
|
{
|
|
|
|
sConvertEXE,
|
|
|
|
_sFrom,
|
|
|
|
"-filter", "Catrom",
|
|
|
|
"-resize", "340x",
|
|
|
|
_To
|
|
|
|
};
|
|
|
|
ProcessHandler aHandler = new ProcessHandler(sCommandArray);
|
2012-06-27 09:22:54 -05:00
|
|
|
aHandler.executeSynchronously();
|
|
|
|
aHandler.getExitCode();
|
2009-09-07 11:59:04 -05:00
|
|
|
|
|
|
|
String sBack = aHandler.getOutputText();
|
|
|
|
if (sBack.length() > 0)
|
|
|
|
{
|
2010-05-10 06:10:10 -05:00
|
|
|
GlobalLogWriter.println("'" + sBack + "'");
|
2009-09-07 11:59:04 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-06 05:00:36 -05:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
{
|
2010-05-10 06:10:10 -05:00
|
|
|
GlobalLogWriter.println("File: '" + _sFile + "' doesn't exist.");
|
2008-10-06 05:00:36 -05:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
String sFileDir = FileHelper.getPath(_sFile);
|
|
|
|
String sBasename = FileHelper.getBasename(_sFile);
|
|
|
|
|
|
|
|
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 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);
|
|
|
|
|
|
|
|
String sJPEGNameSchema = getJPEGName(_sOutputPath, _sSourceFile, _nResolutionInDPI, m_sGS_PageOutput);
|
|
|
|
String sPostscriptOrPDFFile = FileHelper.appendPath(_sSourcePath, _sSourceFile);
|
|
|
|
String sGhostscriptEXE = "gs";
|
|
|
|
if (OSHelper.isWindows())
|
|
|
|
{
|
|
|
|
sGhostscriptEXE = "gswin32c.exe";
|
2010-05-10 06:10:10 -05:00
|
|
|
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);
|
|
|
|
}
|
2008-10-06 05:00:36 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
String[] sCommandArray =
|
|
|
|
{
|
|
|
|
sGhostscriptEXE,
|
|
|
|
"-dNOPROMPT",
|
|
|
|
"-dBATCH",
|
|
|
|
"-sDEVICE=jpeg",
|
|
|
|
"-r" + String.valueOf(_nResolutionInDPI),
|
|
|
|
"-dNOPAUSE",
|
|
|
|
"-sOutputFile=" + sJPEGNameSchema,
|
|
|
|
sPostscriptOrPDFFile
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
// 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();
|
|
|
|
|
|
|
|
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 = "";
|
2010-05-10 06:10:10 -05:00
|
|
|
assure("Document '" + sPostscriptOrPDFFile + "' doesn't create pages.", false, true);
|
2008-10-06 05:00:36 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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 + "'...");
|
|
|
|
}
|
2012-09-26 22:52:17 -05:00
|
|
|
|
2008-10-06 05:00:36 -05:00
|
|
|
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))
|
|
|
|
{
|
|
|
|
nPages ++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
break; // stop file check
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nPages;
|
|
|
|
}
|
|
|
|
}
|