Witam,
Korzystając z GhostScript'a chcę zmniejszyć rozmiar plików pdf.
Poniżej wklejam procedurę którą do tego wykorzystuje. Jednak mam następujący problem - gdy przetwarzam "małe" pliki pdf o rozmiarze ok. 5mb wszytko działa prawidłowo, natomiast gdy przetwarzam plik o rozmiarze 70mb program się "zawiesza" tzn. wywoływany jest Ghostscript, tworzony jest plik w lokalizacji docelowej o rozmiarze 0 i ten rozmiar nie przyrasta. Dopiero gdy zamknę okno z programem java plik jest dalej przetwarzany. Skąd bierze się ten przestój i konieczność zamknięcia okna programu?
Dla małych plików jest wszystko OK.
public void compres(File file, String pathOut) {
StringBuilder sb = new StringBuilder();
String ls = System.getProperty("line.separator");
System.setProperty("jna.debug_load", "true");
System.setProperty("jna.debug_load.jna", "true");
String path = System.getProperty("user.dir")+"\\dll";
System.setProperty("jna.library.path", path);
System.out.println(path);
String fileGS = null;
if (System.getProperty("os.arch").equals("amd64")) {
fileGS = "gswin64c.exe";
}else{
fileGS = "gswin32c.exe";
};
String inFile = file.getAbsolutePath();
String name = file.getName();
if(name.endsWith(".pdf")){
System.out.println ("Kompresuje " + inFile);
sb.append("Kompresuje ").append(inFile).append(ls);
try {
String outFile = pathOut+"out_"+name;
System.out.println("Zapisuje plik: " + outFile);
sb.append("Zapisuje plik: ").append(outFile).append(ls);
String argum = " -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -dNOPAUSE -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=";
String inFileName = " " + inFile;
String[] commands = {"cmd", "/c", "start", "\"Kompresor\"",fileGS,argum,outFile,inFileName};
String test = fileGS+argum+outFile+inFileName;
Process p = Runtime.getRuntime().exec(test);
sb.append("Zaczynam przetwarzac plik: ").append(outFile).append(ls);
p.waitFor();
sb.append("Koniec przetwarzania pliku plik: ").append(outFile).append(ls);
} catch (IOException | InterruptedException e) {
System.out.println("ERROR: " + e.getMessage());
sb.append("ERROR: ").append(e.getMessage()).append(ls);
}
}
this.log = sb.toString();
}