Конвертируйте SVG в PDF используя Python, rsvg & Cairo
Мне удалось прочитать SVG с помощью rsvg и вывести его в PNG через Cairo в Python.
Несмотря на множество подобных вопросов, я не видел документации о том, как конвертировать SVG в PDF через rsvg & cairo. Я знаю об инструментах командной строки 'rsvg'/'rsvp-convert', но хочу вместо этого включить функциональность в мой код Python. Запускаемого подпроцесса тоже нет.
Для примера, вот в основном то, что я сейчас использую для рендеринга PNG:
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
ctx = cairo.Context(img)
handler= rsvg.Handle(None, svgstr)
handler.render_cairo(ctx)
img.write_to_png(pngfilepath)
Вопрос заключается в следующем: как изменить код для вывода PDF, чтобы сохранить векторный формат; Растеризация не должна произойти.
1 ответ
Замените ваш звонок на cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
с cairo.PDFSurface(filename, width_in_points, height_in_points)
, Я не знаю, каково стандартное масштабирование поверхности PDF, но, надеюсь, вы сможете продолжать использовать те же значения ширины и высоты, что и раньше.
Поскольку вы прямо упоминаете, что теперь должна произойти растеризация: Cairo "делает все возможное", чтобы не растровые вещи, но есть комбинации, где Cairo должен вернуться к растеризованным изображениям. Вы можете контролировать разрешение этих изображений через set_fallback_resolution
метод.
Причины растеризации включают в себя комбинации операций, которые не могут быть выражены в PDF (извините, я не знаю подробностей) и если какое-то растеризованное изображение рисуется на поверхности PDF.