491 lines
13 KiB
Markdown
491 lines
13 KiB
Markdown
# Batch/Folder Processing Guide
|
||
|
||
## Overview
|
||
|
||
**NEW Feature**: Both Simple PDF Image Extractor and Enhanced PDF Extractor v09 now support **automatic batch processing** of entire folders!
|
||
|
||
Simply provide a **folder path** instead of a file path, and the node will automatically detect and process all PDFs in the folder.
|
||
|
||
## How It Works
|
||
|
||
### Automatic Detection
|
||
|
||
The nodes automatically detect whether you've provided a file or folder path:
|
||
|
||
```python
|
||
# Single PDF (original behavior)
|
||
pdf_path = "C:/Documents/portfolio.pdf"
|
||
→ Extracts images from one PDF
|
||
|
||
# Folder of PDFs (NEW - auto-detected)
|
||
pdf_path = "C:/Documents/portfolios/"
|
||
→ Processes all PDFs in folder
|
||
```
|
||
|
||
**No configuration needed** - just change the path!
|
||
|
||
## Usage in ComfyUI
|
||
|
||
### Step 1: Prepare Your PDFs
|
||
```
|
||
my_portfolios/
|
||
├─ designer1.pdf
|
||
├─ designer2.pdf
|
||
├─ designer3.pdf
|
||
└─ artist_work.pdf
|
||
```
|
||
|
||
### Step 2: Enter Folder Path
|
||
In the node's `pdf_path` parameter, enter the folder path:
|
||
```
|
||
C:/Documents/my_portfolios/
|
||
```
|
||
or
|
||
```
|
||
C:/Documents/my_portfolios
|
||
```
|
||
*(Both work - trailing slash optional)*
|
||
|
||
### Step 3: Run the Node
|
||
The node will:
|
||
1. ✅ Detect it's a folder
|
||
2. 🔍 Find all `.pdf` files
|
||
3. 📊 Report how many PDFs found
|
||
4. 🔄 Process each PDF sequentially
|
||
5. 💾 Save results in organized subfolders
|
||
6. 📄 Create a batch summary JSON
|
||
|
||
## Output Structure
|
||
|
||
### Folder Organization
|
||
```
|
||
output/simple_pdf_extraction/ (or output/pdf_extraction for v09)
|
||
├─ designer1_20251005_120000/
|
||
│ ├─ page_001_image_01.png
|
||
│ ├─ page_001_image_02.png
|
||
│ └─ designer1_all_text.txt
|
||
│
|
||
├─ designer2_20251005_120015/
|
||
│ ├─ page_001_image_01.png
|
||
│ └─ designer2_all_text.txt
|
||
│
|
||
├─ designer3_20251005_120030/
|
||
│ └─ page_001_image_01.png
|
||
│
|
||
└─ batch_summary_20251005_120000.json ← Batch statistics
|
||
```
|
||
|
||
Each PDF gets its own timestamped subfolder, plus a batch summary file.
|
||
|
||
### Batch Summary JSON
|
||
|
||
**Simple Extractor** creates `batch_summary_YYYYMMDD_HHMMSS.json`:
|
||
```json
|
||
{
|
||
"total_pdfs": 4,
|
||
"processed": 3,
|
||
"skipped": 1,
|
||
"total_images": 47,
|
||
"layered_pdfs": 2,
|
||
"total_time_seconds": 15.3,
|
||
"avg_time_per_pdf": 3.8,
|
||
"processing_times": [2.1, 3.4, 5.2, 4.6],
|
||
"results": [
|
||
{
|
||
"pdf": "designer1.pdf",
|
||
"images": 12,
|
||
"has_layers": true,
|
||
"status": "processed"
|
||
},
|
||
{
|
||
"pdf": "designer2.pdf",
|
||
"images": 0,
|
||
"has_layers": false,
|
||
"status": "skipped"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**v09** creates `batch_summary_v09_YYYYMMDD_HHMMSS.json`:
|
||
```json
|
||
{
|
||
"total_pdfs": 4,
|
||
"processed": 3,
|
||
"skipped": 1,
|
||
"total_images": 47,
|
||
"total_enhanced": 45,
|
||
"layered_pdfs": 2,
|
||
"total_time_seconds": 480.5,
|
||
"avg_time_per_pdf": 120.1,
|
||
"processing_times": [95.2, 180.4, 120.3, 84.6],
|
||
"results": [
|
||
{
|
||
"pdf": "designer1.pdf",
|
||
"images": 12,
|
||
"enhanced": 12,
|
||
"has_layers": true,
|
||
"time": 95.2,
|
||
"status": "processed"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Console Output
|
||
|
||
### Simple Extractor (Batch Mode)
|
||
```
|
||
🗂️ BATCH MODE: Processing folder
|
||
📁 Folder: C:/Documents/my_portfolios
|
||
🔍 Searching for PDF files...
|
||
📚 Found 4 PDF files
|
||
🏃 Mode: All PDFs
|
||
============================================================
|
||
|
||
[1/4] Processing: designer1.pdf
|
||
------------------------------------------------------------
|
||
🚀 Simple PDF Image Extractor (Layer-Aware)
|
||
📄 PDF: C:/Documents/my_portfolios/designer1.pdf
|
||
✨ PDF has 2 layers!
|
||
📋 Layer: 'Images' (ON)
|
||
📋 Layer: 'Text' (ON)
|
||
🚀 Using super-fast layer-based extraction
|
||
📖 Processing 8 pages...
|
||
📄 Page 1: 2 images
|
||
✅ Extracted: 2000×1500 → page_001_image_01.png
|
||
[... extraction continues ...]
|
||
|
||
[2/4] Processing: designer2.pdf
|
||
------------------------------------------------------------
|
||
[... continues for all PDFs ...]
|
||
|
||
============================================================
|
||
✅ Batch Extraction Complete
|
||
📁 Folder: my_portfolios
|
||
📚 Total PDFs: 4
|
||
✅ Processed: 3
|
||
⏭️ Skipped: 1
|
||
🖼️ Total images: 47
|
||
✨ Layered PDFs: 2
|
||
⏱️ Total time: 15.3s
|
||
📊 Avg per PDF: 3.8s
|
||
📄 Summary: output/simple_pdf_extraction/batch_summary_20251005_120000.json
|
||
============================================================
|
||
```
|
||
|
||
### v09 (Batch Mode)
|
||
```
|
||
🗂️ BATCH MODE: Enhanced PDF Extractor v09
|
||
📁 Folder: C:/Documents/my_portfolios
|
||
🔍 Searching for PDF files...
|
||
📚 Found 4 PDF files
|
||
🏃 Mode: All PDFs
|
||
============================================================
|
||
|
||
============================================================
|
||
[1/4] Processing: designer1.pdf
|
||
============================================================
|
||
🚀 Enhanced PDF Extractor v09 - Layer Detection + Analysis Engine
|
||
🔍 Enhanced PDF Extraction Started:
|
||
📄 PDF: C:/Documents/my_portfolios/designer1.pdf
|
||
[... full v09 extraction process ...]
|
||
|
||
[2/4] Processing: designer2.pdf
|
||
[... continues ...]
|
||
|
||
============================================================
|
||
✅ Batch Extraction Complete (v09)
|
||
📁 Folder: my_portfolios
|
||
📚 Total PDFs: 4
|
||
✅ Processed: 3
|
||
⏭️ Skipped: 1
|
||
🖼️ Total images: 47
|
||
✨ Enhanced: 45
|
||
📋 Layered PDFs: 2
|
||
⏱️ Total time: 480.5s
|
||
📊 Avg per PDF: 120.1s
|
||
📄 Summary: output/pdf_extraction/batch_summary_v09_20251005_120000.json
|
||
============================================================
|
||
```
|
||
|
||
## Return Values (Batch Mode)
|
||
|
||
### Simple Extractor
|
||
```python
|
||
images, summary, image_count, has_layers = node.extract_images(folder_path, ...)
|
||
|
||
# images: Combined tensor of ALL images from ALL PDFs
|
||
# summary: Batch summary text (see example above)
|
||
# image_count: Total images from all PDFs
|
||
# has_layers: True if ANY PDF had layers
|
||
```
|
||
|
||
### v09
|
||
```python
|
||
extracted, enhanced, analysis, text, stats, output_path, has_layers = node.extract_enhanced(folder_path, ...)
|
||
|
||
# extracted: List of all extracted images from all PDFs
|
||
# enhanced: List of all enhanced images
|
||
# analysis: List of all page analyses
|
||
# text: Combined text from all PDFs
|
||
# stats: Batch statistics dict
|
||
# output_path: Base output directory
|
||
# has_layers: True if ANY PDF had layers
|
||
```
|
||
|
||
## Features in Batch Mode
|
||
|
||
### Works With All Parameters
|
||
All node parameters work identically in batch mode:
|
||
|
||
**Simple Extractor:**
|
||
- `min_width`, `min_height` - Applied to all PDFs
|
||
- `extract_text` - Text extracted from all PDFs
|
||
- `layers_only_mode` - Skips non-layered PDFs across entire batch
|
||
- `dpi` - Used for all PDFs
|
||
|
||
**v09:**
|
||
- All v09 parameters apply to entire batch
|
||
- `join_spreads`, `enable_image_enhancement`, etc.
|
||
- Each PDF gets full v09 treatment
|
||
|
||
### Layers-Only Mode in Batch
|
||
|
||
Perfect for filtering layered PDFs only:
|
||
|
||
```python
|
||
# Only process PDFs with layers, skip the rest
|
||
layers_only_mode = True
|
||
|
||
# Result: Non-layered PDFs show "skipped" status in batch summary
|
||
```
|
||
|
||
**Console output:**
|
||
```
|
||
[1/4] Processing: layered_portfolio.pdf
|
||
✨ PDF has 2 layers!
|
||
🚀 Using super-fast layer-based extraction
|
||
[... extraction ...]
|
||
|
||
[2/4] Processing: scanned_doc.pdf
|
||
📄 No layers detected - using standard extraction
|
||
⚠️ Layers-only mode enabled, but PDF has no layers. Skipping extraction.
|
||
|
||
[... continues ...]
|
||
|
||
Processed: 2 (only layered PDFs)
|
||
Skipped: 2 (non-layered PDFs)
|
||
```
|
||
|
||
### Error Handling
|
||
|
||
If a PDF fails to process:
|
||
- ❌ Error logged to console
|
||
- ⏭️ Batch continues with next PDF
|
||
- 📊 Error recorded in batch summary
|
||
- ✅ Other PDFs process normally
|
||
|
||
**Batch summary for failed PDF:**
|
||
```json
|
||
{
|
||
"pdf": "corrupted.pdf",
|
||
"images": 0,
|
||
"enhanced": 0,
|
||
"has_layers": false,
|
||
"status": "error",
|
||
"error": "PDF file is corrupted or encrypted"
|
||
}
|
||
```
|
||
|
||
## Performance
|
||
|
||
### Simple Extractor Batch Performance
|
||
|
||
**Layered PDFs (best case):**
|
||
- Per PDF: 2-5 seconds
|
||
- 10 PDFs: ~30 seconds
|
||
- 50 PDFs: ~150 seconds (2.5 minutes)
|
||
|
||
**Non-layered PDFs:**
|
||
- Per PDF: 5-10 seconds
|
||
- 10 PDFs: ~75 seconds
|
||
- 50 PDFs: ~500 seconds (8 minutes)
|
||
|
||
### v09 Batch Performance
|
||
|
||
**Layered PDFs (with layer detection):**
|
||
- Per PDF: 2-5 seconds (layer extraction)
|
||
- Plus AI analysis if needed: +30-120 seconds
|
||
|
||
**Non-layered PDFs (full AI analysis):**
|
||
- Per PDF: 50-250 seconds depending on pages
|
||
- 10 PDFs: 500-2500 seconds (8-42 minutes)
|
||
- Consider using Simple Extractor for large batches
|
||
|
||
### Performance Tips
|
||
|
||
1. **Use Simple Extractor for large batches** - Much faster if you don't need v09 features
|
||
2. **Enable layers_only_mode** if you only care about layered PDFs
|
||
3. **Check batch summary** to identify slow PDFs
|
||
4. **Process small batches first** to estimate total time
|
||
|
||
## Use Cases
|
||
|
||
### Portfolio Screening
|
||
```
|
||
Input: Folder with 20 portfolio PDFs
|
||
Mode: Simple Extractor with layers_only_mode=True
|
||
Result: Only extracts from professional layered portfolios
|
||
Time: 1-2 minutes
|
||
```
|
||
|
||
### Magazine Archive Digitization
|
||
```
|
||
Input: Folder with 100 magazine PDFs
|
||
Mode: Simple Extractor (standard)
|
||
Result: All images extracted from all magazines
|
||
Time: 10-15 minutes for layered, 1-2 hours for non-layered
|
||
```
|
||
|
||
### Client Project Assets
|
||
```
|
||
Input: Folder with mixed project PDFs
|
||
Mode: v09 with full analysis
|
||
Result: Enhanced images with layout analysis
|
||
Time: Varies by PDF complexity
|
||
```
|
||
|
||
### Quality Control
|
||
```
|
||
Input: Folder with new submissions
|
||
Mode: Simple Extractor
|
||
Result: Quick preview of all images
|
||
Review: Check batch_summary.json for statistics
|
||
```
|
||
|
||
## Comparison: Single vs Batch
|
||
|
||
| Feature | Single PDF Mode | Batch/Folder Mode |
|
||
|---------|----------------|-------------------|
|
||
| Input | File path | Folder path |
|
||
| Detection | N/A | Automatic |
|
||
| Output | One subfolder | Multiple subfolders |
|
||
| Summary | Text summary | JSON + Text summary |
|
||
| Statistics | Per-PDF stats | Aggregate + per-PDF stats |
|
||
| Return Values | Single PDF results | Combined results |
|
||
| Progress | Single progress | Per-PDF progress |
|
||
| Error Handling | Fails immediately | Continues on error |
|
||
|
||
## Tips & Best Practices
|
||
|
||
### 1. Organize Your PDFs First
|
||
Put all PDFs you want to process in one folder. Node only processes PDFs in the root folder (doesn't search subfolders).
|
||
|
||
### 2. Check Batch Summary
|
||
The JSON file contains detailed statistics:
|
||
- Which PDFs were processed successfully
|
||
- Which were skipped (and why)
|
||
- Processing time per PDF
|
||
- Total images found
|
||
- Layer detection results
|
||
|
||
### 3. Use Appropriate Node
|
||
- **Simple Extractor**: Fast, simple extraction, great for batches
|
||
- **v09**: Slow but thorough, use for smaller batches or when you need advanced features
|
||
|
||
### 4. Monitor Console Output
|
||
Watch for:
|
||
- PDFs being skipped (layers_only_mode)
|
||
- Errors processing specific files
|
||
- Layer detection results
|
||
- Processing time per PDF
|
||
|
||
### 5. Test First
|
||
Before processing 100 PDFs, test with 2-3 PDFs first to:
|
||
- Verify settings
|
||
- Check output quality
|
||
- Estimate total processing time
|
||
|
||
## Troubleshooting
|
||
|
||
**Q: "No images extracted from batch"**
|
||
- Check if PDFs actually have images
|
||
- Look at batch summary JSON to see per-PDF results
|
||
- Try single PDF mode on one file to debug
|
||
|
||
**Q: "Batch taking forever"**
|
||
- v09 is slow for large batches - use Simple Extractor
|
||
- Check if PDFs have layers (faster processing)
|
||
- Consider enabling layers_only_mode to skip slow PDFs
|
||
|
||
**Q: "Some PDFs skipped"**
|
||
- Check batch summary JSON for skip reasons
|
||
- If layers_only_mode=True, non-layered PDFs are skipped
|
||
- Errors logged in console and summary
|
||
|
||
**Q: "Can I process subfolders?"**
|
||
- Not currently - only PDFs in the root folder are processed
|
||
- Move all PDFs to a single folder first
|
||
|
||
**Q: "How to cancel batch?"**
|
||
- Stop ComfyUI execution (standard cancel)
|
||
- Already processed PDFs will remain in output folder
|
||
- Partial results are saved
|
||
|
||
## Examples
|
||
|
||
### Example 1: Quick Portfolio Review
|
||
```python
|
||
# In ComfyUI node:
|
||
pdf_path = "C:/Submissions/portfolios/"
|
||
output_directory = "output/portfolio_review"
|
||
min_width = 200
|
||
min_height = 200
|
||
extract_text = False
|
||
layers_only_mode = True # Only layered portfolios
|
||
|
||
# Result: Fast extraction of professional work only
|
||
```
|
||
|
||
### Example 2: Archive All Magazine Images
|
||
```python
|
||
# In ComfyUI node:
|
||
pdf_path = "C:/Archives/magazines_2024/"
|
||
output_directory = "output/magazine_archive"
|
||
min_width = 100
|
||
min_height = 100
|
||
extract_text = True
|
||
layers_only_mode = False # Get everything
|
||
|
||
# Result: All images + text from all magazines
|
||
```
|
||
|
||
### Example 3: Quality Analysis with v09
|
||
```python
|
||
# In ComfyUI node (v09):
|
||
pdf_path = "C:/Client/deliverables/"
|
||
output_directory = "output/client_analysis"
|
||
enable_image_enhancement = True
|
||
join_spreads = True
|
||
debug_mode = True
|
||
|
||
# Result: Full analysis with enhanced images
|
||
# Warning: Will be slow for many PDFs
|
||
```
|
||
|
||
## Summary
|
||
|
||
✅ **Auto-detection**: Just provide folder path, node handles the rest
|
||
✅ **Organized output**: Each PDF gets its own subfolder + batch summary
|
||
✅ **Statistics**: Detailed JSON with per-PDF and aggregate stats
|
||
✅ **Error resilient**: Continues processing even if one PDF fails
|
||
✅ **All features work**: Every parameter works in batch mode
|
||
✅ **Performance aware**: Simple Extractor recommended for large batches
|
||
|
||
**Getting Started:**
|
||
1. Put PDFs in a folder
|
||
2. Enter folder path in node
|
||
3. Run - node auto-detects and processes all PDFs
|
||
4. Check batch_summary.json for results
|