【问题标题】:How to use CombinePDF with Rails 6 (ActiveStorage) on heroku如何在 Heroku 上使用 CombinePDF 和 Rails 6 (ActiveStorage)
【发布时间】:2021-01-23 04:12:28
【问题描述】:

我在 Rails 中使用 Prawn 生成 PDF 文档。多年来,我只将 jpg 插入 PDF。最近,我需要将外部 PDF 插入 Prawn PDF。这样做的方法似乎是使用 CombinePDF 将 PDF 合并在一起。

如果我使用本地文档,则此功能可以成功运行。一旦 ActiveStorage 加入其中,它就会停止工作……它会超时。

  • Rails -v 6.1.1
  • Ruby -v 2.7.2p137
  • 大虾-v 2.4
  • 结合PDF -v 1.0.21
  • 在 Heroku 上使用 Amazon S3

我使用的测试文件只有 50k 大小。无论我在开发或生产中(在heroku上)尝试这样做,都会发生完全相同的事情。在日志中我可以看到:

S3 Storage (716.2ms) Downloaded file from key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

然后......

Request ran for longer than 28000ms

宝石文件

gem "combine_pdf"

PdfsController

    class PdfsController < ApplicationController
      require 'combine_pdf'
      require 'net/http'
      include Rails.application.routes.url_helpers

      def the_report
        thing = Thing.find params[:thing_id]
        documents = Document.with_attached_attachments.where(id: thing.document_ids).joins(attachments_attachments: :blob).where(blob: {content_type: 'application/pdf'})
        respond_to do |format|
          format.pdf do
            prawn_pdf = TheReport.new(params[:thing_id]).render
            final_pdf = CombinePDF.new

            final_pdf << CombinePDF.parse(prawn_pdf)
            
            documents do |doc|
              doc.attachments.each do |attachment|
                # time out occurs here
                url = rails_blob_url(attachment, only_path: true)
                final_pdf << CombinePDF.parse(Net::HTTP.get_response(URI.parse(url)).body)
              end
            end

            send_data final_pdf.to_pdf, filename: "thing.pdf", type: 'application/pdf', disposition: 'inline', compress: true, optimize_objects: true
          end
        end
      end
    end

Net::HTTP.get_response 的请求似乎花费了太长时间。我该如何解决这个问题,和/或有更好的方法来解决这个问题?

【问题讨论】:

    标签: pdf-generation ruby-on-rails-6 prawn combine-pdf


    【解决方案1】:

    经过一系列的反复试验,它似乎很简单

    改变这个...

    documents do |doc|
     doc.attachments.each do |attachment|
      url = rails_blob_url(attachment, only_path: true)
      final_pdf << CombinePDF.parse(Net::HTTP.get_response(URI.parse(url)).body)
     end
    end
    

    到这个...

    documents do |doc|
     doc.attachments.each do |attachment|
      final_pdf << CombinePDF.parse(Net::HTTP.get_response(URI.parse(attachment.url)).body)
     end
    end
    

    url method docs

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2021-05-15
      • 2020-03-03
      • 2021-01-27
      • 2020-05-07
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多