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

Download history 1202/week @ 2024-03-14 1565/week @ 2024-03-21 1238/week @ 2024-03-28 1194/week @ 2024-04-04 1086/week @ 2024-04-11 1175/week @ 2024-04-18 1379/week @ 2024-04-25 1246/week @ 2024-05-02 1000/week @ 2024-05-09 1156/week @ 2024-05-16 1198/week @ 2024-05-23 1431/week @ 2024-05-30 1182/week @ 2024-06-06 1183/week @ 2024-06-13 972/week @ 2024-06-20 1548/week @ 2024-06-27

5,048 每月下载量
用于 14 个crate(通过 pdf

MIT 许可证

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