【问题标题】:Save, store, and serve a user-uploaded PDF with Ruby on Rails使用 Ruby on Rails 保存、存储和提供用户上传的 PDF
【发布时间】:2015-09-09 03:34:48
【问题描述】:

我花了很多时间研究使用 Ruby/Rails 的 PDF 工具,但我找不到我需要的东西。我的理解可能存在差距。

最终用户工作流程

作为用户,我可以将 PDF 文档(可能是扫描图像)上传到 AngularJS/Rails 应用程序。该 PDF 文档应作为 PDF 文档存储在服务器上(而不是存储在云存储中)。稍后,我可以将该 PDF 文档下载回我的计算机。

第一次尝试

实际上,我确实使用 CarrierWave、ImageMagick 和 GhostScript 完成了这项工作。 GhostScript 是让 ImageMagick 处理 PDF 的难题中缺失的一块。代码如下所示:

  def create
    @scanned_pdf = ScannedPdf.new
    @scanned_pdf.image = params[:file]
    image = MiniMagick::Image.new(@scanned_pdf.image.path)
    @scanned_pdf.content_type = image.mime_type
    @scanned_pdf.name = params[:file].original_filename

    if @scanned_pdf.save
      render status: :ok, json: serialize(@scanned_pdf)
    else
      render status: :unprocessable_entity, json: serialize_errors(@scanned_pdf)
    end
  end

一切都很好,直到我们意识到我们需要商业 GhostScript 许可证。我们已与他们联系,但他们的销售团队体验不佳,因此我们正在探索其他选择。

问题

我无法获取来自params[:file] 的数据并将其保存为服务器上的 PDF。我什至不知道数据是什么格式的。

如果我尝试下面的代码,我最终会得到一个文件...

  # store_dir stores the path for the image

  FileUtils.mkdir @scanned_pdf.store_dir 
  FileUtils.cp_r params[:file].path, @scanned_pdf.store_dir

...但是该文件中包含如下信息:

iÀø³Ÿ/rÌKC̱>©¬êÚy0¢¯9äÛ1 Žoé^×}œ_÷`ÿ~â•Rbu0ΞóC‚@J,LoŸ®MÀ IÃ:kˆ¾¿ªeßøîžÉ!Ç‚àh®6ˆÒ‡†î²jMÕñk¢{æv ¸ A §NŸÁ×½á /=~"QÖ‡¤aj...*Åß~'†ƒXGøëÑ>ÀÏ\º‡VIÓ/^£Ç/M E§ÉºN#OUÇËH¿&òƒáüÎøzÁ4kÖœ¤l«›hjªZ‡¡#øåù¡˜,ArPê0¬9ª:4j†²–Ü'¦k6ôõÛráßè¿ÖaXsTuhÔ4 (ˆxxá"ï~z烎ùÖaXëTuhŒÚÂôöéiºÆ]ìp>ÖaXëTu

我什至不确定我在这里做什么。

我自己尝试过pdf-reader gemactive_pdftkWicked PDF,并多次尝试使用Ruby FileIO 类。

理想情况下,我想做类似的事情

  File.open(params[:file].path, "rb") do |io|
    reader = PDF::Reader.new(io)
    rendered_pdf = reader.render # not actually a method
    rendered_pdf.save # in a useful location
  end

我觉得我在这里遗漏了一些东西,我会真的感谢您的任何见解。

【问题讨论】:

    标签: ruby-on-rails pdf


    【解决方案1】:

    好吧,我只使用 Ruby 方法就能完成这项工作。这是我的代码:

    directory = FileUtils.mkdir @scanned_pdf.store_dir
    path = File.join(directory, @scanned_pdf.name)
    File.open(path, "wb") { |f| f.write(params[:file].read) }
    

    我不知道write method on the IO class。这是拼图中缺失的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多