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(())
}