Rust中的PDF生成:库和工具概览
以高性能和安全性著称的Rust语言,提供了几个强大的库用于创建PDF文档。与Python中reportlab和fpdf占主导地位不同,Rust生态系统提供了轻量级但功能丰富的解决方案。在本文中,我们将介绍三个关键库:printpdf、genpdf和pdf-writer,并涉及一些底层方法。
1. printpdf — 基础但灵活的库
printpdf是Rust中最流行的PDF生成库之一。它提供对PDF结构的底层访问,允许创建具有任意元素定位的文档。该库支持字体嵌入、图像处理以及基本图形原语。
使用示例:
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { let (doc, page1, layer1) = PdfDocument::new("PDF文档", Mm(210.0), Mm(297.0), "Layer 1");
let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// 添加文本 doc.use_text("你好,世界!", 24.0, Mm(20.0), Mm(280.0), &font);
// 绘制线条 let layer = doc.get_page(page1).get_layer(layer1); layer.set_color(Color::Rgb(Rgb::new(0.0, 0.0, 0.0), None)); layer.add_line(Point::new(Mm(20.0), Mm(270.0)), Point::new(Mm(100.0), Mm(270.0)));
// 保存 let file = File::create("example.pdf").unwrap(); doc.save(&mut BufWriter::new(file)).unwrap();}优点:
- 完全控制PDF结构
- 支持嵌入TrueType字体
- 支持图像处理(PNG、JPEG)
- 支持SVG图形(通过
printpdf-svg)
缺点:
- 没有自动文本排版
- 需要手动管理定位
- 不支持表格和多页布局
2. genpdf — 用于带排版的简单文档
genpdf是一个更高级的库,可以自动处理排版过程。它非常适合创建报告、信件和其他结构简单的文档。该库支持换行、文本对齐和基本设计元素。
创建简单文档的示例:
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Break, Image};use genpdf::fonts::FontFamily;
fn main() -> Result<(), Box> { let font_family = FontFamily::from_files( "fonts/", "LiberationSans", None )?;
let mut doc = Document::new(font_family); doc.set_title("文档示例");
// 添加元素 doc.push(Paragraph::new("标题").bold()); doc.push(Break::new(5.0)); doc.push(Paragraph::new("带有自动换行的正文。".to_string() + "genpdf库会自动计算位置。"));
// 保存 doc.render_to_file("output.pdf")?; Ok(())} 优点:
- 自动文本排版
- 支持换行和对齐
- 简单的API用于添加元素
- 支持创建多页文档
缺点:
- 图形支持有限
- 没有内置表格支持
- 对定位的控制较少
3. pdf-writer — 底层高性能
pdf-writer是一个极简的库,用于直接写入PDF对象。它