Модуль fpdf2
может вставлять математические формулы только в виде изображений. В следующих примерах объясняется, как создавать и вставлять такие изображения.
Смотрим пример:
from urllib.parse import quote from urllib.request import urlopen from fpdf import FPDF from PIL import Image pdf = FPDF() # директория где лежат системные шрифты OS Linux font_dir = '/usr/share/fonts/truetype/freefont' # добавляем TTF-шрифт, поддерживающий кириллицу. pdf.add_font("Serif", style="", fname=f"{font_dir}/FreeSerif.ttf", uni=True) pdf.set_font("Serif", size=14) pdf.add_page() # начинаем вывод текста pdf.cell(txt='Формула') # создание формулы formula = 'x^n + y^n = a/b' height = 170 #(пиксели) # отправка формулы в API Google Charts url = f"https://chart.googleapis.com/chart?cht=tx&chs={height}&chl={quote(formula)}" # открываем картинку Google Charts по URL with Image.open(urlopen(url)) as img: # ширина и высота картинки формулы _width, _height = img.size # вычисляем (аппроксимируем) ширину картинки width = _width*pdf.font_size/_height # вставка формулы, как картинки pdf.image(img, h=pdf.font_size, w=width) # рассчитываем координаты для продолжения вывода текста pdf.set_xy(x=pdf.get_x()+width, y=pdf.get_y()-pdf.font_size) # выводим текст далее pdf.cell(txt='была создана при помощи API Google Charts.') pdf.output("equation-with-gcharts.pdf")
Справочную информацию по методу FPDF.image()
смотрите в материале "Добавление картинок в PDF-документ".
Matplotlib
.Смотрим пример:
from fpdf import FPDF from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from matplotlib.figure import Figure import numpy from PIL import Image # создание формулы fig = Figure(figsize=(6, 2), dpi=100) canvas = FigureCanvas(fig) axes = fig.gca() # синтаксис LaTeX axes.text(0, .5, r"$x^n + y^n = \frac{a}{b}$", fontsize=60) axes.axis("off") canvas.draw() img = Image.fromarray(numpy.asarray(canvas.buffer_rgba())) pdf = FPDF() pdf.add_page() # вставка формулы, как картинки pdf.image(img, w=30, x=50, y=20) pdf.output("equation-with-matplotlib.pdf")