br_code/
barcode.rs

1use std::fs;
2use barcoders::generators::image::Image;
3use barcoders::generators::svg::{SVG};
4use barcoders::sym::code128::Code128;
5use barcoders::sym::code39::Code39;
6use barcoders::sym::code93::Code93;
7use barcoders::sym::ean13::*;
8use barcoders::sym::ean8::EAN8;
9use ril::{Image as ril_Image, ImageFormat as ril_ImageFormat, Rgb as ril_Rgb};
10
11/// EAN13
12pub fn barcode_create_ean13(code: &str, mode: &str, filename: &str) -> bool {
13    match EAN13::new(code) {
14        Ok(ean13) => {
15            let mut encoded: Vec<u8> = ean13.encode();
16            match mode {
17                "svg" => {
18                    let svg = SVG::new(80);
19                    let data: String = svg.generate(&encoded).unwrap();
20                    fs::write(filename, data).is_ok()
21                }
22                "png" => {
23                    let mut list = vec![];
24                    let index = 5;
25                    for _ in 0..5 {
26                        encoded.insert(0, 0);
27                        encoded.push(0);
28                    }
29                    let mut top = encoded.clone();
30                    top.fill(0);
31                    for _ in 0..5 {
32                        list.push(top.clone());
33                    }
34                    for _ in 0..50 {
35                        list.push(encoded.clone())
36                    }
37                    for _ in 0..5 {
38                        let mut tt = top.clone();
39                        tt[index] = 1;
40                        tt[index + 2] = 1;
41                        let len = tt.len() / 2 - 10;
42                        tt[index + len] = 1;
43                        tt[index + len + 2] = 1;
44
45                        let ind = tt.len() - index - 1;
46                        tt[ind] = 1;
47                        tt[ind - 2] = 1;
48                        list.push(tt.clone())
49                    }
50                    for _ in 0..5 {
51                        list.push(top.clone());
52                    }
53
54                    let image = ril_Image::from_fn(encoded.len() as u32, list.len() as u32, |w, h| {
55                        if list[h as usize][w as usize] == 0 {
56                            ril_Rgb::new(255, 255, 255)
57                        } else {
58                            ril_Rgb::new(0, 0, 0)
59                        }
60                    });
61                    image.save(ril_ImageFormat::Png, filename).is_ok()
62                }
63                _ => {
64                    let svg = SVG::new(80);
65                    let data: String = svg.generate(&encoded).unwrap();
66                    fs::write(filename, data).is_ok()
67                }
68            }
69        }
70        Err(e) => {
71            println!("{}", e);
72            false
73        }
74    }
75}
76
77/// EAN8
78pub fn barcode_create_ean8(code: &str, mode: &str, filename: &str) -> bool {
79    match EAN8::new(code) {
80        Ok(ean8) => {
81            let encoded: Vec<u8> = ean8.encode();
82            match mode {
83                "svg" => {
84                    let svg = SVG::new(80);
85                    let data: String = svg.generate(&encoded).unwrap();
86                    fs::write(filename, data).is_ok()
87                }
88                "png" => {
89                    let png = Image::png(20);
90                    let bytes = png.generate(&encoded[..]).unwrap();
91                    fs::write(filename, bytes).is_ok()
92                }
93                _ => {
94                    let svg = SVG::new(80);
95                    let data: String = svg.generate(&encoded).unwrap();
96                    fs::write(filename, data).is_ok()
97                }
98            }
99        }
100        Err(e) => {
101            println!("{}", e);
102            false
103        }
104    }
105}
106
107/// code39
108pub fn barcode_create_code39(code: &str, mode: &str, filename: &str) -> bool {
109    match Code39::new(code) {
110        Ok(barcode) => {
111            let encoded = barcode.encode();
112            match mode {
113                "svg" => {
114                    let svg = SVG::new(80);
115                    let data: String = svg.generate(&encoded).unwrap();
116                    fs::write(filename, data).is_ok()
117                }
118                "png" => {
119                    let png = Image::png(80); // You must specify the height in pixels.
120                    let bytes = png.generate(&encoded[..]).unwrap();
121                    fs::write(filename, bytes).is_ok()
122                }
123                _ => {
124                    let svg = SVG::new(80);
125                    let data: String = svg.generate(&encoded).unwrap();
126                    fs::write(filename, data).is_ok()
127                }
128            }
129        }
130        Err(e) => {
131            println!("{}", e);
132            false
133        }
134    }
135}
136
137/// code93
138pub fn barcode_create_code93(code: &str, mode: &str, filename: &str) -> bool {
139    match Code93::new(code) {
140        Ok(barcode) => {
141            let encoded = barcode.encode();
142            match mode {
143                "svg" => {
144                    let svg = SVG::new(80);
145                    let data: String = svg.generate(&encoded).unwrap();
146                    fs::write(filename, data).is_ok()
147                }
148                "png" => {
149                    let png = Image::png(80); // You must specify the height in pixels.
150                    let bytes = png.generate(&encoded[..]).unwrap();
151                    fs::write(filename, bytes).is_ok()
152                }
153                _ => {
154                    let svg = SVG::new(80);
155                    let data: String = svg.generate(&encoded).unwrap();
156                    fs::write(filename, data).is_ok()
157                }
158            }
159        }
160        Err(e) => {
161            println!("{}", e);
162            false
163        }
164    }
165}
166
167/// code128
168pub fn barcode_create_code128(code: &str, unit: &str, mode: &str, filename: &str) -> bool {
169    let code = match unit {
170        "a" => {
171            code.to_string()
172        }
173        "b" => {
174            code.to_string()
175        }
176        "c" => {
177            code.to_string()
178        }
179        _ => {
180            code.to_string()
181        }
182    };
183
184    match Code128::new(code) {
185        Ok(barcode) => {
186            let encoded = barcode.encode();
187            match mode {
188                "svg" => {
189                    let svg = SVG::new(80);
190                    let data: String = svg.generate(&encoded).unwrap();
191                    fs::write(filename, data).is_ok()
192                }
193                "png" => {
194                    let png = Image::png(80);
195                    let bytes = png.generate(&encoded[..]).unwrap();
196                    fs::write(filename, bytes).is_ok()
197                }
198                _ => {
199                    let svg = SVG::new(80);
200                    let data: String = svg.generate(&encoded).unwrap();
201                    fs::write(filename, data).is_ok()
202                }
203            }
204        }
205        Err(e) => {
206            println!("{}", e);
207            false
208        }
209    }
210}
211
212pub fn create_barcode(code: &str) -> String {
213    let len = code.len();
214    match len {
215        8 => {
216            match EAN8::new(code) {
217                Ok(ean8) => {
218                    let encoded: Vec<u8> = ean8.encode();
219                    let svg = SVG::new(80);
220                    let data: String = svg.generate(&encoded).unwrap();
221                    data
222                }
223                Err(_) => {
224                    "".to_string()
225                }
226            }
227        }
228        13 => {
229            match EAN13::new(code) {
230                Ok(ean13) => {
231                    let encoded: Vec<u8> = ean13.encode();
232                    let svg = SVG::new(80);
233                    let data: String = svg.generate(&encoded).unwrap();
234                    data
235                }
236                Err(_) => {
237                    "".to_string()
238                }
239            }
240        }
241        _ => {
242            match Code93::new(code) {
243                Ok(barcode) => {
244                    let encoded = barcode.encode();
245                    let svg = SVG::new(80);
246                    let data: String = svg.generate(&encoded).unwrap();
247                    data
248                }
249                Err(_) => {
250                    "".to_string()
251                }
252            }
253        }
254    }
255}