Nodes/Soda Storyboard/排字 · Letter Page
ComfyUI Node

排字 · Letter Page

Type the Chinese Dialogue Into the Page After You Generate It

By cOkieeman·Created 3 days ago·Updated a day ago· 5
排字 · Letter Page
  • image
  • IMAGE
◄page_info►
◄font►

Asking an image model to draw legible Chinese text is still a losing bet. It'll give you something that looks like writing from across the room and is nonsense up close, and if you need three lines of dialogue in a five-panel page you'll be fixing glyphs until midnight. SodaLetterPage is the alternative the pack is built around: let the model draw the art with empty bubbles, then draw the dialogue programmatically from the storyboard's text boxes, with a real font, at the right place, at the resolution you actually exported.

The pack's own showcase - the "起身舒展" full-colour page - works exactly this way. The README is blunt about it: the character is defined by prompt alone, no reference image and no LoRA, and the three Chinese lines are lettered after generation.

What it does

You feed it the finished page and the page snapshot. The core library's lettering module walks the page's text items, lays out each bubble and its text using the computed geometry, and draws. Font size and bubble tails are scaled along with everything else.

The important detail is that the geometry is remapped onto the size of the image you actually hand it. Letter after an upscale, after a second sample, after cutting quads - it reads the image dimensions and maps the storyboard's text boxes onto them. X and Y follow their own axis, and font size uses the smaller of the two ratios, so a page whose aspect shifted doesn't come out with unreadable or overflowing type. That's the same reasoning behind every finishing node in this pack, and it's why they can sit after a resize node without you redoing anything.

It draws text and bubbles. It does not redraw your panel frames - that's SodaCutQuads' job, and the split is intentional so lettering can't accidentally paint over your borders.

The two things that actually matter

page_info comes off the loader. Without it there's no geometry, no text items, nothing to draw - and the node will tell you so. This is the string that carries the whole page snapshot through the finishing chain, so it should already be wired from wherever your layout came from.

font is optional and is a plain string: a font file you want used for the lettering. Leave it empty and you get the library's default. Set it when you need CJK glyphs - the README recommends Source Han Sans (思源黑体) or Noto Sans CJK. If your page comes out as a grid of tofu boxes, this is why, and it's the single most common lettering complaint in every comic-generation project, not just this one.

There's a design consequence worth knowing: dialogue_mode on the loader decides who letters. Set it to 程序排字 and this node has work to do. Set it to MOSS 画字 and the model is told to draw the text itself, so the lettering node will produce nothing. Leave it on 跟随页面 and the page's own setting wins. If you run the node and the image passes through unchanged, check dialogue_mode before you go hunting for a bug.

Wiring

VAEDecode → SodaCutQuads → SodaLetterPage → SaveImage

page_info from the loader taps into both finishing nodes. One output, one IMAGE, so it's a straight inline pass with a side effect.

Install

Shared with the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/cOkieeman/ComfyUI-Soda-Storyboard
cd ComfyUI-Soda-Storyboard && python -m pip install --upgrade soda-storyboard

Manager: search Soda Storyboard, or comfy node install comfyui-soda-storyboard. Windows portable users install with .\python_embeded\python.exe -m pip install -r ...\requirements.txt. Fonts are not pip packages - drop the TTF/OTF somewhere stable and point font at it.

Where it bites

Text protection is the trap on the redraw path. SodaPastePanel has protect_text on by default, which keeps the original lettering pixels when you paste a redrawn panel back. That's usually what you want: fix the art, keep the bubble. But if you redrew a panel to replace its dialogue, leaving it on means the old text survives the paste and then SodaLetterPage draws new text over the old. Turn it off when the dialogue itself is changing.

Beyond that: lettering is the last step on purpose. Anything that resamples after this node - another upscale pass, a final sharpen - softens the type, and unlike model-drawn text you can't get it crisp again for free. Save the lettered page directly.

CategorySoda Storyboard

Inputs (3)

NameTypeDefaultDescription
imageIMAGE—
page_infoSTRING—
fontoptSTRING—

Outputs (1)

NameTypeDescription
IMAGEIMAGE—