使用 Rust 生成 PDF 报告:库概览与实战示例
Rust 是一种现代系统编程语言,在 Web 开发中越来越受欢迎,包括用于构建服务器端应用程序和文档生成工具。如果您需要使用 Rust 生成 PDF 报告,那么您来对地方了。在本文中,我们将介绍用于处理 PDF 的主要库、它们的功能,并提供可运行的代码示例。
为什么用 Rust 生成 PDF?
PDF 是用于交换文档、报告和发票的通用格式。Rust 提供:
- 高性能和低内存消耗。
- 无垃圾回收器的内存安全。
- 易于与 Web 框架(Actix、Rocket、Axum)集成。
- 跨平台支持(Windows、Linux、macOS)。
Rust 中用于 PDF 的主要库
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 — 通过 WebKit 将 HTML 转为 PDF
如果您更喜欢使用 HTML/CSS 来设计报告,可以使用 wkhtmltopdf 工具的封装。它支持样式、图像和 JavaScript,将 HTML 模板转换为 PDF。
安装:
[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&g