Evals / documents / Read a document

Read a deck with notes

Extract all the text of show.pptx, including the speaker notes, into show.txt.

The task

The reference answer shows the job can be done with deft. It is not an agent run.

deft slides to-text show.pptx --notes -o show.txt

Input

show.pptx 38.2 KB
Rendered by macOS Quick Look, first page

Rendered by macOS Quick Look, first page

Text inside
[ppt/slides/slide1.xml] Title of the first slide Subtitle of the first slide This bit is in italic green
[ppt/slides/slide2.xml] This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point!

Reference output

show.txt 326 B
Title of the first slide

Subtitle of the first slide

This bit is in italic green


I am the notes of the first slide



This is the second slide

It has bullet points on it

They’re fun, aren’t they?

Especially in a different font like Arial Black at 16 point!


These are the notes of the 2nd slide
THIS LINE IS BOLD
How a result is judged (1 check)
  • text: file = "show.txt", contains = ["Title of the first slide", "I am the notes of the first slide"]

Runs

CodexWithout deftPassed2026-11-07

Time
19s
New tokens
5.8k
Total input
70.1k
Output tokens
0.7k
Commands
4
Failed
0

Trace

  1. I’ll extract the slide text and speaker notes from the presentation into `show.txt` in the current directory.

  2. rg --files -g 'show.pptx' -g 'AGENTS.md' -g 'show.txt'
    output
    show.pptx
  3. python3 - <<'PY' import importlib.util for m in ['pptx','lxml']: print(m, bool(importlib.util.find_spec(m))) PY
    output
    pptx False
    lxml False
  4. unzip -l show.pptx
    output
    Archive:  show.pptx
      Length      Date    Time    Name
    ---------  ---------- -----   ----
         1355  01-01-1980 00:00   docProps/app.xml
          846  01-01-1980 00:00   docProps/core.xml
         4794  01-01-1980 00:00   docProps/thumbnail.jpeg
         7378  01-01-1980 00:00   ppt/notesMasters/notesMaster1.xml
          292  01-01-1980 00:00   ppt/notesMasters/_rels/notesMaster1.xml.rels
         1568  01-01-1980 00:00   ppt/notesSlides/notesSlide1.xml
         1793  01-01-1980 00:00   ppt/notesSlides/notesSlide2.xml
          447  01-01-1980 00:00   ppt/notesSlides/_rels/notesSlide1.xml.rels
          447  01-01-1980 00:00   ppt/notesSlides/_rels/notesSlide2.xml.rels
         3699  01-01-1980 00:00   ppt/presentation.xml
          816  01-01-1980 00:00   ppt/presProps.xml
         4094  01-01-1980 00:00   ppt/slideLayouts/slideLayout1.xml
         2706  01-01-1980 00:00   ppt/slideLayouts/slideLayout10.xml
         2930  01-01-1980 00:00   ppt/slideLayouts/slideLayout11.xml
         2651  01-01-1980 00:00   ppt/slideLayouts/slideLayout2.xml
         4206  01-01-1980 00:00   ppt/slideLayouts/slideLayout3.xml
         4304  01-01-1980 00:00   ppt/slideLayouts/slideLayout4.xml
         6789  01-01-1980 00:00   ppt/slideLayouts/slideLayout5.xml
         2011  01-01-1980 00:00   ppt/slideLayouts/slideLayout6.xml
         1714  01-01-1980 00:00   ppt/slideLayouts/slideLayout7.xml
         4474  01-01-1980 00:00   ppt/slideLayouts/slideLayout8.xml
         4422  01-01-1980 00:00   ppt/slideLayouts/slideLayout9.xml
          311  01-01-1980 00:00   ppt/slideLayouts/
    … 1579 more characters
  5. python3 - <<'PY' import zipfile, xml.etree.ElementTree as ET, re from pathlib import Path p=Path('show.pptx') ns={'a':'http://schemas.openxmlformats.org/drawingml/2006/main','p':'http://schemas.openxmlformats.org/presentationml/2006/main'} with zipfile.ZipFile(p) as z: slides=sorted((n for n in z.namelist() if re.fullmatch(r'ppt/slides/slide\\d+\\.xml',n)), key=lambda n:int(re.search(r'(\\d+)',n).group(1))) notes={int(re.search(r'notesSlide(\\d+)',n).group(1)):n for n in z.namelist() if re.fullmatch(r'ppt/notesSlides/notesSlide\\d+\\.xml',n)} out=[] for i,s in enumerate(slides,1): out.append(f'Slide {i}') root=ET.fromstring(z.read(s)) for sp in root.findall('.//p:sp',ns): texts=[t.text or '' for t in sp.findall('.//a:t',ns)] if texts: out.append(''.join(texts)) n=notes.get(i) if n: out.append('Speaker notes:') nr=ET.fromstring(z.read(n)) for sp in nr.findall('.//p:sp',ns): ph=sp.find('./p:nvSpPr/p:nvPr/p:ph',ns) if ph is not None and ph.attrib.get('type') in ('slidenum','sldImg'): continue texts=[t.text or '' for t in sp.findall('.//a:t',ns)] if texts: out.append(''.join(texts)) out.append('') Path('show.txt').write_text('\\n'.join(out),encoding='utf-8') PY cat show.txt
    output
    Slide 1
    Title of the first slide
    Subtitle of the first slideThis bit is in italic green
    Speaker notes:
    I am the notes of the first slide
    1
    
    Slide 2
    This is the second slide
    It has bullet points on itThey’re fun, aren’t they?Especially in a different font like Arial Black at 16 point!
    Speaker notes:
    These are the notes of the 2nd slideTHIS LINE IS BOLD
    2
  6. Extracted the slide text and speaker notes into [show.txt](show.txt).

