DimonSmart.PdfCropper
1.0.13
Prefix Reserved
See the version list below for details.
dotnet add package DimonSmart.PdfCropper --version 1.0.13
NuGet\Install-Package DimonSmart.PdfCropper -Version 1.0.13
<PackageReference Include="DimonSmart.PdfCropper" Version="1.0.13" />
<PackageVersion Include="DimonSmart.PdfCropper" Version="1.0.13" />
<PackageReference Include="DimonSmart.PdfCropper" />
paket add DimonSmart.PdfCropper --version 1.0.13
#r "nuget: DimonSmart.PdfCropper, 1.0.13"
#:package DimonSmart.PdfCropper@1.0.13
#addin nuget:?package=DimonSmart.PdfCropper&version=1.0.13
#tool nuget:?package=DimonSmart.PdfCropper&version=1.0.13
DimonSmart.PdfCropper
DimonSmart.PdfCropper is a cross-platform .NET library that intelligently trims PDF pages to actual content using two different methods.
The library exposes a simple API through PdfSmartCropper.CropAsync, which accepts a PDF document in memory and returns a new PDF with recalculated CropBox and TrimBox on every non-empty page.
Example
Here's a visual example of what PdfCropper does - it removes unnecessary margins and whitespace:
| Before Cropping | After Cropping |
|---|---|
![]() |
![]() |
Example pages from "Pragmatic Type-Level Design" by Alexander Granin
The CLI utility is particularly useful for reading e-books with minimal margins, making them more comfortable to read on tablets and e-readers by removing excessive whitespace around the content.
Download the CLI
Need the tool without compiling it yourself? Grab the latest self-contained Windows build here:
- PdfCropper.Cli-win-x64.exe – portable single-file executable that works on any 64-bit Windows machine.
Each tagged release also contains the NuGet package and the CLI executable as downloadable assets.
Platform Support
✅ Windows - Full support
✅ Linux - Full support
✅ macOS - Full support
✅ Other Unix systems - Compatible with .NET runtime
Target Frameworks: .NET 8.0, .NET 9.0
Installation
Install the package via NuGet:
dotnet add package DimonSmart.PdfCropper
Or via Package Manager Console:
Install-Package DimonSmart.PdfCropper
Features
- Two cropping methods:
- ContentBased (default): Analyzes PDF content (text, vectors, images) directly - fast and preserves quality
- BitmapBased: Renders pages to images and analyzes pixels - more accurate for complex layouts
- Preserves the existing content streams, metadata, fonts and resources
- Leaves empty pages untouched and keeps
MediaBox,BleedBoxandArtBoxintact - Handles rotated pages and maintains deterministic output
- Extensible logging through
IPdfCropLoggerinterface - Built on top of iText 9.3 and PDFium (for bitmap rendering)
Usage
Minimal crop (three lines)
using DimonSmart.PdfCropper;
byte[] cropped = await PdfSmartCropper.CropAsync(inputBytes);
The default call uses the ContentBased method, keeps a 0.5pt safety margin, and does not touch document metadata.
Aggressive crop with all clean-up switches
using DimonSmart.PdfCropper;
var profile = PdfCropProfiles.Aggressive;
byte[] cropped = await PdfSmartCropper.CropAsync(
inputBytes,
profile.CropSettings,
optimizationSettings: profile.OptimizationSettings,
logger: null);
The aggressive preset removes edge-touching artefacts, applies maximum Deflate compression, enables smart mode, removes unused objects and metadata, clears document info, and strips embedded standard fonts.
Built-in presets
The library ships with ready-to-use profiles for common scenarios:
| Key | Description | Crop settings | Optimization settings |
|---|---|---|---|
simple |
Default behaviour for quick cropping. | Content-based, keeps edge content, 0.5pt margin. | No extra optimisation (same as PdfOptimizationSettings.Default). |
ebook |
Recommended for reading PDFs on e-readers. | Content-based, ignores artefacts that touch the page edge, 1pt margin. | Default optimisation. |
aggressive |
Tight crop plus the strongest clean-up and compression. | Content-based, ignores edge artefacts, 0.25pt margin. | Full compression, smart mode, unused-object removal, metadata cleanup, PDF 1.7 target. |
Retrieve a profile via PdfCropProfiles.Simple, PdfCropProfiles.Ebook, or PdfCropProfiles.Aggressive. You can also resolve a profile dynamically by key: PdfCropProfiles.TryGet("ebook", out var profile).
Custom logger
using DimonSmart.PdfCropper;
public sealed class MyLogger : IPdfCropLogger
{
public void LogInfo(string message) => Console.WriteLine($"[INFO] {message}");
public void LogWarning(string message) => Console.WriteLine($"[WARN] {message}");
public void LogError(string message) => Console.Error.WriteLine($"[ERROR] {message}");
}
var logger = new MyLogger();
byte[] cropped = await PdfSmartCropper.CropAsync(inputBytes, CropMethod.ContentBased, logger);
Every overload throws PdfCropException with a PdfCropErrorCode when the input PDF is invalid, encrypted, or fails to process.
Command Line Utility
The repository includes a console application that wraps the library. This CLI tool is especially useful for preparing e-books and documents for comfortable reading on tablets and e-readers by removing excessive margins and whitespace.
Perfect for e-book readers: Transform PDF books with large margins into reader-friendly versions that utilize screen space more efficiently.
# Run the ready-made Windows build (download link above)
PdfCropper.Cli-win-x64.exe input.pdf output.pdf
# Use the e-book preset (ignores edge artefacts, keeps 1pt margin)
PdfCropper.Cli-win-x64.exe input.pdf output.pdf --preset ebook
# Apply the aggressive preset with verbose logging
PdfCropper.Cli-win-x64.exe input.pdf output.pdf --preset aggressive -v
# From source (cross-platform)
dotnet run --project src/DimonSmart.PdfCropper.Cli/DimonSmart.PdfCropper.Cli.csproj -- input.pdf output.pdf --preset simple
CLI Options
--preset <simple|ebook|aggressive>- Apply a predefined set of crop/optimisation options-m, --method <0|1>- Cropping method:0= ContentBased (default, analyzes PDF content)1= BitmapBased (renders to image, slower but more accurate)
-v, --verbose- Enable verbose logging- All low-level switches (
--margin,--compression-level,--smart, etc.) remain available to fine-tune or override a preset
Cropping Methods Comparison
| Feature | ContentBased | BitmapBased |
|---|---|---|
| Speed | ⚡ Fast | 🐌 Slower |
| Quality | ✅ Preserves vector quality | ✅ Preserves vector quality |
| Accuracy | Good for standard documents | Better for complex layouts |
| Use case | Most PDFs | PDFs with complex graphics |
Development
- Library target frameworks:
.NET 8.0,.NET 9.0 - Cross-platform support: Windows, Linux, macOS, and other Unix systems
- Dependencies:
- iText 9.3.0 (PDF manipulation)
- PDFtoImage 5.1.1 (PDF to bitmap rendering) - includes native libraries for all platforms
- SkiaSharp (image processing) - cross-platform 2D graphics
- Tests are located in
tests/PdfCropper.Testsand use xUnit - Build with
dotnet build PdfCropper.sln - Run tests with
dotnet test PdfCropper.sln - CI/CD: Automated builds and tests via GitHub Actions - see GitHub Actions Setup
Platform-Specific Notes
- Linux: Requires
libfontconfig1andlibgdiplusfor optimal PDF rendering - macOS: No additional dependencies required
- Windows: No additional dependencies required
API Reference
IPdfCropLogger Interface
public interface IPdfCropLogger
{
void LogInfo(string message);
void LogWarning(string message);
void LogError(string message);
}
CropMethod Enum
public enum CropMethod
{
ContentBased = 0, // Analyzes PDF content
BitmapBased = 1 // Renders to bitmap
}
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- itext (>= 8.0.0)
- itext.bouncy-castle-adapter (>= 8.0.0)
- PDFtoImage (>= 4.0.0)
-
net9.0
- itext (>= 8.0.0)
- itext.bouncy-castle-adapter (>= 8.0.0)
- PDFtoImage (>= 4.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.6.0 | 195 | 10/23/2025 |
| 1.5.0 | 160 | 10/22/2025 |
| 1.4.0 | 171 | 10/22/2025 |
| 1.3.0 | 173 | 10/22/2025 |
| 1.2.1 | 156 | 10/21/2025 |
| 1.2.0 | 157 | 10/21/2025 |
| 1.1.2 | 193 | 10/20/2025 |
| 1.1.1 | 160 | 10/20/2025 |
| 1.1.0 | 159 | 10/20/2025 |
| 1.0.14 | 169 | 10/20/2025 |
| 1.0.13 | 106 | 10/18/2025 |
| 1.0.12 | 97 | 10/18/2025 |
| 1.0.11 | 83 | 10/17/2025 |
| 1.0.10 | 110 | 10/17/2025 |
| 1.0.9 | 120 | 10/17/2025 |
| 1.0.7 | 136 | 10/17/2025 |
| 1.0.6 | 159 | 10/16/2025 |
| 1.0.5 | 159 | 10/16/2025 |

