2011-05-06 70 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();