Rust如何生成PDF文件

最近需要在Rust项目中生成PDF文件,但不太清楚有哪些可用的库以及具体实现方法。请问有哪些推荐的Rust库可以用来生成PDF?最好是能支持添加文本、表格和图片的功能。另外,如果能有简单的代码示例说明如何创建一个基本的PDF文件并添加内容就更好了。谢谢!

2 回复

可以用 printpdflopdf 库。例如用 printpdf

use printpdf::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let (doc, page1, layer1) = PdfDocument::new("PDF_Document_title", Mm(210.0), Mm(297.0), "Layer 1");
    let font = doc.add_builtin_font(BuiltinFont::Helvetica)?;
    
    let current_layer = doc.get_page(page1).get_layer(layer1);
    current_layer.use_text("Hello PDF!", 48.0, Mm(20.0), Mm(270.0), &font);
    
    doc.save(&mut std::fs::File::create("test.pdf")?)?;
    Ok(())
}

先添加依赖:

[dependencies]
printpdf = "0.4.0"

在Rust中生成PDF文件,推荐使用以下库:

主要PDF生成库

1. printpdf

最流行的选择,功能完善:

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

fn create_pdf() -> Result<(), Box<dyn std::error::Error>> {
    let (doc, page1, layer1) = PdfDocument::new("PDF_Document_title", Mm(210.0), Mm(297.0), "Layer 1");
    let current_layer = doc.get_page(page1).get_layer(layer1);
    
    // 设置字体
    let font = doc.add_builtin_font(BuiltinFont::Helvetica)?;
    
    // 添加文本
    current_layer.use_text("Hello PDF!", 48.0, Mm(20.0), Mm(270.0), &font);
    
    // 添加图形
    current_layer.set_outline_color(Color::Rgb(Rgb::new(1.0, 0.0, 0.0, None)));
    current_layer.set_line_width(2.0);
    
    // 保存文件
    doc.save(&mut BufWriter::new(File::create("test.pdf")?))?;
    Ok(())
}

2. lopdf

轻量级PDF操作库:

use lopdf::{Document, Object, ObjectId};
use std::fs::File;

fn create_simple_pdf() -> Result<(), Box<dyn std::error::Error>> {
    let mut doc = Document::with_version("1.5");
    
    // 创建页面
    let pages_id = doc.new_object_id();
    let font_id = doc.add_object(dictionary! {
        "Type" => "Font",
        "Subtype" => "Type1",
        "BaseFont" => "Helvetica",
    });
    
    let content = "Hello World";
    let content_id = doc.add_object(stream_content(|s| {
        s.transform(1.0, 0.0, 0.0, 1.0, 50.0, 700.0);
        s.set_font("F1", 24.0);
        s.show_text(content);
    }));
    
    let page_id = doc.add_object(dictionary! {
        "Type" => "Page",
        "Parent" => pages_id,
        "Contents" => content_id,
    });
    
    doc.save("simple.pdf")?;
    Ok(())
}

3. pdf-canvas

基于Canvas API风格:

use pdf_canvas::{Pdf, GraphicState, BuiltinFont};
use pdf_canvas::graphicsstate::Color;

fn create_with_canvas() -> Result<(), Box<dyn std::error::Error>> {
    let mut document = Pdf::create("canvas.pdf")?;
    document.render_page(595.0, 842.0, |c| {
        c.transform(1.0, 0.0, 0.0, -1.0, 0.0, 842.0);
        c.set_font(BuiltinFont::Helvetica, 24.0);
        c.show_text("Hello Canvas PDF")?;
        Ok(())
    })?;
    document.finish()?;
    Ok(())
}

选择建议

  • printpdf: 功能最全,适合复杂文档
  • lopdf: 轻量级,适合简单PDF生成和操作
  • pdf-canvas: 类似HTML Canvas API,易于上手

在Cargo.toml中添加依赖:

[dependencies]
printpdf = "0.4.0"
# 或
lopdf = "0.28"
# 或
pdf-canvas = "0.5"

这些库都提供了丰富的功能来创建包含文本、图像、表格等内容的PDF文档。

回到顶部