Relatório em PDF (A4) com gerador próprio

guara report relatorio.pdf (e o botão de relatório da interface, pela extensão) gera
as mesmas seções do HTML em PDF com fontes padrão, sem dependência nova. O relatório,
em PDF e HTML, passa a trazer a situação da trilha de auditoria e o hash da última
entrada. Conferido com pdfinfo e pdftotext.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Sonnet 5.5 committed 2026-10-22 16:09:46 -03:00
1 parent 26e5ebb592
commit 58940965bb
15 files changed
+1082 -17

No files matched your search

+21 -3
View File
@@ -675,7 +675,16 @@ impl Engine {
let elapsed = s
.finished_in
.unwrap_or_else(|| s.started.elapsed().as_secs_f64());
let html = crate::report::html(&crate::report::ReportInput {
let audit = crate::audit::Log::open_default()
.verify()
.ok()
.filter(|v| v.entries > 0)
.map(|v| crate::report::AuditNote {
entries: v.entries,
ok: v.ok,
head: v.head,
});
let input = crate::report::ReportInput {
case: &case,
target: &j.target,
options: &j.opts,
@@ -686,8 +695,17 @@ impl Engine {
elapsed,
recoveries: &s.recoveries,
source_hashes: hashes.as_ref(),
});
crate::owner::write_owned(Path::new(path), html)?;
audit,
};
let as_pdf = Path::new(path)
.extension()
.is_some_and(|e| e.eq_ignore_ascii_case("pdf"));
let bytes = if as_pdf {
crate::report::pdf(&input)
} else {
crate::report::html(&input).into_bytes()
};
crate::owner::write_owned(Path::new(path), bytes)?;
crate::audit::record(
"export.report",
json!({ "job": id, "source": j.target, "path": path, "case": case.case_id, "examiner": case.examiner }),