Output

show.txt 360 B
Slide 1
Title of the first slide
Subtitle of the first slideThis bit is in italic green
Speaker notes:
I am the notes of the first slide
1

Slide 2
This is the second slide
It has bullet points on itThey’re fun, aren’t they?Especially in a different font like Arial Black at 16 point!
Speaker notes:
These are the notes of the 2nd slideTHIS LINE IS BOLD
2

CodexWith deft, skill installedPassedRead the skillUsed deft2026-11-07

Time
15s
New tokens
15.0k
Total input
90.5k
Output tokens
0.4k
Commands
5
Failed
0

Trace

  1. I’ll inspect the available file tools and the presentation, then write the extracted slide text and speaker notes to `show.txt` in this directory.

  2. rg --files -g 'show.pptx' -g 'AGENTS.md'
    output
    show.pptx
  3. I’m using the `deft` workflow for this PowerPoint extraction; I’ll check its instructions for preserving notes and then create the text file.

  4. cat .agents/skills/deft/SKILL.md
    output
    ---
    name: deft
    description: "Use deft instead of writing a script for file jobs: PDF merge/split/compress/watermark, image resize/convert/compress, video and audio trim/convert/compress, spreadsheets, Markdown to PDF/HTML, and YouTube downloads and subtitles."
    ---
    
    # deft
    
    One local command for file jobs. Prefer it over writing Python or shell scripts.
    
    Syntax: `deft <group> <command> [inputs] [-o output] [--options]`
    
    Groups:
    - `pdf`: Merge, split, compress, encrypt, forms, OCR, compare, convert
    - `image`: Resize, crop, convert, compress, filters, montage, OCR
    - `video`: Trim, crop, speed, convert, compress, GIF, frames (ffmpeg)
    - `audio`: Convert, trim, merge, fade, speed, tag, normalize (ffmpeg)
    - `doc`: Word/ODT/RTF: to text, Markdown, HTML, PDF; find and replace
    - `slides`: PowerPoint: extract text, Markdown outline, PDF handout
    - `data`: JSON/YAML/TOML/XML: convert, query with jq syntax, merge, diff
    - `sheet`: Excel/CSV/ODS tables: filter, sort, join, pivot, convert
    - `md`: Markdown to PDF, HTML, Word, EPUB; table of contents
    - `html`: HTML to Markdown, text, Word, PDF; screenshots
    - `epub`: E-books: info, to text, Markdown and PDF
    - `email`: EML files: headers, text, attachments
    - `contact`: VCF address books: to and from CSV
    - `calendar`: ICS calendars: to and from CSV
    - `gps`: GPX and KML tracks: convert, distance and time
    - `youtube`: Info, download, audio, subtitles, thumbnail (yt-dlp)
    - `file`: Any file: hash, duplicates, batch rename, base64, encoding
    - `qr`: Cre
    … 728 more characters
  5. deft slides
    output
    deft slides - commands (input -> output)
      info     pptx -> report  Slide count, titles, images, notes
      from-md  md -> pptx      Make a deck: each heading or --- starts a slide [beta]
      to-md    pptx -> md      Outline in Markdown: a heading per slide, bullets, images
      to-pdf   pptx -> pdf     Handout PDF of slide content [beta]
      to-text  pptx -> txt     Extract the text of every slide, form feed between slides
    More: deft slides <command> --help
  6. deft slides to-text --help
    output
    deft slides to-text - Extract the text of every slide, form feed between slides
    Same as: deft convert
    
    Usage: deft slides to-text <pptx>... [-o <txt|dir>] [options]
    In: pptx (each handled separately)   Out: txt (default <name>.<ext>)
    
    Options:
      --notes                      Include speaker notes
    Common: -o --force --dry-run --json -j   (deft help common)
    
    Examples:
      deft slides to-text deck.pptx --notes -o deck.txt
    
    Result fields: slides
  7. deft slides to-text show.pptx --notes -o show.txt
    output
    ok slides.to-text show.pptx -> show.txt  2 slides  0.00s
  8. Extracted the text from both slides, including speaker notes, into [show.txt](show.txt).

