Экспорт SVG-элементов в PDF? - PullRequest
11 голосов
/ 01 февраля 2012

У меня есть визуализация, сгенерированная d3 (библиотека визуализации javascript, похожая на Protovis или Raphael, которая рисует вещи, используя элементы SVG).Виз является интерактивным, поэтому пользователь может взаимодействовать и редактировать его.Как только пользователь будет удовлетворен своей визуализацией, я бы хотел, чтобы пользователь мог экспортировать эту визуализацию в формате PDF.Я пробовал несколько библиотек HTML в PDF, и они не работают с элементами SVG.

Это нормально, если решение на стороне клиента или на стороне сервера.Я использую серверную часть PHP, но реализации Python или Java также могут работать.

Поддержка браузеров: в идеале он поддерживал бы все современные браузеры, но минимально хотелось бы поддерживать последние версии браузеров Firefox и webkit.

Ответы [ 4 ]

6 голосов
/ 01 февраля 2012

Я не знаю ни одной сильной библиотеки PDF на стороне клиента.

Быстрый возможный способ - отправить svg-контент на сервер и использовать что-то вроде batik для java, чтобы превратить svg в pdf, а затем снова отправить ответ клиенту.

Вот связанный SO для разговора .

5 голосов
/ 06 февраля 2012

Существует также wkhtml2pdf, который может отображать все, что может * webkit в виде PDF. Если вы хотите визуализировать комбинацию SVG и HTML или запустить JavaScript до того, как будет сделан снимок PDF, это здорово.

1 голос
/ 09 января 2015

PhantomJS также может растеризовать URL / HTML в PDF.Тот же бэкэнд (QTWebKit) с wkhtml2pdf.

0 голосов
/ 12 июня 2018

Я не пробовал 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 Drawings.Рендеринг SVG напрямую из XML не поддерживается "из коробки", поэтому я использую SvgRenderer.

...