Chuyển đổi pdf sang jpg nhanh trên Linux muốn [đóng]


11

Tôi hiện đang sử dụng ImageMagick để chuyển đổi PDF thành hình ảnh raster JPEG. Nó rất chậm và sử dụng rất nhiều bộ nhớ.

Lệnh tôi đã sử dụng là:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg

Tôi đoán rằng nó chậm vì nó sử dụng Ghostscript. Nhưng phải có cách nhanh hơn để làm điều đó trên hộp Linux.

Có ai tìm thấy một giải pháp tốt hơn?


Bao nhiêu thời gian, bao nhiêu bộ nhớ?
Zoredache

Câu trả lời:


18

Sử dụng trực tiếp Ghostscript (thay vì sử dụng convertlệnh của ImageMagick , gọi gián tiếp Ghostscript) thực sự nhanh hơn. Và nó cung cấp cho bạn nhiều quyền kiểm soát hơn về các tham số chuyển đổi. Thử

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf

Ở đâu

  • -o: xác định đường dẫn đầu ra + tên tệp (và lưu sử dụng -dBATCH -dNOPAUSE)
  • -dJPEGQ: đặt chất lượng JPEG thành 95%
  • -r: đặt độ phân giải thành 600dpi
  • -g: đặt kích thước hình ảnh thành 4960x7016px
  • -sDEVICE: đặt đầu ra dưới dạng JPEG

Lệnh này có thể sẽ vẫn làm chậm cho bạn và tạo các tệp lớn hơn dự kiến. Đối với các tệp nhỏ hơn và thực thi nhanh hơn, hãy thử điều này (có thể gần với chất lượng đầu ra của convertdòng lệnh của bạn ):

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_200dpi_q80.jpg \
   -dJPEGQ=80      \
   -r200x200       \
   -g1653x2339     \
   foo.pdf

hoặc thậm chí

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf

(cung cấp độ phân giải 72dpi, thường đủ tốt cho hầu hết các màn hình và cho hầu hết các ứng dụng web).


1
Bạn đúng. Tôi thực sự không nghĩ rằng Imagemagick sẽ là nút cổ chai. Nhưng có lẽ tôi nên thử. Cũng cảm ơn vì những ví dụ tuyệt vời!
mat3001

10

BTW, một trong những lý do khiến ImageMagick chậm hơn rất nhiều là vì nó gọi Ghostscript hai lần. Nó không chuyển đổi PDF => PNG trong một lần, nhưng sử dụng 2 bước khác nhau:

  • đầu tiên nó sử dụng Ghostscript để PDF => PostScriptchuyển đổi;
  • sau đó sử dụng Ghostscript để PostScript => PNGchuyển đổi.

Bạn có thể tìm hiểu về các cài đặt chi tiết "đại biểu" của ImageMagick (các chương trình bên ngoài mà ImageMagick sử dụng, như Ghostscript) bằng cách nhập

convert -list delegate

(Trên hệ thống của tôi đó là danh sách 32 lệnh khác nhau.) Bây giờ để xem lệnh nào được sử dụng để chuyển đổi sang PNG, hãy sử dụng lệnh này:

convert -list delegate | grep -i png

Ok, cái này là dành cho Linux. Nếu bạn đang dùng Windows, hãy thử điều này:

convert -list delegate | findstr /i png

Bạn sẽ khám phá ra rằng IM chỉ tạo ra PNG từ đầu vào PS hoặc EPS. Vậy làm thế nào để IM có được (E) PS từ PDF của bạn? Dễ dàng:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

Ah! Nó sử dụng Ghostscript để thực hiện chuyển đổi PDF => PS, sau đó sử dụng lại Ghostscript để thực hiện chuyển đổi PS => PNG. Hoạt động, nhưng không phải là cách hiệu quả nhất nếu bạn biết rằng Ghostscript có thể thực hiện PDF => PNG trong một lần. Và nhanh hơn. Và với chất lượng tốt hơn nhiều.

Về việc IM xử lý chuyển đổi PDF thành hình ảnh thông qua đại biểu Ghostscript, bạn nên biết hai điều đầu tiên và quan trọng nhất:

  1. Theo mặc định, nếu bạn không cung cấp thêm tham số, Ghostscript sẽ xuất hình ảnh với độ phân giải 72dpi. Đó là lý do tại sao đôi khi mọi người ở đây đề nghị thêm -density 600dưới dạng converttham số cho Ghostscript sử dụng độ phân giải 600 dpi cho đầu ra hình ảnh của nó.
  2. Đường vòng của IM để gọi Ghostscript hai lần để chuyển đổi đầu tiên PDF => PSvà sau đó PS => PNGlà một sai lầm thực sự. Bởi vì bạn không bao giờ chiến thắng và harldy giữ chất lượng trong bước đầu tiên, nhưng rất thường mất một số. Lý do:
    • PDF có thể xử lý trong suốt, điều mà PostScript không thể.
    • PDF có thể nhúng phông chữ TrueType, điều mà PostScript không thể. v.v.
      (Chuyển đổi theo hướng ngược lại PS => PDF, do đó không quan trọng ....)

Đó là lý do tại sao tôi đề nghị bạn chuyển đổi các tệp PDF của mình trong một lần sang PNG (hoặc JPEG) bằng cách sử dụng Ghostscript trực tiếp. Và sử dụng phiên bản mới nhất 8.71 (sắp được phát hành: 9.00) của Ghostscript ...


6

Chương trình pdftoppmtừ gói poppler cũng có thể tạo JPEG và đối với tôi, nó nhanh gấp đôi so với sử dụng gsnhư mô tả ở trên:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg

Thật là một gợi ý tuyệt vời. Chỉ cần sửa một lỗi lớn, sự cố ứng dụng mà tôi chuyển sang pdftoppm nhờ câu trả lời này - chưa bao giờ biết về nó trước đây!
danmactough

Thưa ngài, xứng đáng nhận huy chương cho việc này :)
Milan Todorovic

2
nó không nhanh hơn gs
Ghilas BELHADJ

6

Theo kinh nghiệm của tôi, MuPDF nhanh hơn Ghostscript rất nhiều. Đây là một dự án mới hơn nhiều mà không cần nhiều tiền trong gs. Hãy thử nếu nó phù hợp với usecase của bạn!

mudraw -w 1024 -h 768 -r 200 -c rgb -o bar%d.png foo.pdf

Nếu bạn có bản phân phối linux cũ hơn và các công cụ mupdf được cài đặt từ kho lưu trữ, mudrawvẫn có thể được gọipdfdraw

Sau đó, bạn phải chuyển đổi png thành jpeg bằng cách sử dụng ví dụ hình ảnh. Nhưng nó vẫn sẽ nhanh hơn Ghostscript.


2
Trong thử nghiệm của tôi, khả năng hội tụ PDF sang PNG của MuPDF nhanh hơn khoảng 5-6 lần so với Ghostscript. Cảm ơn bạn cho giải pháp!
Dmitry Akinin

1
Điều này là vô cùng hữu ích. Phải mất vài giây, trong đó Ghostscript sẽ mất vài phút, cộng với dòng lệnh là dễ dàng! Cảm ơn bạn rất nhiều vì đã chú ý đến điều này!
likeitlikeit
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.