use pdfcrate::api::GridOptions;
use pdfcrate::prelude::{Document, LayoutDocument, Margin};
use pdfcrate::Result as PdfResult;
fn main() -> Result<(), Box<dyn std::error::Error>> {
Document::generate("grid_demo.pdf", |doc| {
doc.title("Grid Demo").author("pdfcrate");
add_page(doc)?;
Ok(())
})?;
println!("Created: grid_demo.pdf");
Ok(())
}
pub fn add_page(doc: &mut Document) -> PdfResult<()> {
let mut layout =
LayoutDocument::with_margin(std::mem::take(doc), Margin::new(36.0, 36.0, 36.0, 36.0));
layout.define_grid(GridOptions::new(6, 4).gutter(10.0));
layout.grid_span_bounding_box((0, 0), (0, 3), |doc| {
doc.stroke_bounds();
doc.font("Helvetica-Bold").size(24.0);
doc.text("Grid System");
doc.move_down(5.0);
doc.font("Helvetica").size(11.0);
doc.text("Grid layout for precise positioning");
});
layout.grid_span_bounding_box((1, 0), (2, 0), |doc| {
doc.stroke_bounds();
doc.font("Helvetica-Bold").size(10.0);
doc.text("Vertical");
doc.font("Helvetica").size(9.0);
doc.text("(1,0)-(2,0)");
});
layout.grid_span_bounding_box((1, 1), (2, 3), |doc| {
doc.stroke_bounds();
doc.font("Helvetica-Bold").size(12.0);
doc.text("Large Span (1,1)-(2,3)");
doc.move_down(5.0);
doc.font("Helvetica").size(10.0);
doc.text("This span covers 2 rows and 3 columns.");
doc.text("Perfect for content areas, sidebars, or");
doc.text("any layout requiring multiple cells.");
});
layout.grid_bounding_box(3, 0, |doc| {
doc.stroke_bounds();
doc.font("Helvetica").size(9.0);
doc.text("Nav");
});
layout.grid_span_bounding_box((3, 1), (4, 3), |doc| {
doc.stroke_bounds();
doc.font("Helvetica-Bold").size(11.0);
doc.text("Main Content Area");
doc.move_down(5.0);
doc.font("Helvetica").size(10.0);
doc.text("Grids make it easy to create responsive layouts.");
doc.text("Define rows, columns, and gutters, then place");
doc.text("content in cells or spans as needed.");
});
layout.grid_bounding_box(4, 0, |doc| {
doc.stroke_bounds();
doc.font("Helvetica").size(9.0);
doc.text("Side");
});
for col in 0..4 {
layout.grid_bounding_box(5, col, |doc| {
doc.stroke_bounds();
doc.font("Helvetica").size(9.0);
doc.text(&format!("Footer {}", col + 1));
});
}
*doc = layout.into_inner();
Ok(())
}