Rust中的PDF生成:库概览与实践示例
Rust是一种系统编程语言,越来越多地被用于创建高性能的服务器应用程序、Web服务和命令行工具。开发此类项目时,一个常见任务是生成PDF文档:报告、发票、证书或简单的格式化文本文件。在本文中,我们将介绍Rust中用于处理PDF的主要库、它们的功能、代码示例以及选择标准。
Rust中用于PDF生成的流行库
目前,在Rust生态系统中,可以重点介绍三个得到社区积极支持和使用的库:
- printpdf — 一个底层库,用于创建PDF文档,可完全控制内容。支持文本、图像、矢量图形、表格和字体嵌入。
- genpdf — 一个基于printpdf构建的更高层库。提供了处理文本、段落、表格和样式的便捷抽象。
- pdf_writer — 另一个底层库,专注于极简主义和性能。允许直接编写PDF文件,但需要深入理解PDF格式。
printpdf库
printpdf 是Rust中最流行的PDF生成库之一。它提供了用于处理图形基元、文本和字体的API。主要功能:
- 创建多页文档;
- 嵌入TrueType/OpenType字体;
- 绘制线条、矩形、圆形和其他形状;
- 插入图像(PNG、JPEG);
- 处理颜色和透明度;
- 支持Unicode和西里尔字母。
使用printpdf创建包含文本的简单PDF示例:
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // 创建A4格式文档 let (doc, page1, layer1) = PdfDocument::new( "Rust上的PDF示例", Mm(210.0), Mm(297.0), "Layer 1", );
// 获取当前字体(内置Helvetica) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// 使用图层进行绘制 let layer = doc.get_page(page1).get_layer(layer1);
// 添加文本 layer.use_text("你好,世界!来自Rust的PDF", 24.0, Mm(50.0), Mm(250.0), &font);
// 保存文件 let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}genpdf库
genpdf 是printpdf的一个封装,提供了更高级的API。它非常适合创建具有简单格式的文档:标题、段落、列表、表格。主要优势:
- 自动管理分页;
- 支持样式(粗体、斜体、下划线);
- 内置支持带单元格和边框的表格;
- 添加元素的简单接口。
使用genpdf创建包含表格的PDF示例:
use genpdf::*;use genpdf::elements::*;use std::fs::File;
fn main() { // 创建文档 let mut doc = Document::new("Liberation Serif") .expect("加载字体失败");
// 设置默认样式 doc.set_title("销售报告");
// 添加段落 doc.push(Paragraph::new("各月销售额:"));
// 创建表格 let mut table = Table::new(vec![2, 3, 2]); table.set_cell_border_style(BorderStyle::Solid); table.push_row(vec![ "月份".to_string(), "收入,卢布".to_stri