Convert PDF books to EPUB format for e-readers. Use when user asks to convert PDF to EPUB, create an e-book from PDF, make PDF readable on Kindle/phone/tablet, or extract book content from PDF. Handles: chapter detection, image extraction with optimization, footnotes/endnotes with hyperlinks, reading order for multi-column layouts. Validates conversion quality automatically.
Resources
9Install
npx skillscat add koreyba/claude-skill-pdf-to-epub/convert-pdf-to-epub Install via the SkillsCat registry.
PDF to EPUB Converter
Convert PDF documents to high-quality EPUB files with automatic chapter detection, image optimization, and footnote hyperlinking.
Quick Start
# Run conversion (from skill directory)
python -m scripts.convert input.pdf output.epub
# Validate result
python -m scripts.validate input.pdf output.epubWorkflow Overview
The conversion follows a 3-phase process with an optional 4th phase for adaptation:
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ 1. ANALYZE โ โโโบ โ 2. CONVERT โ โโโบ โ 3. VALIDATE โ
โ - PDF structureโ โ - Apply config โ โ - Check qualityโ
โ - Generate cfg โ โ - Build EPUB โ โ - Report issuesโ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ 4. ADAPT โ
โ (if needed) โ
โ - Tune config โ
โ - Modify code โ
โโโโโโโโโโโโโโโโโโโPhase 1: Analyze
Before converting, analyze the PDF to determine the best configuration:
# Open PDF and examine structure
import fitz # pymupdf
doc = fitz.open("input.pdf")
# Check for:
# 1. Number of pages
# 2. Presence of images
# 3. Multi-column layout (compare text block x-coordinates)
# 4. Footnotes/endnotes (numbers in margins or at page bottom)
# 5. Font sizes (for heading detection thresholds)Generate initial config based on analysis:
- Fiction book: Use default
y_sortreading order - Academic paper: Enable
xy_cutfor columns - Magazine: Enable image optimization, use
xy_cut
Ask user to confirm the proposed configuration before proceeding.
Phase 2: Convert
Run the conversion with the generated config:
from conversion.converter import Converter
from conversion.models import ConversionConfig
config = ConversionConfig(
page_ranges=PageRanges(skip=[1, 2], content=(3, -3)),
exclude_regions=ExcludeRegions(top=0.05, bottom=0.05),
reading_order_strategy="y_sort", # or "xy_cut" for columns
image_optimization=ImageOptimizationConfig(enabled=True),
)
converter = Converter(strategy="simple")
result = converter.convert(pdf_path, epub_path, config)
# Check confidence
if result.reading_order_confidence < 0.7:
print("Warning: Low confidence in reading order")Phase 3: Validate
Always validate the conversion result:
from validation.completeness_checker import CompletenessChecker
from validation.order_checker import OrderChecker
# Check text completeness
completeness = CompletenessChecker().check(pdf_text, epub_text)
print(f"Completeness: {completeness.score:.1%}") # Should be > 95%
# Check reading order
order = OrderChecker().check(pdf_chunks, epub_chunks)
print(f"Order score: {order.score:.1%}") # Should be > 80%Quality gates:
- Completeness < 95%: Text is being lost
- Order score < 80%: Reading order is wrong
Phase 4: Adapt (if validation fails)
See Decision Tree below.
Decision Tree: When Things Go Wrong
Validation failed?
โ
โโโบ Text loss > 5%?
โ โโโบ Check exclude_regions (headers/footers being cut?)
โ โ โ Try: exclude_regions.top: 0.03 (reduce from 0.05)
โ โโโบ Check page_ranges (skipping too many pages?)
โ โ โ Try: page_ranges.skip: [] (don't skip any)
โ โโโบ Still failing? โ See reference/troubleshooting.md#text-loss
โ
โโโบ Wrong reading order?
โ โโโบ PDF has columns?
โ โ โ Try: reading_order_strategy: "xy_cut"
โ โโโบ Columns detected but wrong?
โ โ โ Try: multi_column.threshold: 0.3 (more sensitive)
โ โโโบ Still failing? โ See reference/troubleshooting.md#order
โ
โโโบ Headings not detected?
โ โโโบ Headings only slightly larger than body?
โ โ โ Try: heading_detection.font_size_threshold: 1.1
โ โโโบ Custom font patterns?
โ โ โ May need to modify structure_classifier.py (ADAPTABLE)
โ
โโโบ Footnotes not linking?
โ โโโบ Non-standard format (not [1] or (1))?
โ โ โ Add pattern to FootnoteDetector.PATTERNS
โ โโโบ See reference/troubleshooting.md#footnotes
โ
โโโบ Other issue?
โโโบ See reference/troubleshooting.mdThree-Layer Architecture
The codebase is organized into three layers with different modification policies:
Layer 1: FROZEN (Do Not Modify)
These files implement fixed specifications or deterministic algorithms:
| File | Reason |
|---|---|
core/epub_builder.py |
EPUB3 spec is fixed |
core/text_segmenter.py |
Validation depends on identical chunking |
validation/* |
Metrics must be reproducible |
Never modify these files unless there's a fundamental bug.
Layer 2: CONFIGURABLE (Try Config First)
Before changing code, try adjusting configuration:
ConversionConfig:
โโโ page_ranges # Which pages to process
โโโ exclude_regions # Margins to ignore (headers/footers)
โโโ multi_column # Column detection settings
โโโ reading_order_strategy # "y_sort" or "xy_cut"
โโโ heading_detection # Font size thresholds
โโโ footnote_processing # Footnote patterns
โโโ image_optimization # Compression settings
โโโ metadata # Title, author, languageSee reference/config-tuning.md for all parameters.
Layer 3: ADAPTABLE (Can Modify If Config Fails)
These files contain heuristics that may need tuning for specific PDFs:
| File | What You Can Modify |
|---|---|
conversion/strategies/* |
Create new strategy subclass |
detectors/structure_classifier.py |
Heading detection heuristics |
detectors/reading_order/* |
Add custom sorter algorithm |
detectors/footnote_detector.py |
Add new footnote patterns |
See reference/code-adaptation.md for guidelines.
Project Structure
<skill-directory>/
โโโ SKILL.md # This file
โโโ requirements.txt # Python dependencies
โโโ core/ # FROZEN: Core algorithms
โ โโโ epub_builder.py # EPUB3 file creation
โ โโโ pdf_extractor.py # PDF text/image extraction
โ โโโ text_segmenter.py # Deterministic chunking
โ โโโ image_optimizer.py # Image compression
โ
โโโ conversion/ # Main conversion logic
โ โโโ converter.py # Orchestrator
โ โโโ models.py # Data classes & configs
โ โโโ strategies/ # ADAPTABLE: Conversion strategies
โ โ โโโ base_strategy.py # Template method pattern
โ โ โโโ simple_strategy.py
โ โโโ detectors/ # ADAPTABLE: Detection heuristics
โ โโโ structure_classifier.py
โ โโโ reading_order/
โ โโโ footnote_detector.py
โ โโโ endnote_formatter.py
โ
โโโ validation/ # FROZEN: Quality checking
โ โโโ completeness_checker.py
โ โโโ order_checker.py
โ
โโโ scripts/ # CLI entry points
โ โโโ analyze.py
โ โโโ convert.py
โ โโโ validate.py
โ
โโโ reference/ # Documentation
โ โโโ workflow.md
โ โโโ architecture.md
โ โโโ troubleshooting.md
โ โโโ config-tuning.md
โ โโโ code-adaptation.md
โ
โโโ examples/ # Example configurations
โโโ fiction-simple.json
โโโ academic-multicol.json
โโโ magazine-images.jsonExample Configurations
Fiction Book (simple layout)
{
"page_ranges": {"skip": [1, 2], "content": [3, -3]},
"exclude_regions": {"top": 0.05, "bottom": 0.05},
"reading_order_strategy": "y_sort",
"heading_detection": {"font_size_threshold": 1.2}
}Academic Paper (2-column)
{
"page_ranges": {"skip": [1], "content": [2, -1]},
"exclude_regions": {"top": 0.08, "bottom": 0.08},
"reading_order_strategy": "xy_cut",
"multi_column": {"enabled": true, "threshold": 0.4}
}Magazine (images + columns)
{
"reading_order_strategy": "xy_cut",
"multi_column": {"enabled": true, "column_count": 2},
"image_optimization": {
"enabled": true,
"max_width": 800,
"jpeg_quality": 75
}
}Reference Documentation
For detailed information, see:
- Workflow Details - Complete phase-by-phase guide
- Architecture - Three-layer system explanation
- Troubleshooting - Common problems and solutions
- Config Tuning - All configuration parameters
- Code Adaptation - When and how to modify code
Common Commands
# Full conversion with validation (from skill directory)
python -m scripts.convert input.pdf output.epub && \
python -m scripts.validate input.pdf output.epub
# Analyze PDF structure
python -m scripts.analyze input.pdfQuality Metrics
After conversion, always check:
| Metric | Good | Warning | Bad |
|---|---|---|---|
| Text completeness | > 98% | 95-98% | < 95% |
| Reading order | > 90% | 80-90% | < 80% |
| Confidence | > 0.8 | 0.6-0.8 | < 0.6 |
If any metric is in "Warning" or "Bad" range, follow the Decision Tree above.