用Rust生成PDF文件的方法有哪些

最近需要用Rust生成PDF文件,但不太清楚有哪些可用的方法。请问各位大佬有什么推荐的库或工具吗?最好是能支持中文显示的方案,性能稳定点的。目前只了解过printpdf这个库,不知道还有没有其他更好的选择?

2 回复

用Rust生成PDF主要有以下几种方法:

  1. printpdf - 最流行的库,支持文本、图像、矢量图形,API相对友好
  2. lopdf - 底层PDF操作库,功能强大但API较复杂
  3. pdf-writer - 专注于PDF生成的轻量级库
  4. wkhtmltopdf的Rust绑定 - 通过HTML转PDF

推荐新手用printpdf,代码示例:

use printpdf::*;

let (doc, page1, layer1) = PdfDocument::new("PDF_Document", Mm(210.0), Mm(297.0), "Layer 1");
// 添加文本和图形...
doc.save(&mut BufWriter::new(File::create("test.pdf")?))?;

需要高级功能可考虑lopdf,需要从HTML生成就用wkhtmltopdf。根据项目需求选择合适的库即可。


在Rust中生成PDF文件,主要有以下几种方法:

1. printpdf 库(推荐)

最流行的Rust PDF生成库,支持文本、图像、矢量图形等。

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);
    
    // 保存文件
    doc.save(&mut BufWriter::new(File::create("test.pdf")?))?;
    Ok(())
}

2. lopdf 库

轻量级PDF操作库,支持生成和修改PDF。

use lopdf::{Document, Object, ObjectId};
use std::collections::BTreeMap;

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";
    // 构建页面内容...
    
    doc.save("output.pdf")?;
    Ok(())
}

3. pdf-canvas 库

基于Cairo的PDF生成库,适合需要图形绘制的场景。

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

fn draw_pdf() -> Result<(), Box<dyn std::error::Error>> {
    let mut document = Pdf::create("output.pdf")?;
    document.render_page(600.0, 400.0, |c| {
        c.translate(100.0, 300.0);
        c.set_font(BuiltinFont::Helvetica, 24.0)?;
        c.set_color(Color::rgb(0.0, 0.0, 0.0))?;
        c.show_text("Hello PDF")?;
        Ok(())
    })?;
    document.finish()?;
    Ok(())
}

4. 组合使用多个库

对于复杂需求,可以组合使用:

  • printpdf 用于主要内容生成
  • image 库处理图片
  • rusttype 处理字体

选择建议:

  • 简单文档:使用 printpdf
  • 需要修改现有PDF:使用 lopdf
  • 图形密集型:考虑 pdf-canvas

在Cargo.toml中添加依赖:

[dependencies]
printpdf = "0.4"
lopdf = "0.28"
pdf-canvas = "0.5"

这些库都提供了良好的文档和示例,可以根据具体需求选择合适的方案。

回到顶部