---
title: Text-heavy design assets — P-Image-Ideogram | Runware Docs
url: https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design
description: How to design posters, packaging, ads, and menus with P-Image-Ideogram, and the workflow that gets on-image copy to render clean and exact.
---
Text is where most image models fall down and where P-Image-Ideogram earns its place. Built with Ideogram, it renders **exact on-image copy** in a finished layout, which makes it a fit for the design work that usually needs a designer: posters, packaging, ads, menus, and social graphics.

![A teal jazz club gig poster reading BLUE ROOM SESSIONS, Live every Thursday, with a double bass illustration and DOORS 8PM 45 CANAL ST](https://runware.ai/docs/assets/output-hero.DdRHcb4w_1BMnRk.jpg)

> **Prompt**: Structured JSON prompt: a deep-teal jazz gig poster with a cream BLUE ROOM SESSIONS title, a gold Live every Thursday subhead, a double-bass illustration, and a DOORS 8PM / 45 CANAL ST footer.

That poster is one request. This guide covers the deliverables the model is strongest at, and the workflow that gets the copy right every time.

### [Build it as a structured prompt](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#build-it-as-a-structured-prompt)

Design work is where the [structured JSON prompt](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/prompting) pays off. Give each line of copy its own `text` element, set the palette in hex, and place the blocks so the layout is fixed and only the words change. **Everything in this guide is a structured prompt**, and it is the mode to reach for over natural language whenever the frame carries more than a headline.

### [Getting text to land](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#getting-text-to-land)

On-image text is **seed-sensitive**. The same prompt renders clean on one seed and drops a character on the next, so the reliable move is not to perfect one prompt but to **generate a few candidates and keep the clean one**. The three exhibition posters below are the same prompt at three seeds:

![An off-white exhibition poster reading FORM & VOID, Sculpture 1960-1990, with a sculpture line drawing and a dates and venue line, all text correct](https://runware.ai/docs/assets/output-candidate-a.J93x9F3A_1GA9X1.jpg)

*seed 1001: clean, the keeper*

> **Prompt**: Structured JSON prompt: a FORM & VOID sculpture exhibition poster, off-white with black and red type, a minimal sculpture illustration, and a dates and venue footer.

![The same exhibition poster with the venue line misspelled as RIVVRSSIDE MUSEUM](https://runware.ai/docs/assets/output-candidate-b.Hm554K14_2nEv5G.jpg)

*seed 2002: the venue line garbles*

> **Prompt**: Structured JSON prompt: a FORM & VOID sculpture exhibition poster, off-white with black and red type, a minimal sculpture illustration, and a dates and venue footer.

![The same exhibition poster with a line of stray invented characters above the footer](https://runware.ai/docs/assets/output-candidate-c.sdz_sxr4_28WE84.jpg)

*seed 3003: stray text creeps in*

> **Prompt**: Structured JSON prompt: a FORM & VOID sculpture exhibition poster, off-white with black and red type, a minimal sculpture illustration, and a dates and venue footer.

The layout, palette, and illustration hold across all three, and the fine text is what varies. Seed 1001 spells everything right, seed 2002 garbles the venue into "RIVVRSSIDE MUSEUM", and seed 3003 drops a line of stray characters above the footer. Pick the render whose copy is clean, then **reuse its seed** to lock it while you finish the surrounding work. A fixed seed with `enhancePrompt` off reproduces the image exactly, so the keeper stays the keeper.

Five habits keep the hit rate high:

- **Quote every string exactly**, inside a `text` element. Anything you describe instead of quote is reinterpreted.
- **Keep each line short.** A headline and a few words render far more reliably than a paragraph, so break long copy into separate elements.
- **One element per line of type.** Bundling three lines into one `text` field invites the model to merge or drop them.
- **Turn off `enhancePrompt`.** The rewrite is not seeded, so it breaks the reproduce-a-good-seed workflow.
- **Tell it "no other text".** Left with empty space, the model fills it with invented, often garbled copy, so name the strings you want and end the prompt with an instruction to add nothing else.

> [!NOTE]
> Higher output resolution does not fix text. Small print can render as cleanly at 1K as at 2K, and sometimes cleaner, so iterate at 1K and only move up for the extra detail on a render whose copy is already right.

### [Use cases](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#use-cases)

Each format below is **one structured prompt**, built the same way, so the approach carries from a packshot to a menu with only the copy and the layout changing.

#### [Packaging and labels](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#packaging-and-labels)

Product labels are dense with small, exact copy: a name, a variant, a volume, a percentage. Give each its own element and the model holds them in place.

![A navy craft beer can label reading HARBOUR HOPS, WEST COAST IPA, with a hop illustration and 6.2% ABV 440 ml](https://runware.ai/docs/assets/output-packaging.DwkGk-vJ_iFIgX.jpg)

> **Prompt**: Structured JSON prompt: a matte navy craft beer label with a cream HARBOUR HOPS name, a copper WEST COAST IPA line, a hop-cone illustration, and a 6.2% ABV / 440 ml line.

Name, style, and the stats line all sit where their elements put them. **Scope brand colours with a per-element `color_palette`** so a copper accent holds on one line without tinting the rest of the label.

#### [Social and promo graphics](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#social-and-promo-graphics)

Sale and announcement graphics are headline-led and ship in square formats. They are the fastest deliverable: a bold line, a supporting line, a simple illustration.

![A sage square social graphic reading SPRING SALE, 30% OFF ALL PLANTS, with a monstera illustration and THIS WEEKEND ONLY](https://runware.ai/docs/assets/output-social.Dpot9X4F_Z28H2Vm.jpg)

> **Prompt**: Structured JSON prompt: a pale-sage square sale graphic with a green SPRING SALE headline, a terracotta 30% OFF ALL PLANTS line, a monstera illustration, and a THIS WEEKEND ONLY footer.

Square canvases suit a centred stack of type over a single object. Keep the promo copy to **two short lines**, which is where the model is most dependable, and let the illustration carry the rest of the frame.

#### [Editorial and advertising](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#editorial-and-advertising)

For an ad, the model composes a photographic scene and lays type into it in one pass. Describe the shot in the `background`, then place the headline over the negative space you left for it.

![A fashion ad of a model in a camel coat against concrete, with QUIET LUXURY and The autumn edit set in the upper space](https://runware.ai/docs/assets/output-editorial.DVhqLK9r_ZBlvgr.jpg)

> **Prompt**: Structured JSON prompt: an editorial fashion ad of a model in a camel coat against concrete with clean upper negative space, headlined QUIET LUXURY over The autumn edit.

The move here is to **write the negative space into the shot**, then position the headline into it with a `bbox`. Asking for the copy and the empty space together is what stops the type landing on the model's face.

#### [Menus and signage](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#menus-and-signage)

A menu is the stress test: many rows of small aligned text. Give **each row its own element** and set them down the sheet in order.

![A cream cafe menu board headed COFFEE listing Espresso, Flat White, Cold Brew, and Matcha Latte with prices, and ROASTED IN HOUSE DAILY](https://runware.ai/docs/assets/output-menu.DPTUfvqt_1bSGLg.jpg)

> **Prompt**: Structured JSON prompt: a cream cafe menu board headed COFFEE with four priced rows (Espresso, Flat White, Cold Brew, Matcha Latte) and a ROASTED IN HOUSE DAILY footer.

Rows of small type are exactly where a clean seed matters most, so this is **the deliverable to generate a few times and pick from**. Keep each row short and let the layout, not a paragraph, carry the structure.

#### [Text in other languages](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#text-in-other-languages)

The model renders non-Latin scripts on the same terms as Latin: **write the actual characters** into the `text` field, never a description of them.

![A cream Japanese tea shop poster with a large black 新茶入荷 title, green 季節限定 beneath, a large ink-wash tea branch filling the centre, and 東京 中目黒店 along the bottom](https://runware.ai/docs/assets/output-multilingual-jp.crM9y7LX_QFRf6.jpg)

> **Prompt**: Structured JSON prompt: a minimal Japanese tea shop poster with 新茶入荷 in black, 季節限定 in green, a tea-branch ink illustration, and a 東京 中目黒店 address line.

Paste the characters you want, because a paraphrase in English produces invented glyphs. As with Latin copy, keep each string short and generate a few candidates for anything dense.

### [Tips](https://runware.ai/docs/models/prunaai-p-image-ideogram/guides/text-and-design#tips)

1. **Generate a few, keep the clean one.** Text is seed-sensitive, so treat the first render as a draft and pick the candidate whose copy is exact.
    
2. **Lock the seed once it is right.** With `enhancePrompt` off, a fixed seed reproduces the keeper exactly while you finish the rest.
    
3. **Quote every word, one line per element.** Literal `text` elements render as written. Described text is reinterpreted, and bundled lines get merged.
    
4. **Keep copy short.** Headlines and labels are reliable, paragraphs are not, so split long text into separate short elements.
    
5. **Set colour in hex.** An image-level palette anchors the piece, and a per-element palette pins a brand colour to one line.
    
6. **Iterate at 1K.** Resolution does not fix text, so work small and only render larger once the copy is already clean.