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