4个版本
0.2.1 | 2023年9月3日 |
---|---|
0.2.0 | 2023年9月3日 |
0.1.1 | 2023年8月27日 |
0.1.0 | 2023年8月27日 |
#21 in #chromium
36 每月下载量
在 2 crate 中使用
16KB
106 行
Simple PDF Generator
Rust库,将HTML5文件转换为PDF。这是simple-pdf-generator的Rust版本。
安装
这是一个通过crates.io提供的Rust库。
使用cargo add命令进行安装
$ cargo add simple_pdf_generator
功能
Simple PDF Generator
- 支持
Option
类型; - 支持自定义CSS和JS;
- 在HTML模板中填充自定义字段;
- 对值进行清理以防止XSS攻击;
- 可以自动生成动态表格。
限制
- 由于
chromiumoxide
没有实现基于Chromium的浏览器的自动下载,您必须手动安装它
快速入门
要有一个模板,您必须创建带有PdfTemplate
derive的结构体
use simple_pdf_generator::{Asset, AssetType};
use simple_pdf_generator_derive::PdfTemplate;
struct Example {
id: i64,
name: Option<String>,
opt_value: Option<String>,
surname: String,
is_true: bool,
}
并添加HTML文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col">Id</div>
<div class="col">%%id%%</div>
<div class="col">Name</div>
<div class="col">%%name%%</div>
<div class="col">Opt Value</div>
<div class="col">%%opt_value%%</div>
<div class="col">Surname</div>
<div class="col">%%surname%%</div>
<div class="col">Is True</div>
<div class="col">%%is_true%%</div>
</div>
</div>
</body>
</html>
现在您可以使用Example
结构体来生成PDF文件
use std::env;
use simple_pdf_generator::{Asset, AssetType};
use simple_pdf_generator_derive::PdfTemplate;
#[tokio::main]
async fn main() {
// fill the struct
let example = Example {
id: 1,
name: Some("Foo".to_string()),
opt_value: None,
surname: "Bar".to_string(),
is_true: true,
};
// get the html template path
let html_path = env::current_dir()
.unwrap()
.join("test_suite")
.join("src/template/index.html");
// inject some assets, in this case the bootstrap css
let assets = [Asset {
path: env::current_dir()
.unwrap()
.join("test_suite")
.join("src/template/css/bootstrap.min.css"),
r#type: AssetType::Style,
}];
// generate the pdf file
let pdf_buf = example.generate_pdf(html_path, &assets).await;
tokio::fs::write("example.pdf", pdf_buf).await.expect("Unable to write file");
}
生成表格
要生成表格,必须在您的数据属性上使用PdfTableData
宏
use std::env;
use serde::Serialize;
use simple_pdf_generator::{Asset, AssetType};
use simple_pdf_generator_derive::PdfTemplate;
struct Example {
id: i64,
name: Option<String>,
opt_value: Option<String>,
surname: String,
is_true: bool,
#[PdfTableData]
my_table: Vec<MyTableData>,
}
#[derive(Serialize)]
struct MyTableData {
index: u8,
name: String,
surname: String,
email: String,
}
#[tokio::main]
async fn main() {
// fill the struct
let example = Example {
id: 1,
name: Some("Foo".to_string()),
opt_value: None,
surname: "Bar".to_string(),
is_true: true,
my_table: vec![
MyTableData {
index: 1,
name: "James".to_string(),
surname: "Smith".to_string(),
email: "[email protected]".to_string(),
},
MyTableData {
index: 2,
name: "Robert".to_string(),
surname: "Johnson".to_string(),
email: "[email protected]".to_string(),
},
],
};
// get the html template path
let html_path = env::current_dir()
.unwrap()
.join("test_suite")
.join("src/template/index.html");
// inject some assets, in this case the bootstrap css
let assets = [Asset {
path: env::current_dir()
.unwrap()
.join("test_suite")
.join("src/template/css/bootstrap.min.css"),
r#type: AssetType::Style,
}];
// define the print options
let print_options = PrintOptions {
paper_width: Some(210.0), // A4 paper size in mm
paper_height: Some(297.0), // A4 paper size in mm
margin_top: Some(10.0), // 10mm margin
margin_bottom: Some(10.0), // 10mm margin
margin_left: Some(10.0), // 10mm margin
margin_right: Some(10.0), // 10mm margin
..PrintOptions::default()
};
// generate the pdf file
let pdf_buf = example.generate_pdf(html_path, &assets, &print_options).await;
tokio::fs::write("example.pdf", pdf_buf).await.expect("Unable to write file");
}
在HTML文件中写入以下内容
<inject-table items="my_table">
<inject-column prop="index" label="#" />
<inject-column prop="name" label="Name" />
<inject-column prop="surname" label="Surname" />
<inject-column prop="email" label="Email" />
</inject-table>
API
宏
宏 | 目的 | HTML使用 |
---|---|---|
PdfTemplate |
定义包含HTML占位符值的结构体 | %%prop_name%% |
PdfTableData |
定义表格数据。必须是serde::Serialize 结构的向量 |
<inject-table items="prop_name"> <inject-column prop="struct_prop_name" label="Something"/> </inject-table> |
generate_pdf
async generate_pdf(
html_path: std::path::PathBuf,
assets: &[simple_pdf_generator::Asset],
print_options: &simple_pdf_generator::PrintOptions
) -> std::result::Result<Vec<u8>, simple_pdf_generator::SimplePdfGeneratorError>
返回PDF文件作为Vec<u8>
。
参数 | 描述 |
---|---|
html_path: std::路径::PathBuf |
PDF 输出目录 |
资产: &[simple_pdf_generator::Asset] |
资产向量(可以为空 vec![] ) |
打印选项: &simple_pdf_generator::PrintOptions |
打印选项(具有默认值 PrintOptions::default() ) |
simple_pdf_generator::SimplePdfGeneratorError
enum SimplePdfGeneratorError {
BrowserError(String),
IoError(String),
PdfError(String),
}
simple_pdf_generator::{Asset,AssetType}
struct Asset {
pub path: PathBuf,
pub r#type: AssetType,
}
enum AssetType {
Style,
Script,
}
### simple_pdf_generator::PrintOptions
struct PrintOptions {
pub print_background: bool,
pub paper_width: Option<f64>,
pub paper_height: Option<f64>,
pub margin_top: Option<f64>,
pub margin_bottom: Option<f64>,
pub margin_left: Option<f64>,
pub margin_right: Option<f64>,
pub page_ranges: Option<String>,
pub prefer_css_page_size: bool,
pub landscape: bool,
}
人员
此库由以下人员开发:
许可证
依赖项
~0.6–1.4MB
~31K SLoC