//! Pagination Demo - Demonstrates automatic page numbering and footers //! //! Shows how to add page numbers and footers to multi-page documents. const std = @import("std"); const pdf = @import("zcatpdf"); pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const allocator = gpa.allocator(); std.debug.print("zcatpdf - Pagination Demo\n", .{}); var doc = pdf.Pdf.init(allocator, .{}); defer doc.deinit(); doc.setTitle("Pagination Demo"); doc.setAuthor("zcatpdf"); // Create multiple pages with content const num_pages: usize = 5; for (0..num_pages) |i| { var page = try doc.addPage(.{}); page.setMargins(50, 50, 50); // Page title try page.setFont(.helvetica_bold, 24); page.setFillColor(pdf.Color.rgb(41, 98, 255)); page.setXY(50, 780); var title_buf: [64]u8 = undefined; const title = std.fmt.bufPrint(&title_buf, "Chapter {d}", .{i + 1}) catch "Chapter"; try page.cell(0, 30, title, pdf.Border.none, .center, false); page.ln(50); // Content try page.setFont(.helvetica, 12); page.setFillColor(pdf.Color.black); const lorem = \\Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor \\incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. \\Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore \\eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt \\in culpa qui officia deserunt mollit anim id est laborum. ; // Multiple paragraphs to fill the page for (0..4) |_| { try page.multiCell(500, null, lorem, pdf.Border.none, .left, false); page.ln(15); } // Section heading try page.setFont(.helvetica_bold, 14); page.setFillColor(pdf.Color.rgb(51, 51, 51)); try page.cell(0, 20, "Key Points", pdf.Border.none, .left, false); page.ln(25); // Bullet points try page.setFont(.helvetica, 11); page.setFillColor(pdf.Color.black); const points = [_][]const u8{ "First important point about this chapter", "Second key consideration to remember", "Third aspect worth noting", "Fourth element of significance", }; for (points) |point| { var point_buf: [256]u8 = undefined; const bullet_text = std.fmt.bufPrint(&point_buf, " * {s}", .{point}) catch point; try page.cell(0, 16, bullet_text, pdf.Border.none, .left, false); page.ln(18); } } // Add header to all pages (with line separator) try pdf.addHeader(&doc, "zcatpdf Library - Multi-Page Document Example", .{ .alignment = .center, .margin = 30, .font_size = 9, .color = pdf.Color.medium_gray, .draw_line = true, .line_color = pdf.Color.light_gray, }); // Add page numbers to all pages try pdf.Pagination.addPageNumbers(&doc, .{ .format = "Page {PAGE} of {PAGES}", .position = .bottom_center, .font = .helvetica, .font_size = 9, .color = pdf.Color.medium_gray, }); // Add footer text to all pages (with line separator) try pdf.addFooterWithLine(&doc, "Confidential Document - For Internal Use Only", .{ .alignment = .left, .margin = 30, .font_size = 8, .color = pdf.Color.light_gray, .draw_line = true, }); // Save const filename = "pagination_demo.pdf"; try doc.save(filename); std.debug.print("Created: {s} ({d} pages)\n", .{ filename, num_pages }); std.debug.print("Done!\n", .{}); }