PDF · C# walkthrough
A three-column service catalog
Present three offerings side by side without turning the whole page into a table. Each column contains its own heading, list, and guidance panel.
- Start with
- Three service offerings and their intended use
- Generate

How it works
Establish a page hierarchy
Place the main heading and short introduction above the comparison area.
Use relative columns
Create three equal relative columns and set a gutter so each offering has a distinct reading area.
Keep the next decision visible
Finish with the questions a reader should resolve before choosing an offering.
The C# source
This is the complete example file used to generate the download. The walkthrough runner creates the output directory and produces the additional previews.
using System.IO;
using OfficeIMO.Pdf;
namespace OfficeIMO.Examples.Showcase.Workflows;
/// <summary>Uses relative columns to present three service offerings in a single PDF.</summary>
internal static class ServiceCatalog {
internal static void Create(string folder) {
PdfColor navy = PdfColor.FromRgb(23, 54, 93);
PdfDocument.Create(pdf => pdf.Content(content => {
content.H1("Choose the support you need", PdfAlign.Left, navy);
content.Paragraph(p => p.Text("NORTHWIND / SERVICE CATALOG"));
content.Paragraph(p => p.Text("Three example offerings, with scope and handover expectations visible before work starts."));
content.HR(1, navy, 12, 20);
content.Row(row => {
row.Gap(18);
row.RelativeColumn(column => column
.H2("Essentials", PdfAlign.Left, navy)
.Paragraph(p => p.Bold("Keep the service running."))
.Bullets(new[] { "Named support contact", "Monthly health summary", "Documented escalation path" })
.PanelParagraph(p => p.Text("Best for a stable service with a small support queue."),
new PdfPanelStyle { Background = PdfColor.FromRgb(232, 241, 251), PaddingX = 10, PaddingY = 10 }));
row.RelativeColumn(column => column
.H2("Improvement", PdfAlign.Left, navy)
.Paragraph(p => p.Bold("Reduce repeated problems."))
.Bullets(new[] { "Everything in Essentials", "Quarterly backlog review", "One improvement workshop" })
.PanelParagraph(p => p.Text("Best for a service with recurring issues and a clear owner."),
new PdfPanelStyle { Background = PdfColor.FromRgb(232, 246, 237), PaddingX = 10, PaddingY = 10 }));
row.RelativeColumn(column => column
.H2("Transition", PdfAlign.Left, navy)
.Paragraph(p => p.Bold("Prepare a confident handover."))
.Bullets(new[] { "Readiness assessment", "Recovery walkthrough", "Receiving-team training" })
.PanelParagraph(p => p.Text("Best for a new service moving into regular operations."),
new PdfPanelStyle { Background = PdfColor.FromRgb(250, 241, 225), PaddingX = 10, PaddingY = 10 }));
});
content.H2("Before choosing", PdfAlign.Left, navy);
content.Paragraph(p => p.Text("Confirm the service owner, support hours, and expected response process. These are sample offerings rather than a commercial contract."));
}), new PdfOptions { DefaultFontSize = 10 })
.Meta(title: "Northwind service catalog", author: "OfficeIMO")
.Save(Path.Combine(folder, "example.pdf"));
}
}
Open the C# source fileRun it from the source checkout
Clone the OfficeIMO repository and run this command from its root with the .NET 10 SDK. The first run restores the example project's dependencies.
dotnet run --project OfficeIMO.Examples -f net10.0 -- --showcase-workflows --showcase-example pdf-service-catalogThe files are written to OfficeIMO.Examples/bin/Debug/net10.0/Documents/Workflows/pdf-service-catalog/. To use the example in your application, start with the PDF guide and its package setup.
Downloads and scope
What the preview shows
The linked C# example generates this file. The page images are rendered from the downloadable PDF with Poppler.
What to keep in mind
The offerings are fictional sample content. The layout demonstrates fixed PDF output rather than a responsive web pricing component.