Рубрики
Без рубрики

Добавление SVGS в PDFS с Python и ReportLab

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

ReportLab имеет нативную поддержку для генерации SVGS, но не для встраивания SVG в их PDF. К счастью, Dinu Gherman создал Svglib Пакет, пакет Pure-Python, который может прочитать файлы SVG и преобразовывать их в другие форматы, которые могут использовать ReportLab. Официальный сайт SVGLIB находится на Github Отказ

Пакет SVGLIB будет работать на Linux, Mac OS и Windows. Сайт утверждает, что работает с Python 2.7 – 3.5, но он должен работать в более новых версиях Python.

Вы можете использовать SVGLIB, чтобы прочитать существующие SVG GILES и преобразовывать их в ReportLab Рисование объекты. Пакет SVGLIB также имеет инструмент командной строки, SVG2PDF , что может преобразовать файлы SVG в PDFS.

Зависимости

Пакет SVGLIB зависит от ReportLab и lxml Отказ Вы можете установить обе эти пакеты, используя PIP:

pip install reportlab lxml

Монтаж

Пакет SVGLIB может быть установлен с использованием одного из трех способов.

Установите последний выпуск

Если вы хотите установить последний выпуск из индекса упаковки Python, вы можете просто использовать PIP обычный способ:

pip install svglib

Установите из последней версии от контроля источника

В случае вероятности, что вы хотите использовать последнюю версию кода (I.e. Крыть кровотечения/альфа сборки), то вы можете установить непосредственно из GitHub, используя, как это:

pip install git+https://github.com/deeplook/svglib

Ручная установка

Большую часть времени, используя PIP – это путь. Но вы также можете скачать Tarball из индекса упаковки Python и выполнять все шаги, которые PIP делает для вас автоматически, если вы хотите. Просто запустите следующие три команды в вашем терминале в порядке:

tar xfz svglib-0.8.1.tar.gz
cd svglib-0.8.1
python setup.py install

Теперь, когда у нас установлено SVGLIB, давайте узнаем, как его использовать!

Применение

Использование SVGLIB с ReportLab на самом деле довольно легко. Все, что вам нужно сделать, это импортировать svg2rlg от svglib.svglib и дать ему путь к вашему файлу SVG. Давайте взглянем:

# svg_demo.py

from reportlab.graphics import renderPDF, renderPM
from svglib.svglib import svg2rlg


def svg_demo(image_path, output_path):
    drawing = svg2rlg(image_path)
    renderPDF.drawToFile(drawing, output_path)
    renderPM.drawToFile(drawing, 'svg_demo.png', 'PNG')


if __name__ == '__main__':
    svg_demo('snakehead.svg', 'svg_demo.pdf')

После предоставления svg2rlg Ваш путь к файлу SVG, он вернет объект рисования. Затем вы можете использовать этот объект, чтобы записать его как PDF или PNG. Вы можете использовать этот скрипт, чтобы создать свой собственный SVG для PNG Charvering Utility!

Рисунок на холсте

Лично я не люблю создавать одноразовые PDF с простом изображением в том, что в предыдущем примере. Вместо этого я хочу иметь возможность вставить изображение и выписать текст и другие вещи. К счастью, вы можете сделать это очень легко, покрасняя вашу холст с помощью объекта рисунка. Вот пример:

# svg_on_canvas.py

from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg

def add_image(image_path):
    my_canvas = canvas.Canvas('svg_on_canvas.pdf')
    drawing = svg2rlg(image_path)
    renderPDF.draw(drawing, my_canvas, 0, 40)
    my_canvas.drawString(50, 30, 'My SVG Image')
    my_canvas.save()

if __name__ == '__main__':
    image_path = 'snakehead.svg'
    add_image(image_path)

Здесь мы создаем canvas.canvas Объект, а затем создать наш объект рисования SVG. Теперь вы можете использовать RenderPdf.draw Чтобы нарисовать свой рисунок на холсте на определенной координате X/Y. Мы идем вперед и вытягиваем немного небольшого текста под нашим изображением, а затем спасаем его. Результатом должен выглядеть что-то подобное:

