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(())
}
这个完整示例展示了:
- 创建一个包含两页的PDF文档
- 每页有不同的文本内容
- 使用共享的字体资源
- 设置了文本格式和位置
- 使用FlateDecode压缩内容流
- 将最终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"))