【问题标题】:How to convert word file to PDF in ROR如何在ROR中将word文件转换为PDF
【发布时间】:2018-12-05 14:08:13
【问题描述】:

我正在使用 Libreconv gem 将 word 转换为 doc,但它不适用于 S3

bucket = Aws::S3::Bucket.new('bucket-name')
object = bucket.object file.attachment.blob.key
path = object.presigned_url(:get)
Libreconv.convert(path, "public/test.pdf")

如果我尝试使用 Libreconv 将此路径转换为 ​​PDF,则会出现文件名太长的错误。我在 ActiveJobs 下编写了这段代码。请根据 ActiveJobs 为我提供解决方案。

有人可以建议我如何将word文件转换为pdf。 这里的路径是https://domain.s3.amazonaws.com/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9

我得到的错误是

Error: source file could not be loaded *** Errno::ENAMETOOLONG Exception: File name too long @ rb_sysopen - /tmp/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9.pd

【问题讨论】:

  • path 中有什么内容?
  • 我已经更新了我的描述

标签: ruby-on-rails amazon-s3 rails-activejob rails-activestorage ruby-on-rails-5.2


【解决方案1】:

您的 PDF 似乎是使用从 S3 获取 docx 所需的所有参数创建的。

我想它发生在this line:

target_tmp_file = "#{target_path}/#{File.basename(@source, ".*")}.#{File.basename(@convert_to, ":*")}"

@sourcehttps://domain.s3.amazonaws.com/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9

> File.basename(@source, ".*")
=> "Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9"

因此,Libreconv gem 尝试使用这个长名称创建一个 tmp 文件,但它太长了 - 这就是引发错误的原因。

可能的解决方案:将过程拆分为获取文件和转换文件的单独步骤。比如:

require "open-uri"

bucket = Aws::S3::Bucket.new('bucket-name')
object = bucket.object file.attachment.blob.key
path = object.presigned_url(:get)

doc_file = open(path)
begin
  Libreconv.convert(doc_file.path, "public/test.pdf")
ensure
  doc_file.delete
end

【讨论】:

    【解决方案2】:

    以下是使用 combine pdf gem 的答案

    tape = Tape.new(file)
    result = tape.preview
    tempfile = Tempfile.new(['foo', '.pdf'])
    File.open(tempfile, 'wb') do |f|
      f.write result
    end
    path = tempfile.path
    combine_pdf(path)
    

    对于我使用过的 S3 的加载文件

    object = @bucket.object object_key
    path = object.presigned_url(:get)
    response = Net::HTTP.get_response(URI.parse(path)).body
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2013-09-25
      • 2011-03-02
      相关资源
      最近更新 更多