是否将SVG元素导出为PDF?

是否将SVG元素导出为PDF?,pdf,svg,pdf-generation,raphael,d3.js,Pdf,Svg,Pdf Generation,Raphael,D3.js,我有一个由d3生成的可视化(一个类似于Protovis或Raphael的javascript可视化库,它使用SVG元素绘制东西)。vis是交互式的,因此用户可以对其进行交互和编辑。一旦用户对其可视化感到满意,我希望用户能够将此可视化导出为PDF格式。我尝试了几个HTML到PDF的库,但它们不适用于SVG元素 如果解决方案是客户端还是服务器端都可以。我使用的是PHP服务器端,但Python或Java实现也可以工作 浏览器支持:理想情况下,它将支持所有现代浏览器,但至少我希望支持最新版本的Firef

我有一个由d3生成的可视化(一个类似于Protovis或Raphael的javascript可视化库,它使用SVG元素绘制东西)。vis是交互式的,因此用户可以对其进行交互和编辑。一旦用户对其可视化感到满意,我希望用户能够将此可视化导出为PDF格式。我尝试了几个HTML到PDF的库,但它们不适用于SVG元素

如果解决方案是客户端还是服务器端都可以。我使用的是PHP服务器端,但Python或Java实现也可以工作


浏览器支持:理想情况下,它将支持所有现代浏览器,但至少我希望支持最新版本的Firefox和webkit浏览器。

我不知道客户端有任何强大的PDF库

一种快速可行的方法是将svg内容发送到服务器,然后使用batik for java之类的工具将svg转换为pdf,然后再次将响应发送到客户端


这里有一个相关的例子

还有wkhtml2pdf,它可以将webkit可以呈现为PDF格式的任何内容。如果您希望呈现SVG和HTML的组合,或者希望在拍摄PDF快照之前运行一些JavaScript,那么这非常有用


PhantomJS还可以将url/html光栅化为PDF。与wkhtml2pdf相同的后端(QTWebKit)。

我没有尝试d3,但我在Python3.6中实现了您想要的效果:

# Pdf library
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF, renderPM

# Svg library
import svgwrite

# Svg to reportlab
from svglib.svglib import svg2rlg, SvgRenderer

# Xml parser
from lxml import etree

# Create the svg
dwg = svgwrite.Drawing('test.svg', profile='tiny')
dwg.add(dwg.line((0, 0), (10, 10), stroke=svgwrite.rgb(10, 10, 16, '%')))
dwg.add(dwg.text('Test', insert=(0, 0.2)))

# Create canvas for pdf
c = canvas.Canvas("output.pdf")

# Parse the xml of the svg
parser = etree.XMLParser(remove_comments=True, recover=True)
root = etree.fromstring(dwg.tostring())

# Render the svg itself
svgRenderer = SvgRenderer()
drawing = svgRenderer.render(root)

# Now render the drawing in the pdf
renderPDF.draw(drawing , c, 10, 10)

# End page and save pdf file
c.showPage()
c.save()

# Or render to a seperate png
renderPM.drawToFile(drawing, "file.png", fmt="PNG")

Reportlab是一个开源pdf库,svglib是一个能够将svg转换为Reportlab图形的库。不支持直接从xml呈现svg,这就是为什么我使用svg渲染器。

Highcharts(在客户端使用svg图表)使用Batik以这种方式生成pdf/jpg,效果非常好。()哇。伟大的我知道海图,但不知道它们是如此的综合。谢谢你的链接!刚刚开始使用蜡染,感谢您提供了该讨论的链接。jsPDF可用于将SVG添加到PDF文件中。请看下面的对话: