1mod docx;
2mod error;
3mod fonts;
4mod model;
5mod pdf;
6
7pub use error::Error;
8
9use std::path::Path;
10use std::time::Instant;
11
12pub fn convert_docx_to_pdf(input: &Path, output: &Path) -> Result<(), Error> {
13 let t0 = Instant::now();
14
15 let doc = docx::parse(input)?;
16 let t_parse = t0.elapsed();
17
18 let bytes = pdf::render(&doc)?;
19 let t_render = t0.elapsed();
20
21 std::fs::write(output, &bytes).map_err(Error::Io)?;
22 let t_total = t0.elapsed();
23
24 log::info!(
25 "Timing: parse={:.1}ms, render={:.1}ms, write={:.1}ms, total={:.1}ms (output {} bytes)",
26 t_parse.as_secs_f64() * 1000.0,
27 (t_render - t_parse).as_secs_f64() * 1000.0,
28 (t_total - t_render).as_secs_f64() * 1000.0,
29 t_total.as_secs_f64() * 1000.0,
30 bytes.len(),
31 );
32
33 Ok(())
34}
35
36pub fn convert_docx_bytes_to_pdf(input: &[u8], output: &Path) -> Result<(), Error> {
37 let t0 = Instant::now();
38
39 let doc = docx::parse_bytes(input)?;
40 let t_parse = t0.elapsed();
41
42 let bytes = pdf::render(&doc)?;
43 let t_render = t0.elapsed();
44
45 std::fs::write(output, &bytes).map_err(Error::Io)?;
46 let t_total = t0.elapsed();
47
48 log::info!(
49 "Timing: parse={:.1}ms, render={:.1}ms, write={:.1}ms, total={:.1}ms (output {} bytes)",
50 t_parse.as_secs_f64() * 1000.0,
51 (t_render - t_parse).as_secs_f64() * 1000.0,
52 (t_total - t_render).as_secs_f64() * 1000.0,
53 t_total.as_secs_f64() * 1000.0,
54 bytes.len(),
55 );
56
57 Ok(())
58}