Rust PDF生成库pdf-writer的使用,高效创建和操作PDF文档的轻量级解决方案

Rust PDF生成库pdf-writer的使用,高效创建和操作PDF文档的轻量级解决方案

完整示例

以下是基于内容中提供的示例,扩展的一个更完整的PDF生成示例,包含多页文档和不同元素:

use pdf_writer::{Content, Filter, Finish, Name, Pdf, Rect, Ref, Str};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 定义所有引用ID
    let catalog_id = Ref::new(1);
    let page_tree_id = Ref::new(2);
    let page1_id = Ref::new(3);
    let page2_id = Ref::new(4);
    let font_id = Ref::new(5);
    let content1_id = Ref::new(6);
    let content2_id = Ref::new(7);
    let resources_id = Ref::new(8);

    // 创建PDF文档
    let mut pdf = Pdf::new();

    // 1. 设置文档目录
    pdf.catalog(catalog_id).pages(page_tree_id);

    // 2. 设置页面树(包含两页)
    pdf.pages(page_tree_id)
        .kids([page1_id, page2_id])
        .count(2);

    // 3. 设置第一页
    pdf.page(page1_id)
        .parent(page_tree_id)
        .media_box(Rect::new(0.0, 0.0, 595.0, 842.0)) // A4尺寸
        .contents(content1_id)
        .resources(resources_id);

    // 4. 设置第二页
    pdf.page(page2_id)
        .parent(page_tree_id)
        .media_box(Rect::new(0.0, 0.0, 595.0, 842.0))
        .contents(content2_id)
        .resources(resources_id);

    // 5. 设置共享资源
    pdf.resources(resources_id)
        .fonts()
        .pair(Name(b"F1"), font_id);

    // 6. 设置字体
    pdf.font(font_id)
        .base_font(Name(b"Helvetica-Bold"))
        .subtype(Name(b"Type1"));

    // 7. 创建第一页内容流
    let mut content1 = Content::new();
    content1
        .begin_text()
        .set_font(Name(b"F1"), 36.0)
        .next_line(100.0, 700.0)
        .show(Str(b"First Page"))
        .set_font(Name(b"F1"), 24.0)
        .next_line(0.0, -50.0)
        .show(Str(b"This is the first page content."))
        .end_text();

    // 8. 创建第二页内容流
    let mut content2 = Content::new();
    content2
        .begin_text()
        .set_font(Name(b"F1"), 36.0)
        .next_line(100.0, 700.0)
        .show(Str(b"Second Page"))
        .set_font(Name(b"F1"), 24.0)
        .next_line(0.0, -50.0)
        .show(Str(b"This is the second page content."))
        .next_line(0.0, -50.0)
        .show(Str(b"PDF generation with pdf-writer!"))
        .end_text();

    // 9. 添加内容流到PDF
    pdf.stream(content1_id, &content1.finish())
        .filter(Filter::FlateDecode);
    pdf.stream(content2_id, &content2.finish())
        .filter(Filter::FlateDecode);

    // 10. 写入文件
    std::fs::write("target/multi_page.pdf", pdf.finish())?;

    Ok(())
}

这个完整示例展示了:

  1. 创建一个包含两页的PDF文档
  2. 每页有不同的文本内容
  3. 使用共享的字体资源
  4. 设置了文本格式和位置
  5. 使用FlateDecode压缩内容流
  6. 将最终PDF写入文件

要运行此示例,请确保已按照前面的说明添加了pdf-writer依赖。


1 回复

Rust PDF生成库pdf-writer的使用指南

pdf-writer是一个轻量级的Rust库,专注于高效创建和操作PDF文档。它提供了简洁的API来生成符合PDF标准的文档,而不需要复杂的依赖关系。

主要特性

  • 轻量级且无依赖
  • 符合PDF 1.7标准
  • 支持文本、图像、路径等基本元素
  • 内存高效,适合生成大型PDF
  • 良好的文档和类型安全

基本使用方法

首先在Cargo.toml中添加依赖:

[dependencies]
pdf-writer = "0.7"

创建简单PDF文档

use pdf_writer::{Content, Finish, Name, Pdf, Rect, Ref, Str, TextStr};

fn main() -> std::io::Result<()> {
    // 创建一个新的PDF文档
    let mut pdf = Pdf::new();
    
    // 分配页面对象ID
    let catalog_id = Ref::new(1);
    let page_tree_id = Ref::new(2);
    let page_id = Ref::new(3);
    let content_id = Ref::new(4);
    let font_id = Ref::new(5);
    
    // 写入文档目录
    pdf.catalog(catalog_id)
        .pages(page_tree_id);
    
    // 写入页面树
    pdf.pages(page_tree_id)
        .kids([page_id])
        .count(1);
    
    // 写入页面
    let mut page = pdf.page(page_id);
    page.media_box(Rect::new(0.0, 0.0, 595.0, 842.0)); // A4尺寸
    page.parent(page_tree_id);
    page.contents(content_id);
    page.resources()
        .fonts()
        .pair(Name(b"F1"), font_id);
    page.finish();
    
    // 写入字体
    pdf.type1_font(font_id)
        .base_font(Name(b"Helvetica"));
    
    // 写入页面内容
    let mut content = Content::new();
    content.begin_text();
    content.set_font(Name(b"F1"), 16.0);
    content.next_line(极客时间("Rust PDF生成库pdf-writer的使用指南", "2023-10-15"))
回到顶部