fn format_pdf()

in resctl-bench/src/bench/iocost_tune.rs [1851:1924]


    fn format_pdf(
        &self,
        path: &str,
        keep: bool,
        data: &JobData,
        res: &IoCostTuneResult,
        grapher: &mut graph::Grapher,
    ) -> Result<()> {
        let dir = tempfile::TempDir::new().context("Creating temp dir for rendering graphs")?;
        let dir_path = if keep { Path::new("./") } else { dir.path() };

        // Generate the cover page.
        let mut cover_txt = PathBuf::from(&dir_path);
        cover_txt.push("iocost-tune-cover.txt");
        let mut cover_pdf = PathBuf::from(&dir_path);
        cover_pdf.push("iocost-tune-cover.pdf");
        let mut gs_err = PathBuf::from(&dir_path);
        gs_err.push("iocost-tune-gs.err");

        let mut buf = String::new();
        let mut out = Box::new(&mut buf) as Box<dyn Write>;
        data.format_header(&mut out);
        self.format_solutions(&mut out, res);
        self.format_remarks(&mut out, res);
        drop(out);

        let mut cover_file = std::fs::File::create(&cover_txt)?;
        cover_file.write_all(buf.as_bytes())?;
        let mut text_arg = std::ffi::OsString::from("text:");
        text_arg.push(&cover_txt);

        run_command(
            Command::new("convert")
                .args(&[
                    "-font",
                    "Source-Code-Pro",
                    "-pointsize",
                    "7",
                    "-density",
                    "300",
                ])
                .arg(&text_arg)
                .arg(&cover_pdf),
            "Are imagemagick and adobe-source-code-pro font available? \
             Also, see https://github.com/facebookexperimental/resctl-demo/issues/256",
        )?;

        // Draw the graphs.
        let graphs_pdf = grapher.plot_pdf(&dir_path)?;

        // Concatenate them.
        let mut output_arg = std::ffi::OsString::from("-sOUTPUTFILE=");
        output_arg.push(path);
        run_command(
            Command::new("gs")
                .arg(&output_arg)
                .args(&[
                    "-sstdout=%stderr",
                    "-dNOPAUSE",
                    "-sDEVICE=pdfwrite",
                    "-sPAPERSIZE=letter",
                    "-dFIXEDMEDIA",
                    "-dPDFFitPage",
                    "-dCompatibilityLevel=1.4",
                    "-dBATCH",
                ])
                .arg(&cover_pdf)
                .arg(&graphs_pdf)
                .stderr(std::fs::File::create(&gs_err)?),
            "is ghostscript available?",
        )?;

        Ok(())
    }