2013-02-13 2 views
0

우리는 다음 명령을 사용하여 고스트 스크립트 9.06을 사용하여 TIFF 파일을 PDF 파일을 변환 바쁜 gswin32 작동합니다 : 이것은 Windows 서버에 자바를 통해 실행고스트 스크립트 : gswin32c은 중단하지만

gswin32c -dNOPAUSE -sDEVICE=tiff24nc -r300 -sCompression=lzw -sOutputFile="C:/destination.tif" "C:/source.pdf" -c quit

대부분의 실행 우리의 배치 도구.

이 파일의 대부분은 훌륭하지만 일부 파일의 경우 프로세스가 멈추고 작업 관리자가 gswin32c.exe 프로세스가 CPU의 0 %를 사용하고 있음을 보여줍니다. 이미 GhostScript가 응답하지 않으면 잠시 후 프로세스를 종료하고 대신 PDFBox를 사용하여 PDF를 변환했습니다.

동일한 명령을 사용할 때 gswin32 도구를 사용하면 변환이 완벽하게 수행되어 명령이 실행될 때마다 GUI 창이 열리고 닫히지 않습니다. 이 때문에 사람들이 서버에서 계속 작업하기 때문에 gswin32을 사용하는 것은 옵션이 아닙니다.

+0

간단한 .ps 파일로 명령을 실행하면 내 컴퓨터에서 9.0.4와 아무런 문제없이 계속 실행됩니다. 문제 해결을 시도하십시오. 다른 .pdf 파일이나 간단한 .ps 파일로 시도해보십시오. -r300 대신 try -r72를 사용하십시오. -s 압축하지 않고 사용해보십시오. tiff24nc와 다른 장치로 시도해보십시오. .pdf를 gsbin 디렉토리에 복사하고 인용 된 "c : /source.pdf"가 아닌 source.pdf 파일을 실행하고 대상에 대해 동일하게 실행 한 다음 dos 디렉토리에서 직접 명령을 실행하십시오. gswin32c source.pdf를 실행 해보십시오. –

답변

1

'-c quit'대신 -dBATCH를 명령 줄에 추가하십시오. PDF 파일이 모두 단일 페이지가 아니라면 출력 파일 이름에도 '% d'을 추가하는 것이 좋습니다.

+0

GS 문서에 따르면 dBATCH는 명령 줄 끝에 -c quit을 입력하는 것과 같습니다. 우리는 또한 각 pdf를 하나의 tiff 파일로 변환하려고합니다. 어쨌든, 나는 당신의 제안을 시도하고 프로세스가 여전히 중단됩니다. –

+1

글쎄, 파일을 볼 수 있으면 http://bugs.ghostscript.com에서 버그 보고서로 열 수 있습니다. 문제 파일을 보지 않고는 더 이상 아무것도 말할 수 없습니다. Postscript이고 PDF 파일을 실행하기 때문에 여전히 '-c quit'을 사용하지 않을 것입니다. – KenS

+0

제안 해 주셔서 감사합니다.하지만 불행히도 Google에서 변환하는 문서는 법적 문서이며이를 공유 할 권한이 없습니다. 이제 임시 솔루션으로'gswin32' 프로세스를 최소화했습니다. –

1

이 문제는 Ghostscript와는 아무런 관련이 없습니다. ProcessBuilder로 실행하여 출력을 Standard로 보내는 모든 프로그램에서 문제가 발생합니다. Windows는 텍스트의 제한된 양만을 버퍼링하므로, java 프로그램에서 출력을 읽지 않으면 호출 된 프로세스가 중단됩니다. 따라서 pdf로 변환하면 상태 메시지가 약간만 생성 될 때 gswin32c를 성공적으로 실행할 수 있습니다. 그러나 많은 페이지가있는 파일을 변환하면 프로세스가 중단됩니다. 해결책은 Java 프로그램에서 호출 된 프로세스의 출력을 읽는 것입니다.

ProcessBuilder processBuilder = new ProcessBuilder(
    "C:\\Program Files (x86)\\gs\\gs9.10\\bin\\gswin32c.exe", "-sDEVICE=\"pdfwrite\"", 
    "-dNOPAUSE", "-dBATCH", "-dSAFER", "-dQUIET", "-sOUTPUTFILE=\"" + fileName + ".pdf\"", "\"" 
    + fileName + ".ps\""); 
processBuilder.redirectErrorStream(true); //Redirect Error Stream to Standard Inputstream so that we have to read only Standard in 
Process process = processBuilder.start(); 
InputStream is = process.getInputStream(); 
BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
String line; 
while ((line = rd.readLine()) != null) { 
    System.out.println(line); 
} 
rd.close(); 
process.waitFor();