Добавление SVG до текучего

Чертежи в ReportLab обычно могут быть добавлены в виде списка стойков и построены с шаблоном документа. Сайт SVGLIB говорит, что его чертежные объекты совместимы с текучей системой ReportLab. Давайте использовать другой SVG для этого примера. Мы будем использовать флаг Кубы из Википедии. Испытания SVGLIB загружают кучу флага SVGS в их тестах, поэтому мы попробуем одно из изображений, которые они используют. Вы можете получить его здесь:

https://upload.wikimedia.org/wikipedia/commons/b/bd/Flag_of_Cuba.svg

Как только у вас будет спасенное изображение, мы сможем взглянуть на код:

# svg_demo2.py

import os

from reportlab.graphics import renderPDF, renderPM
from reportlab.platypus import SimpleDocTemplate
from svglib.svglib import svg2rlg


def svg_demo(image_path, output_path):
    drawing = svg2rlg(image_path)
    
    doc = SimpleDocTemplate(output_path)
    
    story = []
    story.append(drawing)
    
    doc.build(story)

if __name__ == '__main__':
    svg_demo('Flag_of_Cuba.svg', 'svg_demo2.pdf')

Это сработало довольно хорошо, хотя флаг отрезан с правой стороны. Вот вывод:

У меня на самом деле были проблемы с этим примером. REPORTLAB или SVGLIB, кажется, действительно воспитан в том, как отформатирован SVG или его размер. В зависимости от SVG я использовал, я бы закончился с AttributeError или пустой документ или я был бы успешным. Таким образом, ваш пробег, вероятно, варьируется. Я скажу, что я говорил с некоторыми из основных разработчиков, и они упомянули, что ** SimpledoCteMplate ** не дает вам достаточно контроля над кадром, на который входит, чтобы рисунок, поэтому вам может потребоваться создать свой собственный Рамка или PageEmplate Чтобы сделать SVG правильно отображаться. Обходной путь, чтобы получить Snakehead.svg Для работы было установить левую и правую маржу на ноль:

# svg_demo3.py

from reportlab.platypus import SimpleDocTemplate
from svglib.svglib import svg2rlg


def svg_demo(image_path, output_path):
    drawing = svg2rlg(image_path)
    
    doc = SimpleDocTemplate(output_path,
                            rightMargin=0,
                            leftMargin=0)
    
    story = []
    story.append(drawing)
    
    doc.build(story)

if __name__ == '__main__':
    svg_demo('snakehead.svg', 'svg_demo3.pdf')

Масштабирование SVGS в ReportLab

Графики SVG, которые вы создаете с SVGLIB, не масштабируются по умолчанию. Таким образом, вам нужно будет написать функцию, чтобы сделать это для вас. Давайте взглянем:

# svg_scaled_on_canvas.py

from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg


def scale(drawing, scaling_factor):
    """
    Scale a reportlab.graphics.shapes.Drawing()
    object while maintaining the aspect ratio
    """
    scaling_x = scaling_factor
    scaling_y = scaling_factor
    
    drawing.width = drawing.minWidth() * scaling_x
    drawing.height = drawing.height * scaling_y
    drawing.scale(scaling_x, scaling_y)
    return drawing


def add_image(image_path, scaling_factor):
    my_canvas = canvas.Canvas('svg_scaled_on_canvas.pdf')
    drawing = svg2rlg(image_path)
    scaled_drawing = scale(drawing, scaling_factor=scaling_factor)
    renderPDF.draw(scaled_drawing, my_canvas, 0, 40)
    my_canvas.drawString(50, 30, 'My SVG Image')
    my_canvas.save()

if __name__ == '__main__':
    image_path = 'snakehead.svg'
    add_image(image_path, scaling_factor=0.5)

