Sử dụng Ghostscript, nhưng bảo nó không xử lý lại hình ảnh?


30

Tôi có một bản PDF đã được nén và có phần hình ảnh giả tạo và tôi đang sử dụng Ghostscript để thêm một trang tiêu đề cho bản PDF đó.

Tuy nhiên, tôi không thể tìm cách nào để bảo GS chỉ sử dụng các hình ảnh hiện có mà không xử lý lại chúng, và bây giờ tôi cảm thấy như có gì đó liên quan đến cách thức hoạt động của GS, tức là bạn không thể biên dịch lại / liên kết PDF mà không xử lý lại hình ảnh của nó .. Điều đó có đúng không?

Tôi có thể tăng cài đặt DPI trong GS, nhưng nó sẽ tăng từ 5MB lên 60 MB trong khi vẫn trông tệ hơn.

Có sự thay thế nào tốt hơn cho GS sẽ làm những gì tôi cần (tốt nhất là sẽ biên dịch trên OS X) không?


Bạn có thể chỉnh sửa câu hỏi của bạn và trích dẫn chính xác dòng lệnh bạn đang sử dụng để thêm trang tiêu đề của bạn vào bản PDF gốc không? Sau đó, tôi có thể cho bạn biết chính xác những gì cần thay đổi hoặc thêm vào dòng lệnh để có được đầu ra tốt hơn cho hình ảnh ...
Kurt Pfeifle

Tôi không muốn nó trông đẹp hơn, tôi muốn hợp nhất mà không cần xử lý lại. Điều này sẽ a) dẫn đến chất lượng tốt hơn (biến đổi không mất dữ liệu) và b) không lãng phí thời gian CPU để xử lý tài liệu 1000 trang của tôi.
Mahmoud Al-Qudsi

1
Xin chào, bạn đã không trả lời câu hỏi của tôi và bạn đã không trích dẫn chính xác dòng lệnh GS bạn đang sử dụng. Điều đó có nghĩa là: bạn sẽ không nhận được sự giúp đỡ về GS mà bạn đang tìm kiếm ...
Kurt Pfeifle

Câu trả lời:


44

Nếu bạn chỉ muốn nối hai tệp PDF mà không xử lý lại nội dung của nó, pdftklà dành cho bạn. (Trên Mac OS X, tính năng này phải có sẵn thông qua MacPorts hoặc Fink, đối với Linux, có các gói gốc cho tất cả các bản phân phối chính; đối với Windows, hãy xem tại đây. ) Hãy thử điều này:

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

Điều này sẽ thêm tiêu đề.pdf vào content.pdf và viết kết quả vào book.pdf .

pdftklà một cách "ngu ngốc", nhưng rất nhanh để ghép hai (hoặc nhiều) tệp PDF. "Ngốc" cho đến nay, vì pdftkkhông có cách nào giải thích luồng dữ liệu PDF, nó chỉ đảm bảo rằng các số đối tượng bên trong được chia sẻ lại khi cần và xuất hiện trong xrefcấu trúc PDF (về cơ bản là một loại ToC PDF cho các đối tượng).

Bản thảo

Nếu bạn muốn sử dụng Ghostscript, lệnh cơ bản để ghép hai tệp giống nhau sẽ là:

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

Tuy nhiên, như bạn đã trải nghiệm, dòng lệnh đơn giản này có thể làm rối loạn chất lượng hình ảnh của bạn. Lý do là Ghostscript không bị 'đổ' khi xử lý các tệp PDF: nó hoàn toàn giải thích chúng khi đọc và tạo một tệp hoàn toàn mới khi viết kết quả. Để tạo kết quả, nó sẽ tự động sử dụng các cài đặt mặc định cho nhiều chi tiết trong quá trình xử lý tổng thể. Những mặc định này sẽ được áp dụng cho tất cả các trường hợp mà các yêu cầu của nó đã không hướng dẫn Ghostscript theo cách khác.

