Files

13 KiB

PDF Tools - Code Structure Summary

Overview

This is a ComfyUI custom node package containing downloader nodes and PDF/image processing nodes. Despite the "PDF_tools" name, it's evolved into a comprehensive media download and processing toolkit.

Directory Structure

PDF_tools/
├── __init__.py                    # Main entry point - loads all nodes
├── requirements.txt               # Python dependencies
├── INSTALLATION_GUIDE.md          # Setup instructions (NEW)
│
├── nodes/                         # ComfyUI node implementations
│   ├── gallery_dl_downloader.py   # Download from 100+ websites (Instagram, Reddit, etc.)
│   ├── yt_dlp_downloader.py       # Video/audio downloader (YouTube, TikTok, etc.)
│   ├── pdf_extractor_v08.py       # Latest PDF extraction node (MAIN VERSION)
│   ├── pdf_extractor_v07.py       # Previous version
│   ├── enhanced_layout_parser_v06.py  # Layout analysis node (MAIN VERSION)
│   ├── eric_rectangle_detector_node.py  # Rectangle detection node
│   └── [older versions]           # v01-v06 versions for reference
│
├── florence2_scripts/             # Florence2 AI vision model integration
│   ├── florence2_detector.py      # Main detector (based on kijai's implementation)
│   ├── modeling_florence2.py      # Florence2 model definition
│   ├── modern_image_enhancer.py   # Image enhancement utilities
│   └── [test/demo scripts]        # Various test and demo files
│
├── sam2_scripts/                  # SAM2 (Segment Anything 2) integration
│   ├── sam2_florence_segmentation.py  # Combined SAM2+Florence2
│   ├── sam2_integration.py        # SAM2 wrapper
│   └── [other scripts]
│
├── configs/                       # Configuration files
│   ├── auth_config.json           # Authentication for various sites
│   ├── instagram_cookies.json     # Cookie storage
│   ├── gallery-dl*.conf           # Gallery-dl configurations
│   └── yt-dlp*.conf              # Yt-dlp configurations
│
├── Docs/                          # Documentation and guides
│   ├── gallery_dl_node_complete_guide.md    # Gallery-dl setup guide
│   ├── yt_dlp_node_complete_guide.md        # Yt-dlp setup guide
│   ├── SETUP_COMPLETE.md          # Authentication setup
│   ├── test_*.py                  # Test scripts for various features
│   └── [various guides]           # Implementation guides
│
├── oldfiles/                      # Deprecated/backup files
├── test-*/                        # Test output directories
└── [other directories]            # History, cache, etc.

Main Components

Purpose: Download media from 100+ websites
Key Features:

  • URL list or URL file input
  • Browser cookie support (Chrome, Firefox, etc.)
  • Exported cookie file support
  • Download archive (SQLite) to avoid duplicates
  • Automatic file organization (images/videos/audio/other)
  • Video filtering
  • Metadata extraction
  • Rate limiting and retry logic
  • Instagram-specific optimizations

Main Class: GalleryDLDownloader Key Methods:

  • _build_command() - Constructs gallery-dl command
  • _convert_cookie_file() - Converts cookie formats
  • _organize_downloaded_files() - Sorts files by type
  • download() - Main download execution

External Dependencies:

  • gallery-dl command-line tool
  • browser-cookie3 for browser cookie extraction

2. Yt-dlp Downloader (nodes/yt_dlp_downloader.py)

Purpose: Download videos and audio from 1000+ sites
Key Features:

  • URL list or batch file input
  • Format selection (quality presets)
  • Audio extraction (MP3, FLAC, etc.)
  • Subtitle download and embedding
  • Playlist support
  • Rate limiting
  • Cookie support
  • File organization

Main Class: YtDlpDownloader Key Methods:

  • _build_command() - Constructs yt-dlp command
  • _organize_downloaded_files() - Sorts files by type
  • download() - Main download execution

External Dependencies:

  • yt-dlp command-line tool
  • ffmpeg for audio/video processing

3. PDF Extractor v08 (nodes/pdf_extractor_v08.py)

Purpose: Extract images and text from PDFs
Key Features:

  • Page extraction as images
  • Quality assessment
  • Spread detection (book scanning)
  • OCR integration
  • Metadata preservation
  • Multiple output formats

