0

更新:

与此同时,我切换到直接使用ghostscript的'rghost' gem,并且似乎与多页的pdf一起工作得很好。

如果有人找到以下问题的答案,我将保留此问题。

这是我的问题:

我正在使用 carrierwave 和 rmagick 将 pdf 转换为图像,它工作得很好。唯一的问题是,当我尝试解析 2..n 页 pdf 时,它总是为第一页生成图像,仅此而已。

以下是我处理此问题的 2 个示例:

  1. 通过 rmagick:

    def do_parsing
      pdf_path = "#{Rails.root}/public#{@pdf.pdf.url}"
    
      raw_pages_arr = Magick::Image.read(pdf_path) { self.density = 400 }
    
      save_pdf_images(raw_pages_arr)
    end
    
    def save_pdf_images(raw_pages_arr)
      raw_pages_arr.each do |raw_page|
        page_number = raw_pages_arr.index(raw_page) + 1
        image_name = "#{@pdf.form.name}_page_#{page_number}.jpg"
        raw_page.write(image_name)
    
        image = File.new("#{Rails.root}/#{image_name}")
        build_pdf_image(image, page_number)
      end
    end
    
  2. 直接使用图像魔法

    file = Form::Pdf.first.pdf
    file_name = file.path.sub('.pdf', '.jpg')
    system("convert -quality 100 -density '400' #{file.path} #{file_name}")
    

在这两种情况下,都会创建 jpg 但仅用于 pdf 的第一页,其余的都丢失了。

我确信的一件事是(至少通过 rmagick)对 Magick::Image.read(pdf) 的调用会导致一个包含一个元素的数组,而不管 pdf 有多少页,所以这让我抓狂头..

我一直在用谷歌搜索这个问题,我似乎找不到有类似问题的人,我到处都在说,如果它有多个页面,它应该自动将 pdf 转换为多个图像,除非它没有。

任何想法都会有巨大的帮助,也许我错过了一些明显的东西。

4

1 回答 1

0

我一直使用 ImageList 来处理这样的多页文档:

def do_parsing
  pdf_path = "#{Rails.root}/public#{@pdf.pdf.url}"

  image_list =  Magick::ImageList.new(pdf_path) {
    self.density = 400
  }

  save_pdf_images(raw_pages_arr)
end

def save_pdf_images(raw_pages_arr)
  raw_pages_arr.each_with_index do |raw_page, index|
    page_number = index + 1
    image_name = "#{@pdf.form.name}_page_#{page_number}.jpg"
    raw_page.write(image_name)

    image = File.new("#{Rails.root}/#{image_name}")
    build_pdf_image(image, page_number)
  end
end

不过,总的来说,我建议为此使用服务。PDF 到图像的转换有许多错综复杂的事情(如颜色配置文件、处理 CropBox/BleedBox/ArtBox/TrimBox、alpha 通道等),最好留给已经这样做了一段时间的服务。Blitline ( http://www.blitline.com/docs/pdf ) 是处理这些的服务示例。

于 2013-07-10T00:06:41.717 回答