home / skills / mjunaidca / mjs-agent-skills / working-with-documents

working-with-documents skill

/.claude/skills/working-with-documents

This skill helps you create and edit Word, PDF, and PowerPoint documents, automate conversions, and manage tracked changes.

npx playbooks add skill mjunaidca/mjs-agent-skills --skill working-with-documents

Review the files below or copy the command above to add this skill to your agents.

Files (2)
SKILL.md
5.7 KB
---
name: working-with-documents
description: |
  Creates and edits Office documents: Word (.docx), PDF, and PowerPoint (.pptx).
  Use when working with document creation, PDF manipulation, presentation generation,
  tracked changes, or converting between formats.
---

# Working with Documents

## Quick Reference

| Format | Read | Create | Edit |
|--------|------|--------|------|
| DOCX | pandoc, python-docx | docx-js | OOXML (unpack/edit/pack) |
| PDF | pdfplumber, pypdf | reportlab | pypdf (merge/split) |
| PPTX | markitdown | html2pptx | OOXML (unpack/edit/pack) |

## Word Documents (.docx)

### Reading Content

```bash
# Convert to markdown (preserves structure)
pandoc document.docx -o output.md

# With tracked changes visible
pandoc --track-changes=all document.docx -o output.md
```

### Creating New Documents

Use **docx-js** (JavaScript):

```javascript
const { Document, Packer, Paragraph, TextRun } = require('docx');

const doc = new Document({
  sections: [{
    children: [
      new Paragraph({
        children: [
          new TextRun({ text: "Hello World", bold: true }),
        ],
      }),
    ],
  }],
});

Packer.toBuffer(doc).then(buffer => {
  fs.writeFileSync("output.docx", buffer);
});
```

### Editing Existing Documents (Tracked Changes)

```bash
# 1. Unpack
python ooxml/scripts/unpack.py document.docx unpacked/

# 2. Edit XML files in unpacked/word/document.xml
# Key files:
#   - word/document.xml (main content)
#   - word/comments.xml (comments)
#   - word/media/ (images)

# 3. Pack
python ooxml/scripts/pack.py unpacked/ edited.docx
```

**Tracked changes XML pattern:**
```xml
<!-- Deletion -->
<w:del><w:r><w:delText>old text</w:delText></w:r></w:del>

<!-- Insertion -->
<w:ins><w:r><w:t>new text</w:t></w:r></w:ins>
```

## PDF Documents

### Reading PDFs

```python
import pdfplumber

# Extract text
with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        print(page.extract_text())

# Extract tables
with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        tables = page.extract_tables()
        for table in tables:
            for row in table:
                print(row)
```

### Creating PDFs

```python
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

doc = SimpleDocTemplate("output.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = [
    Paragraph("Report Title", styles['Title']),
    Paragraph("Body text goes here.", styles['Normal']),
]
doc.build(story)
```

### Merging/Splitting PDFs

```python
from pypdf import PdfReader, PdfWriter

# Merge
writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf"]:
    reader = PdfReader(pdf_file)
    for page in reader.pages:
        writer.add_page(page)
writer.write(open("merged.pdf", "wb"))

# Split
reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    writer.write(open(f"page_{i+1}.pdf", "wb"))
```

### Command-Line Tools

```bash
# Extract text
pdftotext input.pdf output.txt
pdftotext -layout input.pdf output.txt  # Preserve layout

# Merge with qpdf
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

# Split pages
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
```

## PowerPoint Presentations (.pptx)

### Reading Content

```bash
# Convert to markdown
python -m markitdown presentation.pptx
```

### Creating New Presentations

Use **html2pptx** workflow:

1. Create HTML slides (720pt × 405pt for 16:9)
2. Convert with html2pptx.js library
3. Validate with thumbnail grid

```bash
# Create thumbnails for validation
python scripts/thumbnail.py output.pptx --cols 4
```

### Editing Existing Presentations

```bash
# 1. Unpack
python ooxml/scripts/unpack.py presentation.pptx unpacked/

# Key files:
#   - ppt/slides/slide1.xml, slide2.xml, etc.
#   - ppt/notesSlides/ (speaker notes)
#   - ppt/media/ (images)

# 2. Edit XML

# 3. Validate
python ooxml/scripts/validate.py unpacked/ --original presentation.pptx

# 4. Pack
python ooxml/scripts/pack.py unpacked/ edited.pptx
```

