Class LetterBuilder
Letter.builder() or the public no-argument constructor. Body content,
tables, blocks and fixed elements append in call order; header, footer, signature, logo,
watermark and configuration calls replace the corresponding setting. Each build()
returns an independent immutable LetterDocument; the builder remains reusable and is not
intended for concurrent use.
Defaults are A4 with 20 mm margins, 3 mm paragraph spacing, a 25 mm header box, a 15 mm footer
box, and a flowing signature. HTML signature images use a 20 mm height basis by default. Body
typography defaults to 11 pt black Helvetica with a 1.2 line-height multiplier. Header and footer
reserve space only when present, with a 5 mm gap to the body; footer text defaults to 9 pt and
#666666. Images preserve their aspect ratio. Named assets and HTML regions resolve
against final builder settings at build time.
Argument checks catch nulls and basic geometry during configuration or building. The resulting
model still needs LetterPdfGenerator validation for fonts,
styles, collisions and final layout.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionaddressLayout(AddressLayout value) Places configured sender/recipient/date fields inside an editable body-relative panel.Registers a defensive copy of named image bytes for later HTML asset resolution.Reads a local file immediately and registers its bytes as a named markup image asset.attach(PdfAttachment value) Appends an immutable existing PDF to the output pack.Appends an advanced model block without leaving the fluent API.body(LetterComponent value) Appends an immutable fragment as a softly kept body group.Appends plain text chunks in order.Appends body content as a fragment of the supported HTML subset.build()Resolves deferred HTML, assets, images and region geometry into an immutable snapshot.canvas(CanvasBlock value) Appends one bounded arbitrary-position body canvas.Replaces the nonblank closing phrase after body content.component(String name, LetterComponent value) Registers a reusable document-local fragment; later registrations replace the same name.Defers date formatting until final builder locale is known.Defers a locally styled date until final locale is known.direction(TextDirection value) Sets writing direction independently from formatting locale.fallbackFonts(String... values) Sets ordered explicit registered fallback font families.fixedElement(FixedElement element) Appends an advanced fixed element using the configured header/footer zones.footer(byte[] image) Replaces the footer with a repeated PNG/JPEG/static SVG image.footer(LetterComponent value) Replaces footer content with a reusable fragment.footer(PageSelector pages, byte[] image) Replaces footer content for one page selection; ALL is fallback for unspecified selections.footer(PageSelector pages, String... text) Replaces footer content for one page selection; ALL is fallback for unspecified selections.footer(PageSelector pages, Path image) Replaces footer content for one page selection; ALL is fallback for unspecified selections.Replaces the footer with plain text repeated on every page.Reads a PNG/JPEG/static SVG file immediately and replaces the footer with its fitted image.footerBlocks(Block... blocks) Replaces footer content with an ordered snapshot of advanced model blocks.footerBlocks(PageSelector pages, Block... blocks) Replaces footer content for one page selection; ALL is fallback for unspecified selections.footerHeightMm(double value) Replaces footer content-box height, initially 15 mm.footerHtml(PageSelector pages, String markup) Replaces footer content for one page selection; ALL is fallback for unspecified selections.footerHtml(String markup) Replaces footer content with a fragment of the supported HTML subset.footerStyle(PageSelector pages, Style value) Applies appearance overrides to one footer selection after the shared footer defaults.footerStyle(Style value) Replaces footer overrides on top of the default 9 pt gray text and zero before/after spacing.Appends an explicit softly kept group of immutable blocks.Appends grouped plain text using the ordinary newline/paragraph rules.header(byte[] image) Replaces the header with a repeated PNG/JPEG/static SVG image.header(LetterComponent value) Replaces header content with a reusable fragment.header(PageSelector pages, byte[] image) Replaces header content for one page selection; ALL is fallback for unspecified selections.header(PageSelector pages, String... text) Replaces header content for one page selection; ALL is fallback for unspecified selections.header(PageSelector pages, Path image) Replaces header content for one page selection; ALL is fallback for unspecified selections.Replaces the header with plain text repeated on every page.Reads a PNG/JPEG/static SVG file immediately and replaces the header with its fitted image.headerAlignment(TextAlign alignment) Positions an automatic header box within the space beside the logo and supplies default content alignment.headerBlocks(Block... blocks) Replaces header content with an ordered snapshot of advanced model blocks.headerBlocks(PageSelector pages, Block... blocks) Replaces header content for one page selection; ALL is fallback for unspecified selections.headerBoundsMm(double x, double y, double width, double height) Replaces automatic placement with an exact header box measured from the inner page upper-left corner.headerHeightMm(double value) Replaces the header content-box height, initially 25 mm.headerHtml(PageSelector pages, String markup) Replaces header content for one page selection; ALL is fallback for unspecified selections.headerHtml(String markup) Replaces header content with a fragment of the supported HTML subset.headerStyle(PageSelector pages, Style value) Applies appearance overrides to one header selection after the shared header defaults.headerStyle(Style value) Replaces header style overrides on top of zero before/after spacing and the currently selected header alignment.headerWidthMm(double width) Replaces the header box width in millimeters.Appends a heading block whose appearance inherits the document style and heading defaults.hyphenate(boolean value) Enables dictionary hyphenation using explicitly registered trusted patterns.Appends a reference to a registered fragment at this position in body flow.locale(LocaleSettings value) Sets deterministic country-aware formatting.Sets a locale using its language tag and default date/currency conventions.logo(byte[] image) Replaces the logo by immediately decoding copied PNG/JPEG/static SVG bytes and fitting their aspect ratio into a 45 by 20 mm box.logo(ImageBlock image) Replaces the logo with an advanced image block retaining its supplied dimensions.Reads and replaces the logo immediately, fitting it into a 45 by 20 mm box with its aspect ratio preserved.Replaces the four page margins.marginsMm(double allSides) Replaces all four page margins with the same millimeter value.metadata(DocumentMetadata value) Replaces PDF metadata.orientation(Orientation value) Selects the shorter or longer edge as the horizontal edge.Replaces the paper size, initiallyPageSize.A4.Appends an explicit break so subsequent body content begins on a new page.pageSizeMm(double widthMm, double heightMm) Selects custom physical paper dimensions, preserving the supplied orientation.part(LetterElement element, List<Block> blocks) Replaces one semantic role while preserving conventional letter order.part(LetterElement element, List<Block> blocks, Style localStyle) Replaces one semantic role with explicit local wrapper styling.Replaces the recipient identity/address.Replaces the reference with a bold label and literal value.salutation(String value) Replaces the nonblank opening greeting.Replaces the sender identity/address.settings(DocumentSettings value) Replaces optional language, font and PDF metadata settings.signature(LetterComponent value) Replaces signature content with a reusable fragment.signature(SignatureContent... parts) Replaces signature content with the supplied immutable parts stacked in argument order.signatureBlocks(Block... blocks) Replaces signature content with an ordered snapshot of advanced model blocks.signatureHeightMm(double value) Replaces the signature height, initially 20 mm.signatureHtml(String markup) Replaces signature content with a fragment of the supported HTML subset.Replaces signature placement.Replaces body style overrides, overlaid on the default 3 mm paragraph gap.Replaces the nonblank literal subject.table(TableBlock value) Appends a table block, commonly produced byTable.builder(String...).theme(LetterTheme value) Sets role defaults and named styles for this document.Replaces the watermark configuration for PDF post-processing.Replaces the watermark with the default text-watermark configuration.
-
Constructor Details
-
LetterBuilder
public LetterBuilder()
-
-
Method Details
-
part
Replaces one semantic role while preserving conventional letter order.- Parameters:
element- semantic roleblocks- immutable-model content- Returns:
- this builder
-
part
Replaces one semantic role with explicit local wrapper styling.- Parameters:
element- semantic roleblocks- ordered model contentlocalStyle- optional local style- Returns:
- this builder
-
sender
Replaces the sender identity/address.- Parameters:
value- non-null validated sender- Returns:
- this builder
-
recipient
Replaces the recipient identity/address.- Parameters:
value- non-null validated recipient- Returns:
- this builder
-
date
Defers date formatting until final builder locale is known.- Parameters:
value- non-null letter date- Returns:
- this builder
-
date
Defers a locally styled date until final locale is known.- Parameters:
value- non-null datelocalStyle- optional local style- Returns:
- this builder
-
subject
Replaces the nonblank literal subject.- Parameters:
value- subject text- Returns:
- this builder
-
reference
Replaces the reference with a bold label and literal value.- Parameters:
label- nonblank labelvalue- nonblank value- Returns:
- this builder
-
salutation
Replaces the nonblank opening greeting.- Parameters:
value- greeting- Returns:
- this builder
-
closing
Replaces the nonblank closing phrase after body content.- Parameters:
value- closing phrase- Returns:
- this builder
-
addressLayout
Places configured sender/recipient/date fields inside an editable body-relative panel.- Parameters:
value- optional-bound layout preset- Returns:
- this builder
-
canvas
Appends one bounded arbitrary-position body canvas.- Parameters:
value- immutable canvas- Returns:
- this builder
-
settings
Replaces optional language, font and PDF metadata settings.- Parameters:
value- settings, null selects defaults- Returns:
- this builder
-
locale
Sets deterministic country-aware formatting.- Parameters:
value- language and formatting settings- Returns:
- this builder
-
locale
Sets a locale using its language tag and default date/currency conventions.- Parameters:
value- country-aware locale- Returns:
- this builder
-
metadata
Replaces PDF metadata.- Parameters:
value- optional title, author, subject and keywords- Returns:
- this builder
-
direction
Sets writing direction independently from formatting locale.- Parameters:
value- explicit direction or AUTO for language-derived direction- Returns:
- this builder
-
fallbackFonts
Sets ordered explicit registered fallback font families.- Parameters:
values- registered family names, tried after the selected family- Returns:
- this builder
-
hyphenate
Enables dictionary hyphenation using explicitly registered trusted patterns.- Parameters:
value- whether hyphenation should be enabled- Returns:
- this builder
-
attach
Appends an immutable existing PDF to the output pack.- Parameters:
value- validated attachment snapshot- Returns:
- this builder
-
pageSizeMm
Selects custom physical paper dimensions, preserving the supplied orientation.- Parameters:
widthMm- sheet width in millimetersheightMm- sheet height in millimeters- Returns:
- this builder
-
orientation
Selects the shorter or longer edge as the horizontal edge.- Parameters:
value- sheet orientation- Returns:
- this builder
-
landscape
- Returns:
- this builder configured for landscape paper
-
body
Appends an immutable fragment as a softly kept body group.- Parameters:
value- reusable content- Returns:
- this builder
-
header
Replaces header content with a reusable fragment.- Parameters:
value- reusable content- Returns:
- this builder
-
signature
Replaces signature content with a reusable fragment.- Parameters:
value- reusable content- Returns:
- this builder
-
theme
Sets role defaults and named styles for this document.- Parameters:
value- non-null theme- Returns:
- this builder
-
component
Registers a reusable document-local fragment; later registrations replace the same name.- Parameters:
name- nonblank reference namevalue- immutable content- Returns:
- this builder
-
include
Appends a reference to a registered fragment at this position in body flow.- Parameters:
name- component name resolved during generation- Returns:
- this builder
-
page
Replaces the paper size, initiallyPageSize.A4. Header geometry and image fitting use the selected size when built.- Parameters:
size- non-null paper size- Returns:
- this builder
- Throws:
IllegalArgumentException- ifsizeis null
-
marginsMm
Replaces all four page margins with the same millimeter value. Margins must leave positive body space when the document is built.- Parameters:
allSides- finite nonnegative distance from every paper edge, in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- if the value is negative or nonfinite
-
margins
Replaces the four page margins. Nonnegative values and available page space are checked when building, allowing the page size to be changed before then.- Parameters:
value- non-null top, right, bottom and left margins in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
style
Replaces body style overrides, overlaid on the default 3 mm paragraph gap. Specified block or run styles can override inherited fields. This call does not accumulate overrides from earlier calls to this method.- Parameters:
value- non-null body defaults; unspecified fields retain library defaults- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
body
Appends plain text chunks in order. Single newlines change lines, blank lines separate paragraphs, and form feeds (includingLetter.PAGE_BREAK) insert page breaks. Each chunk begins its own paragraph sequence; CRLF and CR are normalized.- Parameters:
content- non-null array of non-null body strings- Returns:
- this builder
- Throws:
IllegalArgumentException- if the array or a chunk is null
-
heading
Appends a heading block whose appearance inherits the document style and heading defaults.- Parameters:
text- non-null heading text- Returns:
- this builder
- Throws:
IllegalArgumentException- iftextis null
-
pageBreak
Appends an explicit break so subsequent body content begins on a new page.- Returns:
- this builder
-
table
Appends a table block, commonly produced byTable.builder(String...).- Parameters:
value- non-null table snapshot- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
block
Appends an advanced model block without leaving the fluent API. Its explicit style fields override document defaults; detailed validation occurs at generation.- Parameters:
value- non-null body block- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
group
Appends an explicit softly kept group of immutable blocks.- Parameters:
blocks- non-null ordered child blocks- Returns:
- this builder
-
group
Appends grouped plain text using the ordinary newline/paragraph rules.- Parameters:
content- non-null text chunks without page breaks- Returns:
- this builder
-
header
Replaces the header with plain text repeated on every page. Single newlines change lines and blank lines separate paragraphs. The strings are copied; the final header style is applied when built. An empty array clears the content.- Parameters:
text- non-null array of non-null strings without form-feed page breaks- Returns:
- this builder
- Throws:
IllegalArgumentException- if the array or a string is null, or a string contains a form-feed page break
-
header
Replaces header content for one page selection; ALL is fallback for unspecified selections. Geometry and inherited region defaults are shared across variants. Empty text/block content suppresses the fallback on that selection. Paths are read immediately; other inputs retain the corresponding ordinary overload's validation and snapshot rules.- Parameters:
pages- non-null page selectiontext- region content- Returns:
- this builder
- Throws:
IllegalArgumentException- if input or page selection is invalid
-
headerStyle
Replaces header style overrides on top of zero before/after spacing and the currently selected header alignment. Explicit block styles can override these inherited fields.- Parameters:
value- non-null header style overrides- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
headerStyle
Applies appearance overrides to one header selection after the shared header defaults.- Parameters:
pages- non-null page selectionvalue- non-null appearance overrides- Returns:
- this builder
-
headerAlignment
Positions an automatic header box within the space beside the logo and supplies default content alignment. Explicit block styles can override the content alignment. With exactbounds, only content alignment changes; the box origin stays fixed.- Parameters:
alignment- LEFT, CENTER or RIGHT- Returns:
- this builder
- Throws:
IllegalArgumentException- if alignment is null or JUSTIFY
-
headerWidthMm
Replaces the header box width in millimeters. Automatic placement follows the selected alignment; an exact box is resized without moving its origin. Available width beside the final logo is checked when built. Without an explicit width, automatic headers fill the available space.- Parameters:
width- finite positive header width in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- if width is nonpositive or nonfinite
-
headerBoundsMm
Replaces automatic placement with an exact header box measured from the inner page upper-left corner. Add left/top margins to obtain paper-edge coordinates. The box bottom reserves body space followed by a 5 mm gap. Later width/height calls retain this origin; page fit is checked when built.- Parameters:
x- finite nonnegative horizontal offset from the left margin, in mmy- finite nonnegative vertical offset from the top margin, in mmwidth- finite positive box width in mmheight- finite positive box height in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- if offsets are negative/nonfinite or dimensions are nonpositive/nonfinite
-
headerHeightMm
Replaces the header content-box height, initially 25 mm. An exact box keeps its origin. Automatic layout also accommodates a taller logo. Images passed directly as bytes have an initial fit at registration time and are refitted to the final box when built.- Parameters:
value- finite positive height in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- if the value is nonpositive or nonfinite
-
logo
Replaces the logo by immediately decoding copied PNG/JPEG/static SVG bytes and fitting their aspect ratio into a 45 by 20 mm box. The logo repeats on every page; the header is placed beside it. A logo wider than the final inner page width is refitted at build time.- Parameters:
image- non-null readable PNG, JPEG or static SVG bytes- Returns:
- this builder
- Throws:
IllegalArgumentException- if bytes are null, unreadable or not PNG/JPEG/static SVG
-
logo
Reads and replaces the logo immediately, fitting it into a 45 by 20 mm box with its aspect ratio preserved.- Parameters:
image- non-null path to a PNG, JPEG or static SVG file- Returns:
- this builder
- Throws:
IOException- if the file cannot be readNullPointerException- ifimageis nullIllegalArgumentException- if the file is not a readable PNG, JPEG or static SVG image
-
signature
Replaces signature content with the supplied immutable parts stacked in argument order. Text and image parts may be combined. Placement and reserved height are configured separately; the default placement follows the body.- Parameters:
parts- non-null, nonempty array of non-null signature parts- Returns:
- this builder
- Throws:
IllegalArgumentException- if the array is null or empty, or a part is null
-
signaturePlacement
Replaces signature placement.SignaturePlacement.FLOWfollows the body and is the default;SignaturePlacement.BOTTOM_LASTanchors above the footer on the final page using the configured signature height.- Parameters:
value- non-null placement policy- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
signatureHeightMm
Replaces the signature height, initially 20 mm. When content exists andSignaturePlacement.BOTTOM_LASTis selected, this reserves the final-page signature box. FLOW reserves no signature zone.Signature HTML uses this height for default and percentage-based image sizes. Explicit signature parts and typed blocks retain their own dimensions; resize an image part with
ImageSignature.sizeMm(double, double).- Parameters:
value- finite positive height in mm- Returns:
- this builder
- Throws:
IllegalArgumentException- if the value is nonpositive or nonfinite
-
watermark
Replaces the watermark with the default text-watermark configuration. Watermarks are applied during PDF generation; text validity is checked there.- Parameters:
text- text forTextWatermark.of(String)- Returns:
- this builder
-
watermark
Replaces the watermark configuration for PDF post-processing. Content, opacity and geometry are validated when generating the PDF.- Parameters:
value- non-null text or image watermark- Returns:
- this builder
- Throws:
IllegalArgumentException- ifvalueis null
-
fixedElement
Appends an advanced fixed element using the configured header/footer zones. Its page selector and bounds are preserved; collision and zone-fit checks occur during generation. Configure suitable region heights for the supplied geometry.- Parameters:
element- non-null fixed element- Returns:
- this builder
- Throws:
IllegalArgumentException- ifelementis null
-
asset
Registers a defensive copy of named image bytes for later HTML asset resolution. Reusing a name replaces its previous bytes. Image decoding and format checks occur when markup referencing the asset is built, so registration can follow content calls.- Parameters:
name- nonblank asset identifier used by markup image referencesdata- non-null image bytes; supported image formats are PNG, JPEG and static SVG- Returns:
- this builder
- Throws:
IllegalArgumentException- if the name is null or blank, or the bytes are null
-
asset
Reads a local file immediately and registers its bytes as a named markup image asset. Reusing a name replaces the existing asset; image decoding is deferred until referenced markup is built.- Parameters:
name- nonblank asset identifierpath- non-null image file to read- Returns:
- this builder
- Throws:
IOException- if the file cannot be readNullPointerException- ifpathis nullIllegalArgumentException- ifnameis null or blank
-
bodyHtml
Appends body content as a fragment of the supported HTML subset. Parsing and named asset resolution are deferred to build time, using final page/region dimensions. Assets may be registered before or after this call.- Parameters:
markup- non-null supported HTML fragment- Returns:
- this builder
- Throws:
IllegalArgumentException- ifmarkupis null
-
headerHtml
Replaces header content with a fragment of the supported HTML subset. Parsing and named asset resolution are deferred to build time, using final page/region dimensions. Assets may be registered before or after this call. Page breaks are rejected in this region.- Parameters:
markup- non-null supported HTML fragment- Returns:
- this builder
- Throws:
IllegalArgumentException- ifmarkupis null
-
headerHtml
Replaces header content for one page selection; ALL is fallback for unspecified selections. Geometry and inherited region defaults are shared across variants. Empty text/block content suppresses the fallback on that selection. Paths are read immediately; other inputs retain the corresponding ordinary overload's validation and snapshot rules.- Parameters:
pages- non-null page selectionmarkup- region content- Returns:
- this builder
- Throws:
IllegalArgumentException- if input or page selection is invalid
-
signatureHtml
Replaces signature content with a fragment of the supported HTML subset. Parsing and named asset resolution are deferred to build time, using final page/region dimensions. Assets may be registered before or after this call. Page breaks are rejected in this region.- Parameters:
markup- non-null supported HTML fragment- Returns:
- this builder
- Throws:
IllegalArgumentException- ifmarkupis null
-
headerBlocks
Replaces header content with an ordered snapshot of advanced model blocks. An empty array clears the content. The final region defaults are overlaid when built; explicit block style fields take precedence. Region restrictions and layout are validated at build or generation time.- Parameters:
blocks- non-null array of non-null blocks- Returns:
- this builder
- Throws:
IllegalArgumentException- if the array is nullNullPointerException- if any block is null
-
headerBlocks
Replaces header content for one page selection; ALL is fallback for unspecified selections. Geometry and inherited region defaults are shared across variants. Empty text/block content suppresses the fallback on that selection. Paths are read immediately; other inputs retain the corresponding ordinary overload's validation and snapshot rules.- Parameters:
pages- non-null page selectionblocks- region content- Returns:
- this builder
- Throws:
IllegalArgumentException- if input or page selection is invalid
-
signatureBlocks
Replaces signature content with an ordered snapshot of advanced model blocks. An empty array clears the content. The blocks retain their own style settings. Region restrictions and layout are validated at build or generation time.- Parameters:
blocks- non-null array of non-null blocks- Returns:
- this builder
- Throws:
IllegalArgumentException- if the array is nullNullPointerException- if any block is null
-
header
Replaces the header with a repeated PNG/JPEG/static SVG image. Bytes are copied and decoded immediately, preserving aspect ratio inside a 160 mm wide box with the current header height (default 25 mm). The image is refitted to final region dimensions when built.- Parameters:
image- non-null readable PNG, JPEG or static SVG bytes- Returns:
- this builder
- Throws:
IllegalArgumentException- if bytes are null, unreadable or not PNG/JPEG/static SVG
-
header
Replaces header content for one page selection; ALL is fallback for unspecified selections. Geometry and inherited region defaults are shared across variants. Empty text/block content suppresses the fallback on that selection. Paths are read immediately; other inputs retain the corresponding ordinary overload's validation and snapshot rules.- Parameters:
pages- non-null page selectionimage- region content- Returns:
- this builder
- Throws:
IllegalArgumentException- if input or page selection is invalid
-
header
Reads a PNG/JPEG/static SVG file immediately and replaces the header with its fitted image. Seeheader(byte[])for sizing and final fitting behavior.- Parameters:
image- non-null path to the header image- Returns:
- this builder
- Throws:
IOException- if the file cannot be readNullPointerException- ifimageis nullIllegalArgumentException- if the file is not a readable PNG, JPEG or static SVG image
-
header
Replaces header content for one page selection; ALL is fallback for unspecified selections. Geometry and inherited region defaults are shared across variants. Empty text/block content suppresses the fallback on that selection. Paths are read immediately; other inputs retain the corresponding ordinary overload's validation and snapshot rules.- Parameters:
pages- non-null page selectionimage- region content- Returns:
- this builder
- Throws:
IOException- if image bytes cannot be read
-
logo
Replaces the logo with an advanced image block retaining its supplied dimensions. If wider than the final inner page, its bytes are refitted during building. Detailed image and style validation is performed during PDF generation.- Parameters:
image- non-null image block- Returns:
- this builder
- Throws:
IllegalArgumentException- ifimageis null
-
build
Resolves deferred HTML, assets, images and region geometry into an immutable snapshot. Body blocks remain in append order, and header/logo/footer space is reserved before creating the page specification. This does not render a PDF or validate every advanced model constraint: pass the result toLetterPdfGenerator. Later builder changes do not modify the returned document.- Returns:
- a new independent immutable document
- Throws:
IllegalStateException- if no body content was supplied or resolvedIllegalArgumentException- if page/region geometry is invalidInvalidLetterException- if deferred markup or a referenced image asset is invalid
-