У меня есть следующий код, который берет файл PDF и объединяет его в одно изображение jpg, которое имеет горизонтальную черную линию между каждым изображением страницы PDF, складывая страницы PDF.
image = MiniMagick::Image.open(pdf_file)
# create a new blank file which we will use to build a composite image
# containing all of our pages
MiniMagick::Tool::Convert.new do |i|
i.size "#{image.width}x#{image.layers.size * image.height}"
i.stroke "black"
image.layers.count.times.each do |ilc|
next if ilc.zero?
top = ilc * (image.height + 1)
i.draw "line 0,#{top}, #{image.width},#{top}"
end
i.xc "white"
i << image_file_name
end
composite_image = MiniMagick::Image.open(image_file_name)
# For each pdf page, add it to our composite image. We add one so that we
# don't put the image over the 1px black line that was added to separate
# pages.
image.layers.count.times do |i|
composite_image = composite_image.composite(image.layers[i]) do |c|
c.compose "Over" # OverCompositeOp
c.geometry "+0+#{i * (image.height + 1)}"
end
end
composite_image.format(format)
composite_image.quality(85)
composite_image.write(image_file_name)
Он работает отлично, за исключением того, что файл PDF на 20 страниц занимает три минуты. Я ищу лучший способ сделать это. Я подозреваю, что один из этих двух вариантов будет работать:
- Скомпонуйте все изображения страницы PDF одновременно, хотя я не понял, как это сделать.
- Используйте vips благодаря конвейерной реализации.
Я предпочел бы остаться с imagemagick, но я открыт для любого пути. Я ищу указатели, как достичь того, что я ищу.