Здесь у нас есть две функции. Первая функция будет масштабировать наше изображение с использованием коэффициента масштабирования. В этом случае мы используем 0,5 в качестве нашего коэффициента масштабирования. Тогда мы делаем немного математики против нашего объекта рисунка и рассказать о себе. Наконец мы вытягиваем его по-настоящему так же, как и в предыдущем примере.

Вот результат:

Использование участков SVG от MATPLOTLIB в ReportLab

В предыдущем Статья Мы узнали, как создавать графики, используя только инструментарий ReportLab. Один из самых популярных 2D-графических пакетов для Python – Матплотлиб хоть. Вы можете прочитать все о Matplotlib здесь: https://matplotlib.org/ Отказ Причина, по которой я упоминаю MATPLOTLIB в этой статье, состоит в том, что он поддерживает SVG в качестве одного из его выходных форматов. Таким образом, мы посмотрим, как сделать участок, созданный с MATPLOTLIB и вставить его в ReportLab.

Для установки MATPLOTLIB наиболее популярным методом является использование PIP:

pip install matplotlib

Теперь, когда у нас установлено MatPlotlib, мы можем создать простой сюжет и экспортировать его как SVG. Давайте посмотрим, как это работает:

import matplotlib.pyplot as pyplot

def create_matplotlib_svg(plot_path):
    pyplot.plot(list(range(5)))
    pyplot.title = 'matplotlib SVG + ReportLab'
    pyplot.ylabel = 'Increasing numbers'
    pyplot.savefig(plot_path, format='svg')

if __name__ == '__main__':
    from svg_demo import svg_demo
    svg_path = 'matplot.svg'
    create_matplotlib_svg(svg_path)
    svg_demo(svg_path, 'matplot.pdf')

В этом коде мы импортируем Pyplot Подгибалка от MatPlotlib. Затем мы создаем простую функцию, которая принимает путь к тому, где мы хотим сохранить наш сюжет. Для этого простого сюжета мы создаем простой диапазон пяти чисел для одного из осей. Курица мы добавляем заголовок и ярлык Y. Наконец мы сохраняем график на диск как SVG.

Последний шаг в Если Заявление в нижней части кода. Здесь мы импортируем нашу svg_demo код из ранее в этой статье. Мы создаем изображение ORU SVG, а затем проводим через наш демонстрационный код, чтобы превратить его в PDF.

Результат выглядит так:

Использование SVG2PDF

Когда вы устанавливаете SVGLIB, вы также получаете инструмент командной строки под названием SVG2PDF Отказ Как подразумевает имя, вы можете использовать этот инструмент для преобразования файлов SVG в файлы PDF. Давайте посмотрим на пару примеров:

svg2pdf /path/to/plot.svg

Эта команда просто берет путь к файлу SVG, который вы хотите превратить в PDF. Он автоматически переименован вывод на то же имя, что и входной файл, но с расширением PDF. Вы можете указать имя выхода, хотя:

svg2pdf -o /path/to/output.pdf /path/to/plot.svg

-O Флаг говорит, что SVG2PDF требует, чтобы вы проходили в выходном пути PDF, а затем входной путь SVG.

Документация также упоминает, что вы можете преобразовать все файлы SVG в PDFS, используя команду, как следующее:

svg2pdf -o "%(base)s.pdf" path/to/file*.svg

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

Обертывание

SVGLIB является основным методом для добавления SVGS для ReportLab на момент написания этой книги. Хотя он не заполнен, он работает довольно хорошо, а API довольно приятно. Мы также узнали, как вставить участок SVG, созданный через популярный пакет MATPLOTLIB. Наконец мы посмотрели, как повернуть SVGS в PDFS, используя инструмент командной строки SVG2PDF.

Связанное чтение

  • Простой пошаговый ReportLab Руководство
  • ReportLab 101: TextObject.
  • ReportLab – Как добавить графики и графики
  • Извлечение PDF метаданных и текст с Python