A command-line tool for batch processing PDF files using Ghostscript with parallel execution. Process multiple PDFs simultaneously while applying compression, PDF/A conversion, or custom Ghostscript options.
- Parallel Processing: Multi-threaded execution for faster batch operations
- Compression: Multiple quality levels (/screen, /ebook, /printer, /prepress, /default)
- PDF/A Conversion: Support for PDF/A-1, PDF/A-2, and PDF/A-3 standards1
- Recursive Search: Process entire directory trees with the
-rflag - Smart File Management: Keep smaller files automatically or always keep new versions
- Error Handling: Configurable error behavior (prompt, skip, or abort)
- Custom Ghostscript Options: Full access to Ghostscript's command-line options
- Progress Tracking: Real-time progress bars for each file being processed
- Flexible Output: Add prefixes/suffixes to output filenames, organize into folders
- Cross-platform: Windows, Linux, and macOS support
- Python 3.12+: Required to run the tool
- Ghostscript: Required for PDF processing. Install from ghostscript.com
pipx install gs-batch-pdfOr using pip:
pip install gs-batch-pdfThe tool is available via two commands: gs_batch or its shorter alias gsb.
gsb [OPTIONS] FILES_OR_DIRECTORIES...or (my preference):
gsb FILES_OR_DIRECTORIES... [OPTIONS]# Compress all PDFs in current directory (default: /ebook quality)
gsb . --compress
# Compress PDFs recursively in a directory tree
gsb ./docs/ -r --compress
# Convert a single PDF to PDF/A-2
gsb file.pdf --pdfa
# Compress and convert to PDF/A with custom output
gsb *.pdf --compress --pdfa --prefix "processed_"Note: When using options that can take optional values (like
--compressor--pdfa), place them after the file arguments for simplest usage, or see Using Options with File Arguments for alternatives.
-
--compress [LEVEL]: Compress PDFs with quality level- Levels:
/screen,/ebook(default),/printer,/prepress,/default - Use without value for
/ebookquality
- Levels:
-
--pdfa [VERSION]: Convert to PDF/A format- Versions:
1(PDF/A-1),2(PDF/A-2, default),3(PDF/A-3) - Use without value for PDF/A-2
- Versions:
-
--options TEXT: Pass arbitrary Ghostscript options- Example:
--options "-dColorImageResolution=100 -dCompatibilityLevel=1.4"
- Example:
-
--prefix TEXT: Add prefix to output filenames- Can include path:
--prefix "output/"creates files in output directory - Relative paths calculated from input file location, not current directory
- Can include path:
-
--suffix TEXT: Add suffix before file extension- Example:
--suffix "_compressed"→file_compressed.pdf
- Example:
-
--keep_smaller/--keep_new: Choose which file to keep (default:--keep_smaller)--keep_smaller: Keep whichever file is smaller (original or processed)--keep_new: Always keep the processed file- Note: PDF/A conversion always keeps new file
-
-f, --force: Allow overwriting original files without confirmation- Required when no prefix specified and files would be overwritten
-
--filter TEXT: Filter files by extension (default:pdf)- Supports comma-separated list:
--filter pdf,png
- Supports comma-separated list:
-
-r, --recursive: Search directories recursively- Without this flag, only processes files in top-level directories
--on-error [MODE]: Control behavior when file processing errors occurprompt(default): Interactively ask user whether to retry, skip, or abortskip: Automatically skip failed files and continue processingabort: Stop processing immediately on first error
--timeout INTEGER: Maximum processing time per file in seconds (default: 300)- Set to
0to disable timeout protection - Prevents indefinite hangs on problematic PDFs
- Set to
--open_path/--no_open_path: Open output location in file manager (default: enabled)-v, --verbose: Show detailed Ghostscript command output--version: Show version information--help: Display help message
When using options that accept optional values (--compress, --pdfa), you have three approaches:
1. Place options after file arguments (recommended):
gsb *.pdf --compress
gsb * --compress --pdfa2. Provide explicit values:
gsb --compress /ebook *.pdf
gsb --pdfa 2 *.pdf3. Use -- separator:
gsb --compress -- *.pdf
gsb --pdfa -- *.pdfCompress multiple PDFs with /ebook quality (in-place)3:
gsb file1.pdf file2.pdf file3.pdf --compressCompress all PDFs in a directory:
gsb . --compressCompress with specific quality level:
gsb document.pdf --compress /screen
# or with explicit value before files:
gsb --compress /screen *.pdfConvert to PDF/A-2 (default):
gsb report.pdf --pdfaConvert to specific PDF/A version:
gsb document.pdf --pdfa 3
# or with explicit value before files:
gsb --pdfa 3 *.pdfCompress and convert to PDF/A:
gsb invoice.pdf --compress --pdfaProcess entire directory tree:
# Find and compress all PDFs in current directory and subdirectories
gsb . -r --compress
# Process specific directory recursively
gsb ./documents/ -r --compress --pdfaProcess with force (no confirmation):
gsb . -r --compress --pdfa --forceAdd prefix to create organized output:
# Add prefix to filenames
gsb *.pdf --prefix "compressed_" --compress
# Create files in subdirectory
gsb *.pdf --prefix "output/" --compress
# Add both prefix and suffix
gsb *.pdf --prefix "processed_" --suffix "_v1" --compressKeep new files regardless of size:
gsb document.pdf --compress --keep_newApply custom Ghostscript settings:
gsb file.pdf --options "-dCompatibilityLevel=1.4 -dColorImageResolution=72"Combine compression with custom options:
gsb report.pdf --compress /printer --options "-dCompatibilityLevel=1.7"Interactive error handling (default):
# Prompts user on each error to retry, skip, or abort
gsb . -r --compressSkip failed files automatically:
# Useful for batch processing where some files may be corrupted
gsb . -r --compress --on-error skipAbort on first error:
# Stops immediately if any file fails (useful for CI/CD)
gsb *.pdf --compress --on-error abortSilent processing for scripts:
gsb *.pdf --compress --force --no_open_pathAutomated batch with error skipping:
# Best for unattended processing
gsb . -r --compress --force --no_open_path --on-error skipVerbose output for debugging:
gsb document.pdf -v --compress --pdfaProcess with custom timeout for large files:
# Set 10 minute timeout for very large PDFs
gsb large-document.pdf --compress --timeout 600
# Disable timeout for files that take a long time
gsb complex-document.pdf --compress --timeout 0After processing completes, gs-batch-pdf displays a detailed summary table:
Processing 3 file(s):
1) document1.pdf
2) document2.pdf
3) document3.pdf
[Progress bars shown during processing...]
# | Original | New | Ratio | Keeping | Filename
1 | 1,234 KB | 856 KB | 69.400% | new | /path/to/document1.pdf
2 | 789 KB | 654 KB | 82.900% | new | /path/to/document2.pdf
3 | 456 KB | 512 KB | 112.300% | original | /path/to/document3.pdf
Total time: 12.34 seconds
The summary shows:
- Original: Size of the input file
- New: Size of the processed file
- Ratio: New size as percentage of original (lower is better for compression)
- Keeping: Which version was kept based on
--keep_smalleror--keep_new - Filename: Absolute path to the output file
By default, the tool opens the output location in your file manager after processing (disable with --no_open_path).
If you get an error about Ghostscript not being found:
- Verify Ghostscript is installed:
gs --version(Linux/macOS) orgswin64c --version(Windows) - Ensure Ghostscript is in your system PATH
- On Windows, you may need to restart your terminal after installation
For PDF/A-2 and PDF/A-3 conversion, ensure you're using Ghostscript 10.04.0 or higher:
gs --versionIf you encounter permission errors when processing files:
- Use
--prefixto write to a different directory - Check file permissions on both input and output locations
- On Windows, ensure files aren't open in another program
If processing is hanging or taking too long:
- The default timeout is 5 minutes (300 seconds) per file
- For large or complex PDFs, increase the timeout:
--timeout 600(10 minutes) - To disable timeout protection:
--timeout 0 - Some corrupted PDFs may cause Ghostscript to hang indefinitely - timeout protection will terminate these processes
Contributions are welcome! Please feel free to:
- Report bugs or request features via GitHub Issues
- Submit Pull Requests for improvements
- Share feedback and suggestions
This project is licensed under the MIT License - see the LICENSE file for details.
This tool is built on top of Ghostscript, released under the GNU Affero General Public License (AGPL). gs-batch-pdf is a CLI wrapper and is independently licensed under MIT.
Footnotes
-
Requires Ghostscript version 10.04.0 or higher for correct PDF/A-2 and PDF/A-3 conversion. ↩
-
pipx installs the package in an isolated virtual environment while making commands globally available. ↩
-
When no
--prefixis provided and files would be overwritten, you'll be prompted for confirmation unless--forceis used. ↩