Main Classes:

  • PDFExtractorV08Node - Main ComfyUI node
  • PDFProcessor - Core PDF processing logic

Dependencies:

  • PyMuPDF (fitz) for PDF reading
  • PyPDF2 as fallback
  • Florence2 for image analysis

4. Florence2 Detector (florence2_scripts/florence2_detector.py)

Purpose: AI-powered vision model for image analysis
Key Features:

  • Rectangle detection
  • Object detection
  • Caption generation
  • Visual question answering

Main Classes:

  • Florence2RectangleDetector - Main detector
  • BoundingBox - Bounding box data structure

Based on: kijai's ComfyUI-Florence2 implementation

Dependencies:

  • transformers library
  • safetensors
  • Florence2 models from Hugging Face

5. Enhanced Layout Parser v06 (nodes/enhanced_layout_parser_v06.py)

Purpose: Document layout analysis
Key Features:

  • Text block detection
  • Figure/table detection
  • Multi-engine OCR support
  • Computer vision-based analysis

Dependencies:

  • opencv-python
  • Optional: Surya OCR, LayoutLMv3

Architecture Patterns

Node Loading System

The __init__.py dynamically loads all nodes from the nodes/ directory:

  1. Scans nodes/ for .py files
  2. Imports each module
  3. Extracts NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS
  4. Registers with ComfyUI

Downloader Pattern

Both gallery-dl and yt-dlp nodes follow the same pattern:

  1. Command Building - Construct CLI command with all options
  2. Subprocess Execution - Run external tool via subprocess
  3. Output Parsing - Parse stdout/stderr for status
  4. File Organization - Move downloaded files into organized folders
  5. Status Reporting - Return summary with file counts and errors

Error Handling

All nodes use extensive try-except blocks with:

  • Graceful fallbacks (e.g., PyMuPDF → PyPDF2)
  • Detailed debug output
  • Status reporting to user
  • Optional strict error mode

Memory Management

AI model nodes (Florence2, SAM2) include:

  • GPU memory checking
  • Model offloading to CPU
  • Batch size management
  • CUDA cache clearing

Key Design Decisions

1. External Command-Line Tools

Why: Gallery-dl and yt-dlp are mature, well-maintained tools with extensive site support. Wrapping them provides instant access to 1000+ sites without reimplementing complex protocols.

Trade-offs:

  • ✅ Comprehensive site support
  • ✅ Active maintenance
  • ❌ Subprocess overhead
  • ❌ Error parsing complexity

2. File Organization Within Profile Directories

Why: Preserves gallery-dl's original directory structure while organizing by file type.

Implementation: Files are moved into subdirectories (images/, videos/, audio/, other/) within each profile/site directory.

Why: Many sites (Instagram, Reddit) require authentication for full access.

Implementation:

  • Browser cookie extraction via browser-cookie3
  • Exported cookie file support (JSON/Netscape format)
  • Automatic cookie format conversion

Challenges:

  • Chrome requires admin privileges on Windows
  • Cookie expiration handling
  • Site-specific cookie formats

4. Modular AI Model Integration

Why: Allow optional AI features without forcing all dependencies.

Implementation:

  • Try-except imports for optional models
  • Graceful degradation when models unavailable
  • Lazy loading of heavy models

Configuration System

Config Files (configs/)

  • auth_config.json - Site credentials and API keys
  • instagram_cookies.json - Cookie storage
  • gallery-dl.conf - Gallery-dl options
  • yt-dlp.conf - Yt-dlp options

Runtime Configuration

Nodes accept configuration via:

  1. Node parameters (primary)
  2. Config files (secondary)
  3. Environment variables (some cases)

Priority: Node params > Config file > Defaults

Testing Strategy

Test Scripts (Docs/test_*.py)

  • test_instagram_optimal_setup.py - Instagram download test
  • test_file_sorting.py - File organization test
  • test_gallery_dl_node.py - Gallery-dl integration test
  • test_yt_dlp_node.py - Yt-dlp integration test
  • And many more...

Test Pattern

# 1. Setup test environment
# 2. Create node instance
# 3. Run with test data
# 4. Verify output
# 5. Cleanup