Output

show.txt 326 B
Title of the first slide

Subtitle of the first slide

This bit is in italic green


I am the notes of the first slide



This is the second slide

It has bullet points on it

They’re fun, aren’t they?

Especially in a different font like Arial Black at 16 point!


These are the notes of the 2nd slide
THIS LINE IS BOLD

Claude Opus 5.5Without deftPassed2026-11-07

Time
16s
New tokens
10.9k
Total input
43.1k
Output tokens
1.5k
Commands
0
Failed
0

Trace

    Output

    show.txt 398 B
    ===== Slide 1 =====
    Title of the first slide
    Subtitle of the first slide
    This bit is in italic green
    --- Speaker Notes ---
    I am the notes of the first slide
    
    ===== Slide 2 =====
    This is the second slide
    It has bullet points on it
    They’re fun, aren’t they?
    Especially in a different font like Arial Black at 16 point!
    --- Speaker Notes ---
    These are the notes of the 2nd slide
    THIS LINE IS BOLD
    

    Claude Opus 5.5With deft, skill installedPassedRead the skillUsed deft2026-11-07

    Time
    10s
    New tokens
    10.0k
    Total input
    59.4k
    Output tokens
    0.5k
    Commands
    0
    Failed
    0

    Trace

      Output

      ---
      name: deft
      description: "Use deft first for any simple, direct operation on local files, whatever the type: convert, read, extract, edit, compress, merge, split, compare or inspect. Try it before writing a script or one-liner. If unsure, run deft find; if it says no command does this, use another tool. Not for programming work: to read, write or change source code, skip it."
      ---
      
      # deft
      
      One local command for file jobs. Prefer it over writing Python or shell scripts.
      
      Syntax: `deft <group> <command> [inputs] [-o output] [--options]`
      
      Groups:
      - `pdf`: Merge, split, compress, encrypt, forms, OCR, compare, convert
      - `image`: Resize, crop, convert, compress, adjust, montage, OCR
      - `video`: Trim, merge, convert, compress, subtitles, GIF, frames (ffmpeg)
      - `audio`: Convert, trim, normalize, denoise, cut silence (ffmpeg)
      - `doc`: Word/ODT/RTF: to text, Markdown, HTML, PDF; find and replace
      - `slides`: PowerPoint: extract text, Markdown outline
      - `sheet`: Excel/CSV/ODS tables: SQL query, pivot, merge, split, convert
      - `json`: JSON: convert, format, merge, diff, validate
      - `toml`: TOML: convert, format, merge, diff, validate
      - `xml`: XML: convert, format, merge, diff, validate
      - `yaml`: YAML: convert, format, merge, diff, validate
      - `md`: Markdown to PDF, HTML, Word, EPUB; table of contents
      - `html`: HTML to Markdown, text, Word and PDF
      - `epub`: E-books: info, to text, Markdown and PDF
      - `gps`: GPX and KML tracks: convert, distance and time
      - `qr`: Create QR codes and barcodes; read QR codes
      
      How to use it:
      1. Run `deft <group>` to list commands, or `deft find "<what you want>"` to search. If it says `no command does this`, use another tool.
      2. Run `deft <group> <command> --help` for options and examples.
      3. `deft convert <in> -o <out.ext>` converts between formats by extension.
      4. Results are one line starting with `ok`, `partial` or `error`; add `--json` to parse them. Errors include a `hint:` with the fix.
      
      Inputs are never overwritten; pass `--force` or `--in-place` to allow it. Globs and directories work as inputs; several inputs run in parallel.
      
      If `deft` is not installed, ask the user, then follow https://github.com/firstprayer/deft/blob/main/docs/INSTALL.md
      
      show.txt 326 B
      Title of the first slide
      
      Subtitle of the first slide
      
      This bit is in italic green
      
      
      I am the notes of the first slide
      
      
      
      This is the second slide
      
      It has bullet points on it
      
      They’re fun, aren’t they?
      
      Especially in a different font like Arial Black at 16 point!
      
      
      These are the notes of the 2nd slide
      THIS LINE IS BOLD
      

      Claude CodeWithout deftNot run yet

      Claude CodeWith deftNot run yet