PerfectVector
Автор: Irene Kim7 мин чтения

SVG в ReportLab: чёткие контуры логотипа в PDF

Размещайте SVG-логотипы в PDF ReportLab через svglib, сохраняйте пропорции и проверяйте готовый файл: векторные контуры, правильный размер и пропавшие детали.

На этой странице

Используйте svglib.svg2rlg(), чтобы прочитать SVG в Drawing ReportLab, затем разместите этот рисунок через renderPDF.draw(). Отведите ему рамку с заданными размерами на странице и используйте один коэффициент масштаба для обеих осей. Так подходящая геометрия логотипа остаётся инструкциями рисования PDF, а не вставленным растровым скриншотом.

Для отдельного экспорта без макета документа процесс настройки размеров CairoSVG сравнивает пиксели PNG, размеры страницы PDF и DPI.

Полезная проверка — готовый PDF: сохранила ли эмблема пропорции, цвета и небольшие отверстия в размере, нужном документу? Успешный вызов Python на эти вопросы не отвечает. Пример ниже размещает одну исходную эмблему дважды и проверяет полученный файл.

Если логотип уже есть как редактируемая векторная графика, начните с неё. Если сохранился только PNG или JPG, восстановите векторный оригинал перед построением документа. Для фотографий и числовых графиков нужен другой выбор источника.

Импортируйте графику как рисунок

Документированный процесс svglib преобразует SVG в объекты рисунков ReportLab. Руководство ReportLab по графике объясняет, что рисунки можно отрисовывать на canvas или использовать как потоковые элементы Platypus. В этом примере canvas задаёт явные положение и размер каждого размещения.

Мы выполнили пример с Python 3.12, svglib 2.2.0 и ReportLab 4.4.9. Установите два пакета фиксированных версий в окружение проекта:

python -m pip install "svglib==2.2.0" "reportlab==4.4.9"

Сохраните эту небольшую эмблему как logo.svg. Она содержит три контура со сплошными заливками без связанных изображений, шрифтов или эффектов. Это написанная вручную графика для демонстрации, а не результат преобразования PerfectVector.

<svg xmlns="http://www.w3.org/2000/svg"
     width="240" height="120" viewBox="0 0 240 120">
  <path fill="#1c625e" d="M0 120 L60 0 L120 120 Z"/>
  <path fill="#e5a340" d="M96 120 L156 24 L216 120 Z"/>
  <path fill="#163451" d="M228 12 L240 12 L240 108 L228 108 Z"/>
</svg>

viewBox SVG описывает внутренний координатный прямоугольник. width и height импортированного рисунка показывают размеры для размещения в PDF. Читайте их вместо предположения, что пиксель SVG равен пункту PDF.

Для этого файла svglib 2.2.0 вернул 180 × 90 пунктов. Его текущая документация по единицам сопоставляет CSS-пикселю 0.75 пункта PDF. Старые примеры могут использовать другие предположения, поэтому проверяйте размеры при обновлении существующего процесса.

Впишите логотип без растягивания

Сохраните следующий код как place_logo.py рядом с SVG и запустите python place_logo.py. Все положения на странице и размеры рамки здесь — пункты PDF. В дюйме 72 пункта; начало canvas по умолчанию — слева внизу, как описывает руководство ReportLab по canvas.

from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg
 
 
def draw_svg_in_box(pdf, drawing, x, y, box_w, box_h):
    if drawing.width <= 0 or drawing.height <= 0:
        raise ValueError("The SVG needs positive dimensions")
    factor = min(box_w / drawing.width, box_h / drawing.height)
    pdf.saveState()
    pdf.translate(x, y)
    pdf.scale(factor, factor)
    renderPDF.draw(drawing, pdf, 0, 0)
    pdf.restoreState()
 
 
drawing = svg2rlg("logo.svg")
if drawing is None:
    raise ValueError("SVG could not be loaded")
 
pdf = canvas.Canvas("logo.pdf", pagesize=(640, 360))
draw_svg_in_box(pdf, drawing, 40, 154, 144, 72)
draw_svg_in_box(pdf, drawing, 302, 126, 288, 144)
pdf.save()

min() выбирает ограничивающий размер, поэтому рисунок помещается внутри рамки. Один коэффициент для X и Y сохраняет пропорции. Эта функция привязывает рисунок к нижнему левому углу рамки; неиспользуемое пространство остаётся сверху или справа. Центрируйте отдельно, если этого требует макет.

Преобразование canvas временное. restoreState() не даёт масштабированию логотипа изменить последующий текст или элементы страницы, а исходный рисунок остаётся доступным для второго размещения.

В тесте два коэффициента были 0.8 и 1.6, давая графику 144 × 72 pt и 288 × 144 pt. Предпросмотр добавляет подписи и фон к тем же двум размещениям для удобного сравнения размеров.

Одна зелёно-золотая эмблема, размещённая с размерами 144 на 72 и 288 на 144 пункта в отрисованном PDF
Снимок отрисованного тестового PDF. Логотип состоит из трёх собственных контуров, нарисованных в двух размерах. Веб-изображение — растровый предпросмотр; проверка PDF подтвердила контуры рисования и отсутствие встроенных изображений.