Vì vậy, phương pháp của Ghostscript để tạo ra book.pdf mới "thông minh" hơn (nhưng cũng chậm hơn nhiều) so với pdftkphương pháp của. . chúng chỉ bằng các tham chiếu, v.v. - và tổng thể tạo ra các tệp nhỏ hơn, được tối ưu hóa tốt hơn từ các tệp PDF đầu vào cồng kềnh ...)

Giải pháp là không để Ghostscript sử dụng mặc định của nó: bằng cách thêm nhiều tham số tùy chỉnh vào dòng lệnh.

Nó có nghĩa là "Ghostscript 'diễn giải' đầu vào PDF của nó" là gì?

Tất cả các tệp và nội dung của nó (đối tượng, luồng, phông chữ, hình ảnh, ...) đều được đọc, kiểm tra và giữ trong biểu diễn bên trong của chính nó, trước khi đưa ra tệp PDF kết quả với các đối tượng PDF của nó một lần nữa. Tuy nhiên, khi 'nhổ ra', Ghostscript sẽ áp dụng tất cả các cài đặt mặc định bên trong của nó cho hàng trăm tham số [*] có sẵn.

Thật không may, điều này gây ra "xử lý lại" hình ảnh của bạn theo các cài đặt mặc định này - chỉ có thể tránh hoặc ghi đè bằng cách thêm các tham số dòng lệnh (mong muốn) của riêng bạn.

Sự cố hình ảnh của bạn có thể do nhu cầu của Ghostscript (do vấn đề cấp phép) để mã hóa lại hình ảnh JPEG2000 thành mã hóa JPEG. Nếu bạn muốn tránh điều này, hãy thêm dòng sau vào dòng lệnh của bạn:

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

Các tùy chọn dòng lệnh liên quan đến hình ảnh khác để xem xét bao gồm:

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

Vì vậy, dòng lệnh Ghostscript hoàn chỉnh có thể khiến bạn hài lòng nên đọc:

 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

Bạn cũng có thể yêu cầu Ghostscript KHÔNG nén hình ảnh trong tệp PDF đầu ra, bằng cách sử dụng dòng lệnh này:

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

.


[*]:
Nếu bạn muốn tìm hiểu về danh sách đầy đủ các cài đặt mặc định mà thiết bị pdfwrite của Ghostscript đang sử dụng , hãy chạy lệnh sau. Nó trả về cho bạn danh sách đầy đủ :

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

Để giải thích về ý nghĩa chính xác của tất cả các tham số này, bạn sẽ phải đọc tài liệu Adobe về "Thông số chưng cất" . Ghostscript cố gắng hết sức để bắt chước tất cả ...


3
(FYI) Trong trường hợp của tôi, những lá cờ dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagesnguyên nhân các tập tin đầu ra để trở thành một lô lớn hơn. Bằng cách loại bỏ chúng, kích thước tệp đã thay đổi từ 22MB thành 3,1 MB và chất lượng hình ảnh có vẻ chính xác như khi sử dụng các cờ này. Tất cả các độc đáo cờ với tôi sử dụng là: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor

@Kurt Pfeifle Tùy chọn nào được phép sử dụng -dColorImageFilter? Tôi chỉ có thể tìm FlateEncodeDCTEncode. DCT dường như làm JPEG (tại sao họ mã hóa nó?). Tôi nghĩ FLATE là một tùy chọn lỗi thời cho hình ảnh bởi vì bằng sáng chế của Bell Labs trên LZW không còn là vấn đề nữa? Tuy nhiên, sau khi dành khá nhiều thời gian để tìm kiếm, tôi không thể tìm thấy cách sử dụng PNG (hoặc bất cứ thứ gì khác) ... Hình ảnh ban đầu của tôi là PNG và tôi muốn chúng không thay đổi. Tôi đã thử tùy chọn -c, nhưng nó mang lại cho tôi -c can only be used in a built with POSTSCRIPT included....
Louis Bolog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.