Skip to main content

easyofd_reader/
dl_ofd_reader.rs

1//! DLOFD 解析器(废弃)。
2//!
3//! 对应 Java: org.ofdrw.reader.DLOFDReader
4//!
5//! 已废弃:Java 原始类标记为 `@Deprecated`,建议使用 `OFDReader`。
6//! Rust 版提供轻量门面,委托给 `OfdReaderFacade`。
7
8use std::io::{Read, Seek};
9
10use easyofd_core::{OfdPage, OfdResult};
11
12#[allow(deprecated)]
13use crate::model::{AnnotionEntity, OfdPageVo};
14use crate::ofd_reader_facade::OfdReaderFacade;
15use crate::read_options::ReadOptions;
16
17/// DLOFD 解析器。
18///
19/// 对应 Java: `org.ofdrw.reader.DLOFDReader`
20///
21/// **废弃**:Java 原始类标记为 `@Deprecated`,建议使用 [`OfdReaderFacade`]。
22///
23/// 提供与 Java 版兼容的 API,内部委托给 [`OfdReaderFacade`]。
24#[derive(Debug)]
25#[deprecated(since = "1.0.0", note = "使用 OfdReaderFacade 替代")]
26pub struct DlOfdReader {
27    /// 内部门面。
28    facade: OfdReaderFacade,
29}
30
31#[allow(deprecated)]
32impl DlOfdReader {
33    /// 从文件路径打开 OFD 文档。
34    ///
35    /// 对应 Java: `DLOFDReader(Path ofdFile)`
36    pub fn open(path: impl AsRef<std::path::Path>) -> OfdResult<Self> {
37        Ok(Self {
38            facade: OfdReaderFacade::open(path)?,
39        })
40    }
41
42    /// 从字节数组解析 OFD 文档。
43    ///
44    /// 对应 Java: `DLOFDReader(InputStream stream)`
45    pub fn from_bytes(data: &[u8]) -> OfdResult<Self> {
46        Ok(Self {
47            facade: OfdReaderFacade::from_bytes(data)?,
48        })
49    }
50
51    /// 从 `Read + Seek` 输入创建。
52    pub fn from_seek<R: Read + Seek>(source: R, options: ReadOptions) -> OfdResult<Self> {
53        Ok(Self {
54            facade: OfdReaderFacade::from_seek(source, options)?,
55        })
56    }
57
58    /// 获取内部门面引用。
59    #[must_use]
60    pub fn facade(&self) -> &OfdReaderFacade {
61        &self.facade
62    }
63
64    /// 获取文档页数。
65    #[must_use]
66    pub fn page_count(&self) -> usize {
67        self.facade.page_count()
68    }
69
70    /// 获取所有页面。
71    #[must_use]
72    pub fn pages(&self) -> &[OfdPage] {
73        self.facade.pages()
74    }
75
76    /// 获取 OFD 页面视图对象列表。
77    ///
78    /// 对应 Java: `DLOFDReader.getOFDPageVO()`
79    #[must_use]
80    pub fn get_ofd_page_vo(&self) -> Vec<OfdPageVo> {
81        self.facade
82            .pages()
83            .iter()
84            .enumerate()
85            .map(|(i, page)| {
86                let page_path = page
87                    .base_path
88                    .clone()
89                    .unwrap_or_else(|| format!("Pages/Page_{i}/Content.xml"));
90                OfdPageVo::new(page_path, None)
91            })
92            .collect()
93    }
94
95    /// 获取注释列表(简化实现)。
96    ///
97    /// 对应 Java: `DLOFDReader.getAnnotaions()`
98    #[must_use]
99    pub fn get_annotations(&self) -> Vec<AnnotionEntity> {
100        // 简化实现:返回空列表,因为注释解析需要完整的 XML 模型
101        Vec::new()
102    }
103
104    /// 提取所有文本。
105    #[must_use]
106    pub fn extract_all_text(&self) -> String {
107        self.facade.extract_all_text()
108    }
109}
110
111#[cfg(test)]
112mod tests {
113    #[allow(deprecated)]
114    use super::*;
115    use easyofd_core::TextObject;
116    use easyofd_writer::OfdWriter;
117
118    fn build_test_ofd() -> Vec<u8> {
119        let mut writer = OfdWriter::new();
120        let mut page = OfdPage::new(210.0, 297.0);
121        page.add_text(TextObject::new(10.0, 20.0, "DL Test"));
122        writer.add_page(page);
123        writer.build().unwrap()
124    }
125
126    #[test]
127    #[allow(deprecated)]
128    fn test_dl_ofd_reader_from_bytes() {
129        let bytes = build_test_ofd();
130        let reader = DlOfdReader::from_bytes(&bytes).unwrap();
131        assert_eq!(reader.page_count(), 1);
132    }
133
134    #[test]
135    #[allow(deprecated)]
136    fn test_dl_ofd_reader_get_ofd_page_vo() {
137        let bytes = build_test_ofd();
138        let reader = DlOfdReader::from_bytes(&bytes).unwrap();
139        let vos = reader.get_ofd_page_vo();
140        assert_eq!(vos.len(), 1);
141    }
142
143    #[test]
144    #[allow(deprecated)]
145    fn test_dl_ofd_reader_annotations() {
146        let bytes = build_test_ofd();
147        let reader = DlOfdReader::from_bytes(&bytes).unwrap();
148        assert!(reader.get_annotations().is_empty());
149    }
150
151    #[test]
152    #[allow(deprecated)]
153    fn test_dl_ofd_reader_extract_text() {
154        let bytes = build_test_ofd();
155        let reader = DlOfdReader::from_bytes(&bytes).unwrap();
156        let text = reader.extract_all_text();
157        assert!(text.contains("DL Test"));
158    }
159}