У меня был удар в ruby-vips версия:
require 'vips'
# n: is the number of pages to load, -1 means all pages in tall, thin image
image = Vips::Image.pdfload ARGV[0], n: -1
# we can get the number of pages and the height of each page from the metadata
n_pages = image.get 'pdf-n_pages'
page_height = image.get 'page-height'
# loop down the image cutting it into an array of separate pages
pages = (0 ... n_pages).map do |page_number|
image.crop(0, page_number * page_height, image.width, page_height)
end
# make a 50-pixel-high black strip to separate each page
strip = Vips::Image.black image.width, 50
# and join the pages again
image = pages.inject do |acc, page|
acc.join(strip, 'vertical').join(page, 'vertical')
end
image.write_to_file ARGV[1]
На этом рабочем столе с этой 58-страничной PDF Я вижу:
$ /usr/bin/time -f %M:%e ruby ./pages.rb nipguide.pdf x.jpg
152984:1.08
$ vipsheader x.jpg
x.jpg: 595x50737 uchar, 3 bands, srgb, jpegload
Таким образом, он создает JPG высотой 50 000 пикселей примерно за 1,1 секунды и требует пика в 150 Мб памяти.
Я попробовал умную линию fmaw42 imagemagick:
$ /usr/bin/time -f %M:%e convert nipguide.pdf -background black -gravity south -splice 0x50 -append x.jpg
492244:5.16
так500 мб памяти и 5,2 с.Это делает изображение почти точно такого же размера.
Разница в скорости, по большей части, заключается в библиотеке рендеринга PDF, разумеется: IM отправляется в ghostscript, тогда как ruby-vips вызывает poppler или PDFium напрямую.libvips может выполнять потоковую передачу этой программы, поэтому во время оценки в ней не должно быть более одной страницы одновременно.
JPG имеет ограничение в 65535 пикселей по любой оси, поэтому вы не сможете получить многобольше, чем это.Для более коротких документов вы можете добавить dpi: 300
к загрузке PDF, чтобы получить больше деталей.По умолчанию установлено значение 72 dpi.
Вы должны получить хорошее качество текста без необходимости рендеринга в высоком разрешении.Например, для PDF-файла, на который есть ссылка выше, при запуске:
$ vips pdfload nipguide.pdf x.png --page 12
Чтобы отобразить страницу 12 с разрешением 72 т / д по умолчанию, я получаю: