Конвертировать SVG в PDF (svglib + reportlab недостаточно хорош) - PullRequest
9 голосов
/ 13 января 2012

Я создаю несколько SVG-файлов партиями, и мне нужно преобразовать их в PDF-документ для печати.Я пытался использовать svglib и его svg2rlg метод, но я только что обнаружил, что это абсолютно ужасно при сохранении векторной графики в моем документе.Он едва может корректно позиционировать текст.

Мой динамически сгенерированный SVG хорошо сформирован, и я протестировал svglib на необработанном вводе, чтобы убедиться, что это не проблема, которую я представляю.

Так, каковы мои варианты прошлого svglib и ReportLab?Он либо должен быть бесплатным, либо очень дешевым, поскольку у нас уже нет средств на проекте, частью которого он является.Мы не можем позволить себе оплату 1 КБ в год за ReportLab Plus.

Я использую Python, но на этом этапе я счастлив, пока он работает на нашем сервере Ubuntu.

Редактировать: проверенный принц.Лучше, но он по-прежнему игнорирует половину документа.

Ответы [ 4 ]

8 голосов
/ 10 апреля 2012

Я использую inkscape для этого.В вашем представлении django выполните следующие действия:

from subprocess import Popen

x = Popen(['/usr/bin/inkscape', your_svg_input, \
    '--export-pdf=%s' % your_pdf_output])
try:
    waitForResponse(x)
except OSError, e:
    return False

def waitForResponse(x): 
    out, err = x.communicate() 
    if x.returncode < 0: 
        r = "Popen returncode: " + str(x.returncode) 
        raise OSError(r)

Возможно, вам понадобится передать в качестве параметров inkscape все файлы шрифтов, на которые вы ссылаетесь, в вашем .svg, так что имейте в виду, если ваш текст отображается неправильновывод в формате .pdf.

1 голос
/ 10 августа 2012

rst2pdf использует reportlab для создания PDF-файлов.Он может использовать inkscape и pdfrw для чтения PDF-файлов.

В самом pdfrw есть несколько примеров, которые показывают чтение PDF-файлов и использование reportlab для вывода.

Обращение к комментарию Мартина ниже (я могу отредактировать этот ответ,но у него нет репутации комментировать его комментарии ...):

reportlab ничего не знает о файлах SVG.Некоторые инструменты, такие как svg2rlg, пытаются воссоздать SVG-изображение в PDF, рисуя их на холсте отчета.Но вы можете сделать это по-другому с pdfrw - если вы можете использовать другой инструмент для преобразования SVG-файла в изображение PDF, тогда pdfrw может взять этот преобразованный PDF и добавить его в виде XObject формы в создаваемый вами PDF-файл.с отчетом.Что касается reportlab, то на самом деле он ничем не отличается от размещения изображения JPEG.

Некоторые инструменты будут творить ужасные вещи с вашими файлами SVG (например, их растеризация).По моему опыту, inkscape обычно делает довольно хорошую работу и оставляет их в векторном формате.Вы даже можете сделать это без головы, например, «inkscape my.svg -A my.pdf».

Единственная причина, по которой я написал pdfrw, заключалась именно в этом конкретном сценарии использования - возможности повторного использования вектораизображения в новых PDF-файлах, созданных reportlab.

1 голос
/ 13 января 2012

CairoSVG - это то, что я использую:

import cairosvg
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')
0 голосов
/ 24 февраля 2016

Просто, чтобы сообщить вам и для будущего вопроса, я нахожу решение этой проблемы:

# I only install svg2rlg, not svglib (svg2rlg is inside svglib as well) 
import svg2rlg

# Import of the canvas
from reportlab.pdfgen import canvas

# Import of the renderer (image part)
from reportlab.graphics import renderPDF

rlg = svg2rlg.svg2rlg("your_img.svg")
c = canvas.Canvas("example.pdf")
c.setTitle("my_title_we_dont_care")

# Generation of the first page
# You have a last option on this function, 
# about the boundary but you can leave it as default.
renderPDF.draw(rlg, c, 80, 740 - rlg.height)
renderPDF.draw(rlg, c, 60, 540 - rlg.height)
c.showPage()

# Generation of the second page
renderPDF.draw(rlg, c, 50, 740 - rlg.height)
c.showPage()

# Save
c.save()

Наслаждайтесь немного с позицией (80, 740 - ч), это только позиция.

Если код не работает, вы можете посмотреть его в библиотеке reportlab рендера.У вас есть функция в reportlab для непосредственного создания pdf из вашего изображения:

renderPDF.drawToFile(rlg, "example.pdf", "title")

Вы можете открыть его и прочитать.Это не очень сложно.Этот код взят из этой функции.

...