我有以下代码,它获取一个 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)
它工作得很好,除了一个 20 页的 PDF 文件需要三分钟。我正在寻找一种更好的方法来做到这一点。我怀疑这两个选项之一会起作用:
- 一次编写所有 PDF 页面图像,虽然我还没有弄清楚如何做到这一点。
- 使用 vips,这要归功于它的管道实现。
我宁愿继续使用 imagemagick,但我对任何一种方式都持开放态度。我正在寻找如何实现我正在寻找的指针。