anthropics/skills · error · ValueError

LibreOffice rendered {len(visible_images)} page(s) for {visi

Error message

LibreOffice rendered {len(visible_images)} page(s) for {visible_count} visible slide(s) of {len(slide_info)}; thumbnails would be mislabeled

What it means

build_slide_list() in thumbnail.py aligns LibreOffice-rendered page images with the deck's slide list. It knows how many visible (non-hidden) slides there are; if the number of rendered images differs AND the special case 'LibreOffice rendered hidden slides too' (len(images)==len(slide_info)!=visible_count) does not hold, the one-to-one mapping between images and slides is broken and thumbnails would be mislabeled — so it refuses with ValueError.

Source

Thrown at skills/pptx/scripts/thumbnail.py:151

            part = rid_to_part.get(sld_id.getAttribute("r:id"))
            if part is not None and part in present:
                slides.append(
                    {"name": posixpath.basename(part), "hidden": _is_hidden(zf, part)}
                )

        return slides


def build_slide_list(
    slide_info: list[dict],
    visible_images: list[Path],
    temp_dir: Path,
) -> list[tuple[Path, str]]:
    visible_count = sum(1 for info in slide_info if not info["hidden"])
    rendered_hidden = len(visible_images) == len(slide_info) != visible_count

    if not rendered_hidden and visible_count != len(visible_images):
        raise ValueError(
            f"LibreOffice rendered {len(visible_images)} page(s) for {visible_count} "
            f"visible slide(s) of {len(slide_info)}; thumbnails would be mislabeled"
        )

    if visible_images:
        with Image.open(visible_images[0]) as img:
            placeholder_size = img.size
    else:
        placeholder_size = (1920, 1080)

    slides = []
    visible_idx = 0

    for info in slide_info:
        if info["hidden"] and not rendered_hidden:
            placeholder_path = temp_dir / f"hidden-{info['name']}.jpg"
            placeholder_img = create_hidden_placeholder(placeholder_size)
            placeholder_img.save(placeholder_path, "JPEG")

View on GitHub (pinned to f6656c1256)

Solutions

  1. Check the LibreOffice version/behavior: re-render with 'soffice --headless --convert-to pdf' and count pages vs visible slides to see which side is wrong.
  2. Ensure the temp image directory is fresh per run so stale images are not counted.
  3. Re-save the deck in PowerPoint to normalize hidden-slide (show) attributes, then retry.
  4. If a corrupt slide is skipped by LibreOffice, repair or remove that slide and re-render.

Example fix

# before
slides = build_slide_list(slide_info, visible_images, temp_dir)  # may raise

# after
visible_count = sum(1 for i in slide_info if not i["hidden"])
if visible_count != len(visible_images):
    raise RuntimeError(f"render mismatch: {len(visible_images)} images vs {visible_count} visible slides — re-render deck")
slides = build_slide_list(slide_info, visible_images, temp_dir)
Defensive patterns

Strategy: validation

Validate before calling

def render_count_matches(slide_info: list[dict], visible_images: list[Path]) -> bool:
    visible_count = sum(1 for i in slide_info if not i["hidden"])
    rendered_hidden = len(visible_images) == len(slide_info) != visible_count
    return rendered_hidden or visible_count == len(visible_images)

Try / catch

try:
    slides = build_slide_list(slide_info, visible_images, temp_dir)
except ValueError as e:
    if "thumbnails would be mislabeled" in str(e):
        log.warning("render mismatch (%s) — re-rendering deck once", e)
        visible_images = render_pages(pptx_path, temp_dir)  # fresh render, clean temp dir first
        slides = build_slide_list(slide_info, visible_images, temp_dir)
    else:
        raise

Prevention

When it happens

Trigger: Rendering a deck where soffice produced fewer/more pages than visible slides: e.g. get_slide_info miscounted hidden slides (show attribute parsed as hidden when not), LibreOffice skipped a corrupt slide, export produced a partial PDF/PNG set, or a race where output images were read before conversion finished.

Common situations: Headless LibreOffice versions that render hidden slides differently than desktop; decks with unusual 'show' attribute values; truncated PDF-to-image conversion; temp-dir cleanup or glob ordering issues picking up stale images from a previous run.

Related errors


AI-assisted analysis of anthropics/skills@f6656c1256 (2026-08-14). Data as JSON: /api/errors/90463cbba3177053. Report an issue: GitHub.