# davidmahk-afk/pdf-extractor architecture

> Architecture diagram of the GitHub repository davidmahk-afk/pdf-extractor, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/davidmahk-afk/pdf-extractor
- Repository: https://github.com/davidmahk-afk/pdf-extractor

## Overview

PDF Page Extractor is a browser-only application: users choose a local PDF, optionally unlock it, select pages or presets, and download a locally generated PDF, optionally AES-256 protected. The README also documents static GitHub Pages delivery; it describes no backend or upload service. The core app and page-range parser are excerpted; HTML layout and deployment wiring are not, so relationships involving those are omitted.

Main entry points: [`app.js`](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js) (Application workflow), [`page-ranges.js`](https://github.com/davidmahk-afk/pdf-extractor/blob/main/page-ranges.js) (Range parser)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_input["PDF input"]
  node_app["Application workflow<br/>[app.js]"]
  node_source["Local PDF file"]
  node_unlock["Password unlock<br/>[app.js]"]
end

subgraph group_selection["Page selection"]
  node_ranges["Range parser<br/>[page-ranges.js]"]
  node_presets["Page presets<br/>[page-ranges.js]"]
end

subgraph group_output["PDF output"]
  node_extract["Page grafting<br/>[app.js]"]
  node_download["PDF download<br/>[app.js]"]
end

subgraph group_engine["Local PDF engine"]
  node_mupdf["MuPDF engine<br/>[app.js]"]
end

node_user(("User"))
node_browser["Browser runtime"]
node_pages["GitHub Pages"]

node_user -->|"selects PDF"| node_app
node_app -->|"reads locally"| node_source
node_app -->|"opens document"| node_mupdf
node_app -->|"requests password"| node_unlock
node_unlock -->|"authenticates"| node_mupdf
node_user -->|"enters pages"| node_ranges
node_app -->|"parses selection"| node_ranges
node_app -->|"chooses preset"| node_presets
node_app -->|"starts extraction"| node_extract
node_extract -->|"uses page indices"| node_ranges
node_extract -->|"grafts and saves"| node_mupdf
node_extract -->|"creates download"| node_download
node_download -->|"downloads PDF"| node_user
node_browser -.->|"serves static app"| node_pages

click node_app "https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js"
click node_unlock "https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js"
click node_ranges "https://github.com/davidmahk-afk/pdf-extractor/blob/main/page-ranges.js"
click node_presets "https://github.com/davidmahk-afk/pdf-extractor/blob/main/page-ranges.js"
click node_extract "https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js"
click node_download "https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js"
click node_mupdf "https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js"

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_app,node_source,node_unlock,node_user,node_browser toneBlue
class node_ranges,node_presets toneAmber
class node_extract,node_download toneMint
class node_mupdf toneRose
class node_pages toneIndigo
```

## Components

### PDF input

- [Application workflow](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js): `app.js`
- **Local PDF file**
- [Password unlock](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js): `app.js`

### Page selection

- [Range parser](https://github.com/davidmahk-afk/pdf-extractor/blob/main/page-ranges.js): `page-ranges.js`
- [Page presets](https://github.com/davidmahk-afk/pdf-extractor/blob/main/page-ranges.js): `page-ranges.js`

### PDF output

- [Page grafting](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js): `app.js`
- [PDF download](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js): `app.js`

### Local PDF engine

- [MuPDF engine](https://github.com/davidmahk-afk/pdf-extractor/blob/main/app.js): `app.js`

### Other components

- **User**
- **Browser runtime**
- **GitHub Pages**

## Connections

- User → Application workflow: selects PDF (evidence: `app.js`)
- Application workflow → Local PDF file: reads locally (evidence: `app.js`)
- Application workflow → MuPDF engine: opens document (evidence: `app.js`)
- Application workflow → Password unlock: requests password (evidence: `app.js`)
- Password unlock → MuPDF engine: authenticates (evidence: `app.js`)
- User → Range parser: enters pages
- Application workflow → Range parser: parses selection (evidence: `app.js`)
- Application workflow → Page presets: chooses preset (evidence: `app.js`)
- Application workflow → Page grafting: starts extraction (evidence: `app.js`)
- Page grafting → Range parser: uses page indices (evidence: `app.js`)
- Page grafting → MuPDF engine: grafts and saves (evidence: `app.js`)
- Page grafting → PDF download: creates download (evidence: `app.js`)
- PDF download → User: downloads PDF (evidence: `app.js`)
- Browser runtime → GitHub Pages: serves static app (evidence: `README.md`)
