Генерация 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();
}