2017-03-15 122 views
3

我已經在Rails應用程序的ruby中設置了一個rest API,現在我需要生成一個PDF並從get請求中返回這個PDF。我正在尋找一些關於如何實現這個功能的建議。如何從api中返回pdf文件?

我的一些要求如下:我無法保存文件併爲最終用戶提供指向文件的鏈接,因爲文件中的數據可隨時更新。我正在使用該應用程序作爲微服務,因此沒有可用於顯示該文件的前端。

所以這裏是我的想法我會喜歡一些關於如何實現這個功能的建議。

我想嚮應用程序中的特定端點發出獲取請求。我希望能夠返回一個PDF文件,然後我可以向最終用戶顯示。

我目前使用WickedPdf gem來生成一個臨時PDF文件,但我真的很難與響應應該看起來如何。

任何意見將不勝感激。

+0

當你要求被調用時,你想強制下載PDF嗎? – Sajin

+0

看看send_data - http://apidock.com/rails/ActionController/Streaming/send_data。這是你想要的? – Sajin

回答

0

將pdf上傳到Amazon s3並生成鏈接,然後在apis中獲取pdf鏈接。

+0

這是最容易的,但我們不想保存它,而是調用 –

+0

創建路由,調用控制器操作並使用wickedpdf生成pdf並在api中傳遞該url或路由時生成。 – puneet18

1

一種方法是在內存中創建PDF文件並將其流式傳輸到客戶端。我喜歡這種方式,也許以後你將不得不通過電子郵件發送PDF文件,或只是將它們保存到一些備份磁盤等等

def get_pdf 
    pdf = WickedPdf.new.pdf_from_string('<h1>Hello There!</h1>') 
    send_data pdf, filename: 'file_name.pdf' 
end 

您可以將PDF生成不同的服務,只是把它在控制器中。這提供了隔離,您可以單獨測試它。

你也可以調試與HTTPiehttp get http://localhost:3000/invoices/1/get_pdf

Rails的端點響應將所有必須的HTTP響應頭:

Content-Disposition: attachment; filename="file_name.pdf" 
Content-Length: 5995 
Content-Transfer-Encoding: binary 
Content-Type: application/pdf 

因此,當用戶點擊指向端點的鏈路上,最可能會彈出下載對話框,因爲Content-Disposition: attachment;標頭

其他解決方案是將get_pdf.html呈現爲PDF併發送回客戶端:

def get_pdf 
    render pdf: "file_name" 
end 

但是,在這種情況下,Content-Disposition頭部有inline,這意味着瀏覽器將打開PDF文檔(如果它可以閱讀PDF格式),而不是提供下載。

0

我不知道,如果你還需要這一點,但在未來的任何人,我找到了一個很好的解決方案:

pdf = WickedPdf.new.pdf_from_string(render_to_string "entradas/entradaspdf.pdf.erb") 
send_data pdf, filename: "bergha.pdf", disposition: "inline" 

我加載我的PDF,HTML視圖基於模板通過「render_to_string」 ruby方法返回字符串中的視圖內容。然後WickedPdf將其轉換爲pdf二進制文件,最後將其保存爲「pdf」var。

最後,我使用「send_data」方法,其中第一個參數是輸出數據(my pdf var),第二個是輸出數據的文件名,第三個(可選)是更改Content-處理標題告訴瀏覽器是否加載文件(內聯)或只是下載(附件)。
希望它的作品,它對我來說確實很好