- row1
- row2
- row3
- row4
- row5
- page_image
Comic Page (class PageNode) is the payoff node of Pixstri ComfyUI Comics (lisaks/comfyui-panelforge). Everything upstream exists to feed this thing: it stacks up to five Comic Row strips vertically onto a paper-colored canvas, adds a title, margins, and per-row horizontal alignment, and hands you a finished page. It's the only node in the pack whose output is a document rather than a building block - the endpoint of a workflow that starts with your checkpoints and Comic Frame panels and ends with something you could export as a page.
How it works
Give it row1–row5 (each a ROW_DATA dict from RowNode) and it computes the page height as the sum of the row heights plus vertical spacing gaps plus two page_margins. Width is where it's smarter than you'd expect: if the widest row plus margins exceeds your page_width, the page quietly grows to fit instead of clipping. Background is white, off-white (that warm #FCFCF5 newsprint tone), or light-gray. An optional title gets stamped at the top - centered with a crude len(title)*4 pixel estimate, which is fine for ASCII and forget about anything fancy. Each row is then pasted left, center, or right inside the margins.
The inputs that matter
- row1–row5 (optional) -
ROW_DATAfrom Comic Row nodes, in reading order. - spacing (0–100, default 15) - vertical gap between rows.
- alignment -
left,center,right. Center is the safe choice unless you're deliberately mixing row widths. - page_width (500–3000, default 1000) - target width; the page auto-widens if content overflows.
- page_margin (0–100, default 30) - the border of blank page around the art.
- page_color -
white,off-white, orlight-gray. - title (optional) - one-line page title.
The output, and the catch
You get exactly one output, page_image (IMAGE). Wire it to a preview or a save node and you're done. But here's the thing that will bite you the first time: like FrameNode, PageNode emits uint8 tensors, not ComfyUI's standard float-0-to-1 images. In the graph the preview looks perfect; run that same tensor into Save Image and ComfyUI's multiply-by-255 can push the whole page to white. If your saved page comes out blank while the preview looked fine, that's this, not your workflow. Route the page through a normalize step before saving - or pull the intermediate row previews, which are properly float, if you're saving strips.
Installing it
No models, no API keys, nothing heavy. Via ComfyUI Manager search "Pixstri" and install, or:
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/lisaks/comfyui-panelforge
# restart ComfyUI
Ignore the README's clone command - it's a boilerplate placeholder (yourusername/pixstri.git); the real repo is the URL above. The shipped requirements.txt only lists torch and numpy, though the code needs Pillow, which ComfyUI already brings along. It's a tiny pack that runs entirely on your machine.
Common issues
- Saved page is white/blank - the uint8 quirk above. Normalize before the save node.
- Title looks off-center - the centering math is approximate. It's a placeholder feature; don't fight it.
- Longer than five rows? Build a second page node and stitch the pages yourself.
- Page came out narrower/wider than you set - that's the auto-grow behavior when content exceeds
page_width. Lower it only if you want the page to force-fit (it won't shrink, it grows).
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| spacing | INT | 150–100 | — |
| alignment | COMBO | 3 options: left, center, right | |
| page_color | COMBO | 3 options: white, off-white, light-gray | |
| page_width | INT | 1000500–3000 | — |
| page_margin | INT | 300–100 | — |
| row1opt | ROW_DATA | — | |
| row2opt | ROW_DATA | — | |
| row3opt | ROW_DATA | — | |
| row4opt | ROW_DATA | — | |
| row5opt | ROW_DATA | — | |
| titleopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| page_image | IMAGE | — |