# chrisjenx/compose2pdf architecture

> Architecture diagram of the GitHub repository chrisjenx/compose2pdf, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/chrisjenx/compose2pdf
- Repository: https://github.com/chrisjenx/compose2pdf

## Overview

Compose 2 PDF is a Kotlin/JVM library that turns Compose Desktop content into PDF bytes or writes it to a caller-provided stream. The main workflow enters through renderToPdf, which delegates rendering and pagination before producing either SVG-backed vector pages or raster pages. The README documents vector/raster modes, page presets, automatic and manual pagination, headers/footers, font embedding, and link annotations. The graph includes these capabilities and the SVG conversion helpers; unsampled implementation details are represented only where README or index references support the relationship.

Main entry points: [`compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt) (Render Orchestrator), [`compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt) (SVG to PDF), [`compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt) (PDF Entry Point), [`compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt`](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt) (Paginated Column API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["Public API"]
  node_render_api["PDF Entry Point<br/>[Compose2Pdf.kt]"]
  node_page_config["Page Configuration<br/>[PdfPageConfig.kt]"]
  node_page_margins["Page Margins<br/>[PdfMargins.kt]"]
  node_render_options["Render Options<br/>[RenderMode.kt]"]
  node_pagination_options["Pagination Options<br/>[PdfPagination.kt]"]
  node_page_info["Page Metadata<br/>[PdfPageInfo.kt]"]
  node_public_pagination["Paginated Column API<br/>[PaginatedColumn.kt]"]
  node_local_config["Local Page Config"]
end

subgraph group_layout["Page Layout"]
  node_page_layout["Page Layout Engine<br/>[PageLayout.kt]"]
  node_auto_layout["Automatic Pagination<br/>[PaginatedColumn.kt]"]
end

subgraph group_render["Rendering"]
  node_pdf_renderer["Render Orchestrator<br/>[PdfRenderer.kt]"]
  node_scene_renderer["Compose Scene"]
  node_svg_capture["SVG Capture<br/>[ComposeToSvg.kt]"]
end

subgraph group_convert["PDF Conversion"]
  node_pdf_converter["SVG to PDF"]
  node_coordinate_transform["Coordinate Mapping"]
  node_path_parser["SVG Path Parser<br/>[SvgPathParser.kt]"]
  node_svg_color["SVG Color Parser<br/>[SvgColor.kt]"]
  node_shape_renderer["SVG Shape Renderer"]
  node_font_resolver["Font Resolution<br/>[FontResolver.kt]"]
  node_typeface_embedder["Typeface Embedding"]
  node_text_normalizer["Text Normalization<br/>[TextNormalizer.kt]"]
end

node_caller(("Library Caller"))
node_pdf_output["PDF Document"]
node_stream["Output Stream"]

node_caller -->|"calls"| node_render_api
node_render_api -->|"delegates"| node_pdf_renderer
node_render_api -->|"configures"| node_page_config
node_render_api -->|"selects mode"| node_render_options
node_render_api -->|"selects pagination"| node_pagination_options
node_page_config -->|"uses"| node_page_margins
node_public_pagination -->|"uses"| node_auto_layout
node_public_pagination -->|"reads"| node_local_config
node_pdf_renderer -.->|"renders Compose"| node_scene_renderer
node_pdf_renderer -->|"captures SVG"| node_svg_capture
node_pdf_renderer -->|"builds layout"| node_page_layout
node_pdf_renderer -.->|"paginates content"| node_auto_layout
node_pdf_renderer -->|"converts vector pages"| node_pdf_converter
node_pdf_renderer -->|"creates raster pages"| node_pdf_output
node_pdf_renderer -->|"provides page data"| node_page_info
node_pdf_renderer -->|"provides effective config"| node_local_config
node_pdf_converter -->|"uses layout"| node_page_layout
node_pdf_converter -->|"maps coordinates"| node_coordinate_transform
node_pdf_converter -->|"parses paths"| node_path_parser
node_pdf_converter -->|"parses colors"| node_svg_color
node_pdf_converter -->|"draws shapes"| node_shape_renderer
node_pdf_converter -->|"resolves fonts"| node_font_resolver
node_pdf_converter -->|"normalizes text"| node_text_normalizer
node_font_resolver -->|"embeds typefaces"| node_typeface_embedder
node_pdf_converter -->|"writes PDF pages"| node_pdf_output
node_render_api -->|"writes PDF"| node_stream
node_pdf_renderer -->|"returns document"| node_pdf_output

click node_render_api "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt"
click node_page_config "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageConfig.kt"
click node_page_margins "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfMargins.kt"
click node_render_options "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/RenderMode.kt"
click node_pagination_options "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPagination.kt"
click node_page_info "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageInfo.kt"
click node_public_pagination "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt"
click node_local_config "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/LocalPdfPageConfig.kt"
click node_pdf_renderer "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt"
click node_scene_renderer "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeSceneRenderer.kt"
click node_svg_capture "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeToSvg.kt"
click node_page_layout "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PageLayout.kt"
click node_auto_layout "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PaginatedColumn.kt"
click node_pdf_converter "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt"
click node_coordinate_transform "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/CoordinateTransform.kt"
click node_path_parser "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgPathParser.kt"
click node_svg_color "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgColor.kt"
click node_shape_renderer "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgShapeRenderer.kt"
click node_font_resolver "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/FontResolver.kt"
click node_typeface_embedder "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SkiaTypefaceEmbedder.kt"
click node_text_normalizer "https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/TextNormalizer.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_render_api,node_page_config,node_page_margins,node_render_options,node_pagination_options,node_page_info,node_public_pagination,node_local_config toneBlue
class node_page_layout,node_auto_layout toneAmber
class node_pdf_renderer,node_scene_renderer,node_svg_capture toneMint
class node_pdf_converter,node_coordinate_transform,node_path_parser,node_svg_color,node_shape_renderer,node_font_resolver,node_typeface_embedder,node_text_normalizer toneRose
class node_caller,node_pdf_output,node_stream toneIndigo
```

## Components

### Public API

- [PDF Entry Point](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`
- [Page Configuration](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageConfig.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageConfig.kt`
- [Page Margins](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfMargins.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfMargins.kt`
- [Render Options](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/RenderMode.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/RenderMode.kt`
- [Pagination Options](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPagination.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPagination.kt`
- [Page Metadata](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageInfo.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageInfo.kt`
- [Paginated Column API](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt`
- [Local Page Config](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/LocalPdfPageConfig.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/LocalPdfPageConfig.kt`

### Page Layout

- [Page Layout Engine](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PageLayout.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PageLayout.kt`
- [Automatic Pagination](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PaginatedColumn.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PaginatedColumn.kt`

### Rendering

- [Render Orchestrator](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`
- [Compose Scene](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeSceneRenderer.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeSceneRenderer.kt`
- [SVG Capture](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeToSvg.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/ComposeToSvg.kt`

### PDF Conversion

- [SVG to PDF](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`
- [Coordinate Mapping](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/CoordinateTransform.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/CoordinateTransform.kt`
- [SVG Path Parser](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgPathParser.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgPathParser.kt`
- [SVG Color Parser](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgColor.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgColor.kt`
- [SVG Shape Renderer](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgShapeRenderer.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgShapeRenderer.kt`
- [Font Resolution](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/FontResolver.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/FontResolver.kt`
- [Typeface Embedding](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SkiaTypefaceEmbedder.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SkiaTypefaceEmbedder.kt`
- [Text Normalization](https://github.com/chrisjenx/compose2pdf/blob/main/compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/TextNormalizer.kt): `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/TextNormalizer.kt`

### Other components

- **Library Caller**
- **PDF Document**
- **Output Stream**

## Connections

- Library Caller → PDF Entry Point: calls (evidence: `README.md`)
- PDF Entry Point → Render Orchestrator: delegates (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`)
- PDF Entry Point → Page Configuration: configures (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`)
- PDF Entry Point → Render Options: selects mode (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`)
- PDF Entry Point → Pagination Options: selects pagination (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`)
- Page Configuration → Page Margins: uses (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PdfPageConfig.kt`)
- Paginated Column API → Automatic Pagination: uses (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt`)
- Paginated Column API → Local Page Config: reads (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/PaginatedColumn.kt`)
- Render Orchestrator → Compose Scene: renders Compose
- Render Orchestrator → SVG Capture: captures SVG (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- Render Orchestrator → Page Layout Engine: builds layout (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- Render Orchestrator → Automatic Pagination: paginates content
- Render Orchestrator → SVG to PDF: converts vector pages (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- Render Orchestrator → PDF Document: creates raster pages (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- Render Orchestrator → Page Metadata: provides page data (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- Render Orchestrator → Local Page Config: provides effective config (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- SVG to PDF → Page Layout Engine: uses layout (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- SVG to PDF → Coordinate Mapping: maps coordinates (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/PdfRenderer.kt`)
- SVG to PDF → SVG Path Parser: parses paths (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- SVG to PDF → SVG Color Parser: parses colors (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- SVG to PDF → SVG Shape Renderer: draws shapes (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- SVG to PDF → Font Resolution: resolves fonts (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- SVG to PDF → Text Normalization: normalizes text (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- Font Resolution → Typeface Embedding: embeds typefaces (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/FontResolver.kt`)
- SVG to PDF → PDF Document: writes PDF pages (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/internal/SvgToPdfConverter.kt`)
- PDF Entry Point → Output Stream: writes PDF (evidence: `compose2pdf/src/main/kotlin/com/chrisjenx/compose2pdf/Compose2Pdf.kt`)
- Render Orchestrator → PDF Document: returns document
