use papermake::{render_pdf, Schema, Template};
use pdf::object::MaybeRef;
use serde_json::json;
#[test]
fn test_render_pdf() {
let template = Template::new(
"test",
"Test Template",
"#let data = json.decode(sys.inputs.data)\n#set text(font: \"Arial\")\nHello #data.name!",
Schema::new()
);
let data = json!({
"name": "World"
});
let result = render_pdf(&template, &data, None);
assert!(result.is_ok());
let pdf_bytes = result.unwrap();
assert!(pdf_bytes.pdf.is_some());
let temp_dir = std::env::temp_dir();
let pdf_path = temp_dir.join("test_system_font.pdf");
std::fs::write(&pdf_path, pdf_bytes.pdf.as_ref().unwrap()).unwrap();
println!("PDF written to: {}", pdf_path.display());
let header = &pdf_bytes.pdf.as_ref().unwrap()[0..8];
assert!(
header == b"%PDF-1.7" || header == b"%PDF-1.6" || header == b"%PDF-1.5",
"PDF should start with a valid header"
);
let file = pdf::file::FileOptions::cached().open(&pdf_path).unwrap();
let mut found_arial = false;
if let Ok(page) = file.get_page(0) {
if let Ok(resources) = page.resources() {
for (_, font_ref) in resources.fonts.iter() {
match font_ref {
MaybeRef::Direct(font) => {
if let Some(name) = &font.name {
if name.to_string().to_lowercase().contains("arial") {
found_arial = true;
break;
}
}
}
MaybeRef::Indirect(r) => {
let font = r.data();
if let Some(name) = &font.name {
if name.to_string().to_lowercase().contains("arial") {
found_arial = true;
break;
}
}
}
}
}
}
}
assert!(found_arial, "PDF should contain Arial font");
}