2011-05-06 74 views
25

出發點:我沒有可以提供除靜態文件之外的任何內容的服務器。我在我的<body>中有一個SVG元素(動態創建),我想將其導出爲矢量格式,最好是PDF或SVG。在PDF中嵌入SVG(使用JS將SVG導出爲PDF)

我開始着眼於使用已有的lib jsPDF以及downloadify。它運行良好。不幸的是,這不支持SVG,只有文本。

我已閱讀過有關PDF格式嵌入SVG圖像的可能性,以及it seems已自Acrobat Reader 5(以及ImageViewer插件)啓用。但它不起作用。我已經嘗試過3種不同的PDF閱讀器,但沒有成功。

這是否意味着PDF已經降低了SVG嵌入支持?我還沒有發現任何東西。

我有兩個問題;這可以解決嗎?如果是的話,在PDF中嵌入SVG的規範是什麼?有了這些信息,我可以自己在jsPDF中建立這種支持。

瀏覽器支持需求是Safari,Chrome和Firefox。支持SVG的版本。

回答

19

爲尋找一個JS-唯一的解決辦法:PDFKit似乎是優越的解決方案從JS生成PDF這些天來,它支持所有SVG幾何圖元(包括解釋path幾何字符串)開箱。如果你不需要像符號等複雜的東西,所有渲染現有SVG內容所需的東西都將是一個DOM-walker,用於跟蹤CSS樣式和繼承。

我沒有成功地使用粗略的SVG支持jsPDF/svgToPdf組合在另一個答案中提到,並且這兩個源代碼看起來並不完善,並且完成了我。

+0

有一個問題。 1.打開http://pdfkit.org/demo/browser.html。 2.打開Chrome檢查窗口。 3.點擊頂部菜單上的「切換設備工具欄」圖標。 4.刷新頁面。 5.我無法在移動視圖的右側窗口中看到PDF。 6.有誰知道移動視圖爲什麼不呈現PDF。 ?這是PDFKit在移動設備上打開pdf的特定問題還是一般問題? – 2018-03-04 19:40:09

5

你試過WKHTMLTOPDF嗎?這是一個基於webkit的免費工具。
我們寫了一個小教程here.

在Mac上,使用Safari或Chrome,你可以嵌入SVG的HTML頁面保存到一個PDF。
由於這些瀏覽器在內部使用WKHTMLTOPDF,因此可能會對您有用。

+1

我問一個客戶端解決方案在這裏。然而,你是對的,因爲我沒有指定我要做什麼瀏覽器支持。所以我現在編輯了我的答案,包括 – Simeon 2011-05-06 16:32:56

+0

我不幸的是,仍然無法使wkhtmltopdf工作。它只爲我生成空白頁面。 – 2015-06-30 17:07:40

+0

@ art-solopov,時代發生了變化,如上所述,您可以切換到pdfkit:http://pdfkit.org/docs/vector.html – Mic 2015-06-30 20:33:12

8

我會回覆我自己的問題。我最終使用DocRaptor,可以從JavaScript調用客戶端。這在技術上解決了我的問題,即使它是非免費解決方案。如果我的答案可能是服務器端解決方案,我可以使用Mic的wkhtmltopdf作爲proposed

+1

感謝您與DocRaptor的鏈接。如果你走的東西的路線,你可以使用WKHTMLTOPDF,因爲它是免費的,並開放源碼 – Mic 2011-05-09 13:35:14

+1

添加您的答案,並刪除王子XML作爲替代,謝謝! – Simeon 2011-05-09 14:45:56

0

EVO HTML to PDF Converter支持將HTML中嵌入的SVG轉換爲PDF。你可以在這裏看到這個功能的例子:http://www.evopdf.com/demo/HTML_to_PDF/HTML5_Features/SVG_to_PDF.aspx。造成這種情況的示例代碼:

// Create a HTML to PDF converter object with default settings 
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter(); 

// Convert the HTML page with SVG to a PDF document in a memory buffer 
byte[] outPdfBuffer = htmlToPdfConverter.ConvertUrl(urlHtmlWithSVG); 

// Send the PDF as response to browser 

// Set response content type 
Response.AddHeader("Content-Type", "application/pdf"); 

// Instruct the browser to open the PDF file as an attachment or inline 
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=SVG_to_PDF.pdf; size={0}", outPdfBuffer.Length.ToString())); 

// Write the PDF document buffer to HTTP response 
Response.BinaryWrite(outPdfBuffer); 

// End the HTTP response and stop the current page processing 
Response.End();