Rust 中生成 PDF:库与工具概览

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

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

开始课程

Rust 中生成 PDF:库与工具概览



Rust 是一种现代系统编程语言,越来越多地被用于创建高性能的服务器端应用程序,包括文档生成。在本文中,我们将介绍在 Rust 中创建 PDF 文件的主要库、它们的功能、使用示例以及选择建议。



Rust 中用于处理 PDF 的主要库



Rust 生态系统提供了几个成熟的 PDF 生成解决方案。让我们来看看最流行的几个:



  • printpdf — 一个底层库,支持矢量图形、图像和字体。
  • genpdf — 一个高层库,提供简单的 API 用于创建文档。
  • pdf_writer — 一个快速且安全的 PDF 生成器,依赖项最少。
  • wkhtmltopdf — 一个用于将 HTML 转换为 PDF 的 wkhtmltopdf 工具封装。


printpdf 库



printpdf 是 Rust 中最流行的 PDF 生成库之一。它提供了对文档内容的完全控制:文本、线条、矩形、图像和嵌入字体。



安装

[dependencies]printpdf = "0.7"


示例:创建包含文本的简单 PDF

use printpdf::*;use std::fs::File;use std::io::BufWriter;

fn main() { // 创建一个 A4 格式的文档 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( "你好,来自 Rust 的 PDF 世界!", 24.0, Mm(20.0), Mm(270.0), &font );

// 保存到文件 let file = File::create("example.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}


genpdf 库



genpdf 提供了更高级的 API,类似于文字处理软件的操作。支持段落、表格、标题和自动换行。



安装

[dependencies]genpdf = "0.2"


示例:创建包含标题和表格的文档

use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Table, TableLayout};use genpdf::fonts::FontFamily;

fn main() -> Result<(), Box> { // 加载字体(例如,DejaVu Sans) let font_family = FontFamily::from_files( "/usr/share/fonts/truetype/dejavu/", "DejaVuSans", None )?;

// 创建文档 let mut doc = Document::new(font_family, SimplePageSettings::a4());

// 添加标题 doc.push(Paragraph::new("销售报告").aligned(genpdf::Alignment::Center));

// 创建表格 let mut table = Table::new(TableLayout::new(vec![2, 3, 2])); table.row() .element(Paragraph::new("商品")) .element(Paragraph::new("数量")) .element(Paragraph::new("价格")); table.row() .element(Paragraph::new("笔记本电脑")) .element(Paragraph::new("10")) .element(Paragraph::new("50,000 卢布")); table.row() .element(Paragraph::new("鼠标")) .element(Paragraph::new("50")) .element(Paragraph::new("1,500 卢布"));

doc.push(table);

// 保存 doc.render_to_file("report.pdf")?; Ok(())}


pdf_writer 库



pdf_writer — 一个极简且快速的库,专注于底层 PDF 结构操作。

推荐