Генерация PDF отчётов на Rust: библиотеки и практические примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генерация PDF отчётов на Rust: обзор библиотек и практические примеры

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

Зачем генерировать PDF на Rust?

PDF — универсальный формат для обмена документами, отчётами и счетами. Rust обеспечивает:

  • Высокую производительность и низкое потребление памяти.
  • Безопасность работы с памятью без сборщика мусора.
  • Лёгкую интеграцию с веб-фреймворками (Actix, Rocket, Axum).
  • Кроссплатформенность (Windows, Linux, macOS).

Основные библиотеки для PDF на Rust

1. printpdf — низкоуровневая работа с PDF

printpdf — самая популярная библиотека для создания PDF-документов "с нуля". Она позволяет рисовать линии, текст, изображения и таблицы, контролируя каждый пиксель. Подходит для сложных отчётов с кастомной вёрсткой.

Установка:

[dependencies]
printpdf = "0.7"

Пример: простой PDF с текстом

use printpdf::*;
use std::fs::File;

fn main() {
    let (doc, page1, layer1) = PdfDocument::new(
        "Мой первый отчёт",
        Mm(210.0),
        Mm(297.0),
        "Layer 1",
    );

    let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();

    let current_layer = doc.get_page(page1).get_layer(layer1);
    current_layer.use_text("Привет, мир!", 24.0, Mm(20.0), Mm(280.0), &font);

    doc.save(&mut File::create("output.pdf").unwrap()).unwrap();
}

2. genpdf — высокоуровневая генерация отчётов

genpdf построен поверх printpdf и предоставляет удобный API для создания документов с таблицами, заголовками, параграфами и стилями. Идеален для отчётов, где важна структура, а не ручное позиционирование.

Установка:

[dependencies]
genpdf = "0.3"

Пример: отчёт с таблицей

use genpdf::{Document, SimplePageSettings};
use genpdf::elements::{Paragraph, Table, TableLayout};
use genpdf::fonts::FontFamily;

fn main() {
    let font_family = FontFamily::from_files(
        "/usr/share/fonts/truetype/dejavu/",
        "DejaVuSans",
        None,
    ).unwrap();

    let mut doc = Document::new(font_family);
    doc.set_title("Отчёт о продажах");

    let mut table = Table::new(TableLayout::new(vec![2, 3, 3]));
    table.row()
        .element(Paragraph::new("Товар"))
        .element(Paragraph::new("Количество"))
        .element(Paragraph::new("Цена"));

    table.row()
        .element(Paragraph::new("Ноутбук"))
        .element(Paragraph::new("10"))
        .element(Paragraph::new("1200$"));

    doc.push(table);
    doc.render_to_file("report.pdf").unwrap();
}

3. wkhtmltopdf — HTML в PDF через WebKit

Если вам удобнее верстать отчёты на HTML/CSS, используйте обёртку над утилитой wkhtmltopdf. Она конвертирует HTML-шаблон в PDF, поддерживая стили, изображения и JavaScript.

Установка:

[dependencies]
wkhtmltopdf = "0.4"

Пример: конвертация HTML

use wkhtmltopdf::*;

fn main() {
    let html = r#"
        <h1>Отчёт за месяц</h1>
        <p>Продажи: <strong>150 000 ₽</strong></p>
        <table border="1">
            <tr><td>Январь</td><td>50 000</td></tr>
            <tr><td>Февраль</td><td>100 000</td></tr>
        </table>
    "#;

    let pdf_app = PdfApplication::new().unwrap();
    let mut builder = pdf_app.builder();
    builder.set_output("report_from_html.pdf");
    builder.set_html(html);
    builder.build().unwrap();
}

Сравнение библиотек

Рекомендаций