7个版本
| 0.2.0 | 2023年11月30日 |
|---|---|
| 0.1.22 | 2021年4月29日 |
| 0.1.21 | 2021年1月28日 |
| 0.1.20 | 2020年8月23日 |
| 0.1.15 | 2017年6月10日 |
167 在 #pdf
5,048 每月下载量
用于 14 个crate(通过 pdf)
32KB
629 行
pdf_derive 提供了一个过程宏,用于从 pdf crate 推导 Object 特性。
用法
有几种方法可以在结构体或枚举上推导 Object
1. 从PDF字典推导结构体
PDF 1.7参考中定义的许多字典类型具有有限的可能字段数量。这些字段通常都是必需的或可选的。后者通过使用字段类型为 Option<T> 或 Vec<T> 来实现。
通常,字典类型需要条目 /Type 是某些特定的字符串。默认情况下,pdf_derive 假设这应该等于输入结构体的名称。这可以通过将 Type 属性设置为预期值或设置为 false 以完全省略类型检查来覆盖。
类似 /Type 的检查也可以以相同的方式指定。(但 Type 属性是特殊的,因为它接受布尔值)。
示例
#[derive(Object)]
#[pdf(Type="XObject", Subtype="Image")]
/// A variant of XObject
pub struct ImageDictionary {
#[pdf(key="Width")]
width: i32,
#[pdf(key="Height")]
height: i32,
// [...]
}
这强制字典的 /Type 条目存在且等于 /XObject,并且 /Subtype 条目存在且等于 /Image。
结构体中的每个字段都需要实现 Object。对于像 i32、f32、usize、bool、String(来自 Primitive::Name)、Option 和 Vec 这样的常用类型,已经提供了实现。后两种在输入字典中未找到条目时会初始化为默认值。因此,Option 经常用于 PDF 参考中指定的可选字段。Vec 也可以用于可选字段,这些字段也可以是数组(PDF 规范中有许多这样的字段——一个或多个)。然而,正如所述,它接受条目的缺失,因此尚未提供类型为数组的必填字段的便利。
最后,对于每个字段,可以通过将 default 属性设置为可以解析为 Rust 代码的字符串来定义默认值。
示例
#[derive(Object)]
#[pdf(Type = "XRef")]
pub struct XRefInfo {
#[pdf(key = "Filter")]
filter: Vec<StreamFilter>,
#[pdf(key = "Size")]
pub size: i32,
#[pdf(key = "Index", default = "vec![0, size]")]
pub index: Vec<i32>,
// [...]
}
2. 从 PDF 流创建结构体
PDF 流由一个流字典及其本身组成。假设所有想要从原始流派生 Object 的结构体都有一个字段 info: T,其中 T: Object,以及一个字段 data: Vec<u8>。
从 Primitive::Stream 派生 Object,需要在 proc macro 属性中包含 is_stream 标志。
3. 从 PDF 名称创建枚举
示例
#[derive(Object, Debug)]
pub enum StreamFilter {
ASCIIHexDecode,
ASCII85Decode,
LZWDecode,
FlateDecode,
JPXDecode,
DCTDecode,
}
在这种情况下,只有当原始类型是 Primitive::Name 并且与枚举的某个变体匹配时,StreamFilter::from_primitive(primitive) 才会返回 Ok(_)
依赖项
~1.5MB
~35K SLoC