使用 printpdf 库在 Rust 中生成 PDF 报告
在现代 Web 开发中,创建 PDF 文档仍然是一项常见的任务——从生成发票和报告到导出数据。如果你的项目是用 Rust 编写的,或者你将其用于后端,那么 printpdf 库将成为生成 PDF 的可靠工具。在本文中,我们将探讨 printpdf 的功能,展示代码示例,并讨论如何将其集成到教育项目中。
什么是 printpdf?
printpdf 是一个纯 Rust 库,用于创建 PDF 文档,无需外部依赖。它允许你:
- 创建包含任意内容的多页文档
- 使用各种字体(包括 TrueType 和 OpenType)添加文本
- 绘制线条、矩形、椭圆和复杂路径
- 嵌入图像(JPEG、PNG)
- 处理表格和网格
- 管理色彩空间(RGB、CMYK、灰度)
主要优势是完全自主:无需安装 LaTeX、wkhtmltopdf 或其他系统。这使得 printpdf 成为教育网站 pythonlib.ru 的理想选择,因为该网站注重部署的简便性和示例的可重现性。
安装和第一个文档
将依赖项添加到 Cargo.toml:
[dependencies]printpdf = "0.7"让我们创建一个包含文本的简单 PDF:
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // 创建一个 A4 格式的文档 let (doc, page1, layer1) = PdfDocument::new( "我的第一个 PDF", 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( "你好,PythonLib!", 24.0, Mm(10.0), Mm(280.0), &font );
// 保存文件 let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut writer).unwrap();
println!("PDF 已创建:hello.pdf");}此代码创建了一个包含文本的单页 PDF。请注意:use_text 接受以毫米为单位的坐标,字体大小以磅为单位。
处理图形和颜色
printpdf 支持绘制基本图形。让我们创建一个包含线条和填充矩形的报告:
use printpdf::*;
fn create_report() -> (PdfDocumentReference, PdfPageIndex, PdfLayerIndex) { let (doc, page, layer) = PdfDocument::new( "报告", Mm(210.0), Mm(297.0), "Data" );
let layer = doc.get_page(page).get_layer(layer);
// 绘制一条红线 let points = vec![ (Point::new(Mm(20.0), Mm(250.0)), false), (Point::new(Mm(190.0), Mm(250.0)), false), ]; let line = Line { points, is_closed: false, }; layer.set_color(Color::Rgb(Rgb::new(1.0, 0.0, 0.0))); layer.add_line(line);
// 填充的蓝色矩形 let rect = Polygon { vertices: vec![ (Point::new(Mm(50.0), Mm(200.0)), false), (Point::new(Mm(150.0), Mm(200.0)), false), (Point::new(Mm(150.0), Mm(180.0)), false), (Point::new(Mm(50.0), Mm(180.0)), false), ], is_closed: true, }; layer.set_color(Color::Rgb(Rgb::new(0.0, 0.0, 1.0))); layer.add_polygon(rect);
(doc, page, layer)}颜色在 0.0–1.0 范围内指定。对于 CMYK,请使用 Color::Cmyk(Cmyk::new(0.0, 1.0, 0.0, 0.0))。
嵌入图像
让我们在报告中添加一个徽标:
use printpdf::*;use std::fs::Fi