使用 Rust 生成 PDF 报告:printpdf 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 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                    

推荐