gpt4 book ai didi

ruby-on-rails - 如何使用 Carrierwave 和 MiniMagick (Ruby on Rails) 将 PDF 转换为图像数组

转载 作者:行者123 更新时间:2023-12-04 06:03:42 25 4
gpt4 key购买 nike

我正在将上传的 PDF 转换为图像,每页一张图像。我已经弄清楚如何使用 MiniMagick::Tool::Convert 生成图像,但我不知道如何为 uploader 编写 version block ,以便我可以访问一组图像 URL。

到目前为止,这是我的上传者:

class DocumentUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick

storage :file
# storage :fog

def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

version :jpg do
process :convert_to_images
process :set_content_type_jpg

def convert_to_images(*args)
image = MiniMagick::Image.open(current_path)
image.pages.each_with_index do |page, index|
MiniMagick::Tool::Convert.new do |convert|
convert.background 'white'
convert.flatten
convert.density 300
convert.quality 95
convert << page.path
convert << "#{CarrierWave.root}/#{store_dir}/image-#{index}.jpg"
end
end
end
end

def set_content_type_jpg(*args)
self.file.instance_variable_set(:@content_type, "image/jpg")
end

# Add a white list of extensions which are allowed to be uploaded.
def extension_white_list
%w(jpg jpeg gif png doc docx pdf)
end
end

这会在正确的目录中生成image-0.jpgimage-1.jpg等。但现在我无法在我的视野中引用这些图像,甚至不知道有多少。当我需要将图像上传到 S3 时,这也不起作用。如何让 Carrierwave 处理该图像集合的文件存储,而不是单个图像?

看起来我可能需要添加一个新的数据库列来存储页数。有没有办法让我的 uploader 根据此计数返回一组图像 URL?

我也愿意换成另一颗 gem 。使用回形针、神社或重新归档会更容易吗?

最佳答案

使用 Shrine,您可以使每个页面都有不同的版本:

class ImageUploader < Shrine
plugin :versions
plugin :processing

process(:store) do |io, context|
pdf = io.download
versions = {}

image = MiniMagick::Image.new(pdf.path)
image.pages.each_with_index do |page, index|
page_image = Tempfile.new("version-#{index}", binmode: true)
MiniMagick::Tool::Convert.new do |convert|
convert.background 'white'
convert.flatten
convert.density 300
convert.quality 95
convert << page.path
convert << page_image.path
end
page_image.open # refresh updated file
versions[:"page_#{index + 1}"] = page_image
end

versions
end
end

假设您有一个 Document 模型,并且将 PDF 附加到 file 附件字段,则您可以使用 Hash#values< 检索页面数组:

pages = document.file.values
pages #=> [...array of pages...]
pages.count #=> number of pages

关于ruby-on-rails - 如何使用 Carrierwave 和 MiniMagick (Ruby on Rails) 将 PDF 转换为图像数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com