0

Rails アプリで、Amazon S3 に保存した Word ファイルをconvertapiに送信して PDF に変換する作業を行っています。私はpaperclip gemを使用してファイルを管理し、curb gemを使用して実際のリクエストを作成しています。

# model with property has_attached_file :attachment
def convert_docx_to_pdf
    base = "https://do.convertapi.com/Word2Pdf" 
    api_key = '*****'
    file = open(attachment.url)
    c = Curl::Easy.new(base)
    c.multipart_form_post = true
    c.http_post(
      Curl::PostField.file('thing[file]', file.path), 
      Curl::PostField.content('ApiKey', api_key)
    )
end

ここで縁石のドキュメントに従おうとしています。

これを Rails コンソールから実行すると、単純にtrue. 結果のPDFをキャプチャしたいと思います。

(convertapi のテスト エンドポイント ツールでファイルを手動でアップロードすると、これが機能することを確認しました。)

更新 09.18.15

Jonas が提案した変更を実装しました。新しいコードは次のとおりです。

def convert_docx_to_pdf
  base = "https://do.convertapi.com/Word2Pdf"
  api_key = ENV['CONVERTAPI_API_KEY']
  file = open(attachment.url)

  Curl::Easy.new('https://do.convertapi.com/Word2Pdf') do |curl|
    curl.multipart_form_post = true
    curl.http_post(Curl::PostField.content('ApiKey', api_key), Curl::PostField.file('File', file.path))

    return curl.body_str
  end
end

まだ運がありません。ただ をcurl.body_str返します"Bad Request"

( file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk)

4

2 に答える 2

1

問題は単純であることがわかりました。convertapi の Word から PDF への変換ツールは、拡張子が Word のファイルを想定しています。ファイルを S3 に取得する過程で拡張子を失いました。( file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk) これは、S3 から取得した実際のファイルの 1 つを convertapi Web GUI に対してテストすることで確認できました。

理想的には、S3 に送信するときに拡張機能を失わないようにしますが、それまでの間、次のコードでうまくいきます。

def convert_docx_to_pdf
  base = "https://do.convertapi.com/Word2Pdf"
  api_key = ENV['CONVERTAPI_API_KEY']
  file = open(attachment.url)
  local_file_path = "#{file.path}.docx"
  FileUtils.cp(file.path, local_file_path) # explicitly set the extension portion of the string

  Curl::Easy.new('https://do.convertapi.com/Word2Pdf') do |curl|
    curl.multipart_form_post = true
    binding.pry
    curl.http_post(Curl::PostField.content('ApiKey', api_key), Curl::PostField.file('File', local_file_path))

    # Write to PDF opened in Binary (I got better resulting PDFs this way)
    f = File.open('public/foo.pdf', 'wb')
    f.write(curl.body_str)
    f.close
  end
  FileUtils.rm(local_file_path)
end
于 2015-09-20T22:53:47.577 に答える