고스트 스크립트를 사용하지만 이미지를 다시 처리하지 말라고 알려주시겠습니까?


28

이미 압축되어 다소 유물 이미지가있는 PDF가 있으며 Ghostscript를 사용하여 제목 페이지를 해당 PDF 앞에 추가합니다.

그러나 기존 이미지를 그대로 다시 처리하지 않고 그대로 사용하도록 GS에 지시하는 방법을 찾을 수 없으며 이제 GS가 작동하는 방식과 관련이있는 것처럼 느껴집니다. 예를 들어 PDF를 다시 컴파일 / 링크 할 수 없습니다 이미지를 다시 처리하지 않고 .. 사실입니까?

GS에서 DPI 설정을 올릴 수는 있지만 여전히 더 나빠 보이지만 5MB에서 60MB로 증가 합니다.

내가 원하는 것을 할 수있는 더 나은 대안이 있습니까 (바람직하게 OS X에서 컴파일됩니다)?


질문을 편집하고 제목 페이지를 원본 PDF 앞에 추가하는 데 사용하는 정확한 명령 줄을 인용 할 수 있습니까? 그럼 정확히 ... 변경하거나 이미지에 대한 더 나은 결과를 얻기 위해 명령 줄에 추가 할 무엇을 말할 수
커트 Pfeifle

나는 단지 더 나아 보이게하고 싶지 않고 재 처리없이 병합하고 싶습니다. 이것은 a) 더 나은 품질 (무손실 변환)을 초래하고 b) 1000+ 페이지 문서를 처리하는 데 CPU 시간을 낭비하지 않습니다.
Mahmoud Al-Qudsi

1
이봐, 당신은 내 질문에 대답하지 않았고 사용중인 정확한 GS 명령 줄을 인용하지 않았습니다. 즉, 당신은 당신이 찾고있는 GS에 관한 도움을받지 못할 것입니다.
Kurt Pfeifle

답변:


42

내용을 다시 처리하지 않고 두 개의 PDF 파일을 연결하려는 경우 pdftk에 적합합니다. Mac OS X에서는 MacPorts 또는 Fink를 통해 사용할 수 있으며 Linux의 경우 모든 주요 배포판에 대한 기본 패키지가 있습니다 (Windows의 경우 여기 참조 ).

 pdftk title.pdf content.pdf cat output book.pdf

title.pdfcontent.pdf 앞에 추가하고 결과를 book.pdf에 씁니다 .

pdftk"벙어리"이지만 두 개 이상의 PDF 파일을 연결하는 매우 빠른 방법입니다. "Dumb" 는 PDF 데이터 스트림 pdftk을 어떤 식 으로든 해석 하지 않으므로 내부 객체 번호를 필요에 따라 다시 변환하고 PDF xref구조 (기본적으로 PDF ToC 의 일종 임) 에 표시되도록합니다. 사물).

고스트 스크립트 :

Ghostscript를 사용하려면 동일한 두 파일을 연결하는 기본 명령은 다음과 같습니다.

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

그러나 경험 한 것처럼이 간단한 명령 줄은 이미지 품질을 떨어 뜨릴 수 있습니다. 그 이유는 PDF를 처리 할 때 Ghostscript가 '덤프'되지 않기 때문입니다. 읽을 때 PDF를 완전히 해석 하고 결과를 작성할 때 완전히 새로운 파일을 만듭니다. 결과를 작성하기 위해 전체 처리에서 많은 세부 사항에 대해 기본 설정을 자동으로 사용합니다. 이 기본값은 호출이 Ghostscript에 다른 지시를하지 않은 모든 경우에 적용됩니다.

따라서 새로운 book.pdf 를 만드는 Ghostscript의 방법은의 방법 보다 훨씬 "지능적인"(그러나 훨씬 느리다) 것 pdftk입니다. (많은 경우에 Ghostscript가 PDF 파일을 "복구"할 수있는 범위 내에서 또는 입력 PDF에 포함되지 않은 출력 PDF에 글꼴을 포함 시키거나 중복 이미지를 제거하여 대체 할 수있는 이유이기도합니다. 단순히 참조 등으로-전체적으로 부풀린 입력 PDF에서 작고 더 최적화 된 파일을 만들었습니다 ...)

해결책은 명령 줄에 더 많은 사용자 정의 매개 변수를 추가하여 Ghostscript가 기본값을 사용하지 않도록하는 것입니다.

"Ghostscript가 PDF 입력을 '해석'" 이란 무엇입니까 ?

PDF 파일로 결과 PDF를 다시 추출하기 전에 모든 파일과 그 내용 (개체, 스트림, 글꼴, 이미지 등)을 자체 내부 표현으로 읽고 확인하고 보유합니다. 그러나 '분리'할 때 Ghostscript 는 사용 가능한 수백 개의 매개 변수 [*]에 대한 모든 내부 기본 설정을 적용합니다 .

불행히도,이 기본 설정에 따라 이미지를 "재 처리"합니다.이 명령은 고유 한 (원하는) 명령 줄 매개 변수를 추가하여 피하거나 무시할 수 있습니다.

JPEG2000 이미지를 JPEG 인코딩으로 다시 인코딩하려면 라이센스 문제로 인해 Ghostscript가 필요하기 때문에 이미지 문제가 발생할 수 있습니다. 이를 피하려면 명령 줄에 다음을 추가하십시오.

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

고려해야 할 다른 이미지 관련 명령 줄 옵션은 다음과 같습니다.

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

따라서 여러분을 행복하게 해줄 수있는 완전한 Ghostscript 명령 줄은 다음과 같습니다.

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

다음 명령 줄을 사용하여 출력 PDF에서 이미지를 전혀 압축하지 않도록 Ghostscript에 지시 할 수도 있습니다 .

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.


[*] : Ghostscript의 pdfwrite 장치가 사용
하는 전체 기본 설정 목록에 대해 알아 보려면 다음 명령을 실행하십시오. 전체 목록을 반환 합니다.

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

이러한 모든 매개 변수의 의미에 대한 설명을 보려면 "Distiller Parameters"에 대한 Adobe 설명서 를 읽어야합니다 . 고스트 스크립트는이 모든 것을 모방하려고 매우 노력합니다.


7
뛰어난 답변!
matt wilkie

5
여기는 금입니다!
Vincent

3
(참고) 나의 경우, 플래그 dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImages출력 파일이 많은 대규모되는 원인. 파일을 제거하면 파일 크기가 22MB에서 3.1MB로 변경되었으며 이미지 품질은 이러한 플래그를 사용하는 것처럼 정확하게 나타납니다. 모든 고유의 플래그 I는 사용과 : dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
도르

@Kurt Pfeifle 어떤 옵션이 허용 -dColorImageFilter됩니까? 난 단지 찾을 수 FlateEncodeDCTEncode. DCT는 JPEG를 사용하는 것 같습니다 (암호화 한 이유는 무엇입니까?). LZW에 대한 Bell Labs 특허가 더 이상 문제가되지 않기 때문에 FLATE가 이미지에 대한 오래된 옵션이라고 생각합니다. 그러나 꽤 오랜 시간을 검색 한 후 PNG (또는 다른 것)를 사용하는 방법을 찾을 수 없습니다 ... 원본 이미지는 PNG이며 그대로 유지하고 싶습니다. 나는 -c 옵션을 시도했지만 그것은 나에게 -c can only be used in a built with POSTSCRIPT included....
Louis Somers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.