В документе Platypus рисунок может войти в последовательность содержимого как потоковый элемент. После масштабирования содержимого через drawing.scale(factor, factor) обновите drawing.width и drawing.height тем же коэффициентом, чтобы макет учитывал новые габариты. Для разных размеров работайте со свежим рисунком. Пример canvas выше не меняет сам рисунок.

Проверяйте геометрию и внешний вид отдельно

Мы проверили поток содержимого тестового PDF через pypdf 6.10.0. Он содержал шесть операций начала контура, соответствующих трём контурам эмблемы, нарисованным дважды, и ноль изображений страницы. Мы также отрисовали всю страницу через Poppler и проверили две эмблемы. Фигуры, перекрытие, вертикальная полоска и пропорции совпали с задуманными размещениями.

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

Для своего документа:

  1. Сравните готовый PDF с SVG в браузере или редакторе. Ищите пропавшие детали, изменённые заливки, отсечение и неожиданные белые области.
  2. Проверьте эмблему в нужном размере документа, при котором узкие промежутки и тонкие штрихи должны оставаться читаемыми.
  3. Проверьте объекты изображений PDF, если процесс требует векторной графики. Учитывайте намеренные фотографии в других местах страницы.
  4. Храните SVG-оригинал рядом с кодом генерации документа. Перепроверяйте PDF после изменения графики или зависимостей отрисовки.

Сам SVG может содержать растр. Чтение такой оболочки не восстанавливает контуры из пикселей. Диагностика встроенных изображений помогает отличить векторный оригинал от SVG, который всё ещё несёт растровую картинку.

Обработайте свойства, которые импортёр не воспроизводит

Текущие ограничения svglib включают неподдерживаемые маски и элементы foreignObject, игнорируемые правила таблиц стилей @import и ограничения CSS и отсечения. Поэтому браузерный предпросмотр не заменяет проверку импортёра PDF.

Сохраните копию оригинала перед упрощением. Если логотип зависит от неподдерживаемого эффекта, рассмотрите восстановление этой части обычной геометрией или другой проверяемый способ экспорта. Сохраните исходный растр, если фотографический вид важнее редактирования контуров. Сведённое изображение может сохранить внешний вид, но меняет требование к вектору.

Для букв осознанно выбирайте между текстом документа и графикой в контурах. Сохранение слов текстом допускает редактирование и поиск, но требует доступности нужного шрифта в процессе подготовки документа. Перевод утверждённых букв логотипа в контуры сохраняет форму, лишая обычного редактирования текста. Наша эмблема только из контуров не проверяет обработку шрифтов; используйте реальный образец своих букв перед применением того же процесса.

Если вы собираете документ в системе вёрстки, а не Python, процесс SVG в LaTeX объясняет отдельный способ работы с графикой и подписями.

Восстановите растровый логотип перед размещением в PDF

Старый PNG в шаблоне счёта — разумный кандидат для восстановления вектора, если исходный файл логотипа отсутствует. С векторизатором логотипов PerfectVector просмотрите растровую графику в SVG, проверьте контуры и отверстия и скачайте вариант для процесса подготовки документа.

Проверьте мелкие буквы и границы перед импортом. Перерисуйте или заново наберите элементы, которым нужна точная типографика, и удалите нежелательную фоновую геометрию в редакторе. Руководство по векторизации логотипа подробнее разбирает решение о переходе от исходника к оригиналу.

Затем выполните реальный импорт ReportLab и проверки PDF выше. Хорошая трассировка всё ещё должна корректно пройти импорт и поместиться в документ. PerfectVector предоставляет контуры графики; он не выбирает координаты ReportLab, не регистрирует шрифты документа и не проверяет итоговый PDF. Графики заново создавайте из данных и исходника построения, а не трассируйте подписи или нанесённые значения.

Частые вопросы

Можно ли передать SVG в ReportLab как обычное растровое изображение? Для этого векторного процесса используйте svglib для получения Drawing и отрисуйте его через renderPDF. Предварительное преобразование SVG в PNG даёт растровую вставку.

Почему мой импортированный SVG меньше, чем в старом примере? Проверенный svglib 2.2.0 сопоставляет CSS-пиксели пунктам PDF с коэффициентом 0.75. Читайте возвращённые размеры рисунка и вписывайте в явную рамку вместо старых предположений о пикселях и пунктах.

Сохраняются ли все эффекты SVG? Нет. Импортёр имеет документированные ограничения, включая маски и foreignObject. Сравнивайте экспортированный PDF с нужной графикой, даже если скрипт завершился без ошибки.

Стоит ли векторизовать скриншот графика? Когда возможно, заново создавайте график по данным и исходнику построения. Оставьте трассировку логотипов для подходящей декоративной графики с утраченным редактируемым оригиналом.

Источники

  1. svglib — Package and units documentation — Преобразование SVG в Drawing, установка и размеры в пунктах PDF.
  2. ReportLab — Graphics — Объекты Drawing, отрисовка PDF и использование как потоковых элементов Platypus.
  3. ReportLab — Graphics and text with pdfgen — Координаты canvas, пункты и преобразования.
  4. svglib — Known limitations — Ограничения импорта, требующие проверки готового PDF.

Сохраните редактируемый оригинал, если он есть. Если осталась только растровая графика логотипа, подготовьте вариант SVG-логотипа, проверьте его контуры, затем разместите в нужном размере и проверьте готовый PDF.

Ещё из блога

Начните с более чистого SVG,
который проще редактировать