### Rearranging Slides

```bash
# Duplicate, reorder, delete slides
python scripts/rearrange.py template.pptx output.pptx 0,3,3,5,7
# Creates: slide 0, slide 3 (twice), slide 5, slide 7
```

## Converting Between Formats

```bash
# DOCX/PPTX to PDF
soffice --headless --convert-to pdf document.docx

# PDF to images
pdftoppm -jpeg -r 150 document.pdf page
# Creates: page-1.jpg, page-2.jpg, etc.

# DOCX to Markdown
pandoc document.docx -o output.md
```

## OCR for Scanned Documents

```python
import pytesseract
from pdf2image import convert_from_path

images = convert_from_path('scanned.pdf')
text = ""
for image in images:
    text += pytesseract.image_to_string(image)
```

## Design Guidelines (Presentations)

### Color Palettes

Pick 3-5 colors that work together:

| Palette | Colors |
|---------|--------|
| Classic Blue | Navy #1C2833, Slate #2E4053, Silver #AAB7B8 |
| Teal & Coral | Teal #5EA8A7, Coral #FE4447, White #FFFFFF |
| Black & Gold | Gold #BF9A4A, Black #000000, Cream #F4F6F6 |

### Web-Safe Fonts Only

Arial, Helvetica, Times New Roman, Georgia, Verdana, Tahoma, Trebuchet MS, Courier New, Impact

### Layout Rules

- Two-column: Use for exactly 2 distinct items
- Three-column: Use for exactly 3 items
- Never vertically stack charts below text
- Full-bleed images with text overlays work well

## Dependencies

```bash
# Python
pip install pypdf pdfplumber reportlab python-docx openpyxl

# System tools
apt-get install pandoc poppler-utils libreoffice

# Node.js (for docx-js)
npm install docx
```

## Verification

Run: `python scripts/verify.py`

## Related Skills

- `working-with-spreadsheets` - Excel file handling
- `building-nextjs-apps` - Frontend for document uploads

Overview

This skill automates creation, reading, editing, and conversion of Office documents: Word (.docx), PDF, and PowerPoint (.pptx). It combines reliable Python and Node.js libraries and OOXML unpack/pack workflows to handle structured edits, tracked changes, and format conversions. Use it to generate reports, manipulate PDFs, and produce slide decks programmatically.

How this skill works

The skill reads documents using pandoc, pdfplumber, markitdown, and related CLIs to extract structured content. It creates new documents with libraries like docx (via docx-js), reportlab for PDFs, and html2pptx for slides. For complex edits, it unpacks OOXML packages, edits the XML (content, comments, media, tracked changes), and repacks the archive. It also supports merging/splitting PDFs, OCR for scanned pages, and format conversions via LibreOffice and command-line utilities.

When to use it

  • Generate templated Word reports or batch-create .docx files
  • Edit or inject tracked changes and comments into existing Word documents
  • Extract text, tables, or images from PDFs or merge/split PDF files
  • Create slide decks from HTML or programmatically rearrange slides and media
  • Convert between DOCX/PPTX/PDF and produce thumbnails for validation
  • Run OCR on scanned PDFs to recover selectable text

Best practices

  • Prefer library APIs for common operations (pdfplumber, pypdf, reportlab, python-docx) to avoid fragile XML edits
  • Use OOXML unpack/edit/pack only for changes not supported by high-level libraries (tracked change XML or custom slide XML tweaks)
  • Keep backups and validate repacked files against originals before distribution
  • Use web-safe fonts and limited palettes for consistent presentation rendering across machines
  • Automate verification with provided scripts (thumbnail generation, OOXML validation) to catch packaging issues

Example use cases

  • Convert a batch of .docx reports to markdown for CMS import using pandoc
  • Merge multiple PDFs into a single deliverable and split pages for per-chapter distribution
  • Programmatically create a branded slide deck from HTML templates and validate with thumbnails
  • Inject reviewer tracked changes directly into document XML for large automated edits
  • Run OCR on scanned meeting notes and export clean text for search indexing

FAQ

Can I preserve tracked changes when converting .docx to markdown?

Yes — use pandoc with --track-changes=all to render tracked changes into the converted output.

When should I edit OOXML directly instead of using a library?

Edit OOXML directly only when you need features unsupported by libraries, such as precise tracked-change manipulation, custom slide XML edits, or fine-grained packaging control; always validate and keep backups.