Dependencies Summary

Core (Required)

  • Pillow - Image processing
  • numpy - Array operations
  • PyMuPDF - PDF reading
  • opencv-python - Computer vision

AI/ML (Optional)

  • torch - Deep learning (from ComfyUI)
  • transformers - Hugging Face models
  • safetensors - Model format
  • timm - Vision models

Downloaders (Optional)

  • gallery-dl - Web media downloader
  • yt-dlp - Video downloader
  • browser-cookie3 - Cookie extraction

Utilities

  • requests - HTTP requests
  • tqdm - Progress bars
  • colorama - Terminal colors

Performance Considerations

Memory Usage

  • Florence2: ~2-4GB VRAM
  • SAM2: ~4-8GB VRAM
  • PDF Processing: Depends on PDF size
  • Downloads: Minimal (streaming)

Optimization Strategies

  1. Model Offloading - Move models to CPU when not in use
  2. Batch Processing - Process multiple items together
  3. Caching - Cache model outputs
  4. Streaming Downloads - Don't load entire files in memory

Known Issues & Limitations

Reddit API

  • May hang with old credentials
  • 2FA complications
  • Solution: Use browser cookies instead
  • Requires admin privileges on Windows
  • Solution: Use Firefox or export cookies

Instagram Rate Limiting

  • Too many requests can trigger rate limits
  • Solution: Use --sleep parameter (implemented)

Large PDF Files

  • Memory intensive for large PDFs
  • Solution: Process page by page

Future Improvement Areas

  1. Async Downloads - Parallel downloads for better performance
  2. Download Queue - Queue system for batch downloads
  3. Better Error Recovery - Automatic retry with backoff
  4. Model Caching - Better model management
  5. UI Improvements - Progress bars in ComfyUI
  6. Database Integration - Track all downloads in database
  7. Webhook Support - Notify on completion

How to Extend

Adding a New Downloader Node

  1. Create new file in nodes/
  2. Implement node class with required methods
  3. Add NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS
  4. Test with various URLs
  5. Document in Docs/

Adding a New PDF Feature

  1. Extend PDFProcessor class
  2. Add new parameters to node
  3. Update _build_command() or processing logic
  4. Test with various PDFs
  5. Update documentation

Adding a New AI Model

  1. Create new script in florence2_scripts/ or sam2_scripts/
  2. Implement model loading and inference
  3. Add memory management
  4. Create node wrapper in nodes/
  5. Test on GPU and CPU
  6. Document model requirements

Code Quality Notes

Good Practices

  • ✅ Extensive error handling
  • ✅ Detailed documentation
  • ✅ Debug output for troubleshooting
  • ✅ Modular design
  • ✅ Graceful degradation

Areas for Improvement

  • ⚠️ Some code duplication between versions
  • ⚠️ Test coverage could be better
  • ⚠️ Some large functions could be split
  • ⚠️ More type hints would help
  • ⚠️ Some hardcoded paths

Security Considerations

  • Cookies stored in JSON files
  • Risk: Plaintext cookie storage
  • Mitigation: Document proper file permissions

Subprocess Execution

  • User input passed to subprocess
  • Risk: Command injection
  • Mitigation: Input validation and sanitization (implemented)

External Commands

  • Relies on external binaries
  • Risk: Malicious binary execution
  • Mitigation: Check binary availability, use known paths

Version History

  • v08 - Current PDF extractor with enhanced features
  • v07 - Added spread detection
  • v06 - Enhanced layout parser
  • Earlier versions in oldfiles/

Contributing Guidelines

If extending this codebase:

  1. Follow existing patterns
  2. Add comprehensive error handling
  3. Include debug output
  4. Test with real data
  5. Document in Docs/
  6. Update requirements.txt if adding dependencies
  7. Keep backward compatibility when possible

Summary

This is a well-structured, feature-rich ComfyUI custom node package that combines:

  • Mature external tools (gallery-dl, yt-dlp)
  • Modern AI models (Florence2, SAM2)
  • Robust error handling
  • Comprehensive documentation

The codebase is production-ready for the download nodes and functional but evolving for the AI model integration. The modular design makes it easy to use only the features you need.