Преобразование SVG в PDF (svglib + reportlab недостаточно хороши)

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

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

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

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

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


person Oli    schedule 13.01.2012    source источник
comment
Не могли бы вы использовать комбинацию следующих подходов stackoverflow.com/a/6599172/1104941 и blog.pythonlibrary.org/2012/01/07/ Последний использует reportlab, но мне интересно, сможете ли вы обойтись без версии Plus, учитывая, что вы просто создаете PDF-файлы. Возможно, вы сможете перейти прямо к pdf с Каиром, но я не могу сказать наверняка, поэтому комментарий вместо ответа.   -  person sgallen    schedule 13.01.2012


Ответы (5)


Для этого я использую 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.

person ram1    schedule 10.04.2012
comment
Хорошо ли inkscape обрабатывает шрифты? Распознаются ли в inkscape шрифты, установленные в среде Windows? - person ShanerM13; 02.03.2021
comment
@ ShanerM13 ShanerM13 Inkscape хорошо обрабатывает шрифты. Я не использовал Inkscape в Windows, но ответ на ваш второй вопрос выглядит так: да, если все сделано правильно. - person ram1; 04.03.2021

Я использую CairoSVG:

import cairosvg
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')
person plaes    schedule 13.01.2012
comment
Протестировал его сейчас, но, к сожалению, он так же слаб при рендеринге моих SVG. - person Oli; 15.01.2012
comment
Вы уверены, что ваши SVG на самом деле отформатированы правильно? Рендеринг Cairo довольно надежный. Кроме того, я использую WeasyPrint для PDF, хотя он все еще немного неполный, но работает нормально, несмотря на ограничения... - person plaes; 15.01.2012

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

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

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

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

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

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

person Patrick Maupin    schedule 09.08.2012
comment
Как это решает проблему ОП? Я полагаю, что он не хочет использовать reportlab, потому что качество обработки SVG отсутствует. - person Martijn Pieters; 06.10.2012

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

# 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")

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

person Al3x_M    schedule 24.02.2016

При использовании svglib или cairosvg текст в svg не может отображаться правильно. Мое решение — импортировать файл svg в draw.io, а затем экспортировать его в формате pdf.

person PatrickCty    schedule 04.09.2020