A development team evaluates BitMiracle Docotic.PDF for a document generation project. The documentation looks comprehensive, the API clean, and the GitHub samples plentiful. They install the core package and start building. Three hours in, they discover they need HTML-to-PDF conversion. The documentation mentions an HtmlToPdf add-on, so they install it. Then they hit the critical discovery: Docotic.PDF requires a license key to function—even in development. Without a valid license, every operation returns an error. The free 31-day trial requires providing contact information to receive a key via email.
This checklist discovery—core library ✓, add-on package ✓, license configuration ✗—surfaces a pattern with Docotic.PDF: comprehensive feature list, modular architecture, but operational complexity in the details.
Understanding IronPDF
IronPDF consolidates HTML-to-PDF conversion in a single package with optional trial licensing. Where Docotic.PDF separates core PDF manipulation from HTML rendering via add-ons, IronPDF integrates both. The architectural choice affects both simplicity and specialization: IronPDF focuses deeply on HTML rendering quality, Docotic.PDF offers broader PDF manipulation features with HTML as one input method among many.
The ChromePdfRenderer class works without configuration for development and testing, adding a watermark until licensed. Docotic.PDF won't execute any PDF operations without a valid license key, including trial keys that must be requested.
Key Limitations of Docotic.PDF
Product Status: ✓ Active (v9.8 August 2025). ✓ Consistent releases. ✗ Documentation scattered across website, NuGet, GitHub. ✗ HTML-to-PDF examples minimal compared to PDF manipulation examples. ✓ .NET 8 support added recently.
Missing Capabilities: ✓ HTML-to-PDF via Chromium add-on. ✗ Add-on requires separate package installation. ✗ License key required for all operations (including dev/test). ✗ No built-in async variants for HTML operations. ✗ Header/footer HTML templating less documented than text-based headers. ✗ URL authentication options not clearly documented.
Technical Issues: ✗ License validation errors if key not set correctly—no PDF operations work. ✗ HtmlToPdf add-on initialization not obvious from core documentation. ✗ Async patterns for HTML operations unclear—may require manual Task wrapping. ✗ Error messages generic when license issues occur. ✗ Trial license requires email request—not instant. ✗ System.Drawing.Common dependency in Gdi add-on not recommended for Linux/macOS per Microsoft docs.
Support Status: ✓ Free and paid licenses available. ✓ GitHub repository with samples. ✓ Responsive to issues (based on GitHub activity). ✗ HTML-to-PDF specific guidance sparse. ✗ No clear migration guides from other libraries. ✓ Active forum presence by maintainers.
Architecture Problems: ✗ Modular design requires understanding which add-on provides which feature. ✗ HtmlToPdf add-on separate from core—two packages to manage. ✗ License key must be set before any operations—no graceful degradation for trial. ✗ PDF manipulation features excellent but not needed for HTML-to-PDF workflows. ✓ 100% managed code (no native dependencies) is architectural strength. ✗ Async support for HTML rendering unclear from documentation.
License Requirement Checklist:
- ✗ Cannot create PDFs without license key
- ✗ Cannot read PDFs without license key
- ✗ Trial license requires email request (not instant)
- ✗ License key valid 31 days for trial
- ✗ Must set
BitMiracle.Docotic.LicenseManager.AddLicenseData(key)before any operation - ✗ Production requires commercial license purchase
- ✓ Free licenses available for eligible projects
Feature Comparison Overview
| Feature | Docotic.PDF | IronPDF |
|---|---|---|
| Current Status | Active | Active |
| HTML Support | Chromium add-on (separate package) | Chromium core |
| Rendering Quality | Pixel-perfect (Chromium) | Pixel-perfect (Chromium) |
| Installation | 2 NuGet packages + license | 1 NuGet package |
| License Required | ✗ Yes (even for trial) | ✓ Optional (watermark only) |
| Future Viability | PDF manipulation focus | HTML-to-PDF focus |
Code Comparison Checklist
Docotic.PDF — Installation Checklist
// ✗ STEP 1: Install core package
// Install-Package BitMiracle.Docotic.Pdf
// ✗ STEP 2: Install HTML add-on
// Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf
// ✗ STEP 3: Get license key
// Visit https://bitmiracle.com/pdf-library/
// Fill form, wait for email with trial key
// ✗ STEP 4: Configure license BEFORE any operations
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
namespace DococticExample
{
class Program
{
static void Main(string[] args)
{
// CRITICAL: Must set license before any PDF operation
// Without this, all operations fail
LicenseManager.AddLicenseData("YOUR-LICENSE-KEY-HERE");
// Verify license loaded
if (!LicenseManager.IsLicenseValid)
{
Console.WriteLine("ERROR: License not valid");
Console.WriteLine("Request trial: https://bitmiracle.com/pdf-library/");
return;
}
// ✓ Now PDF operations will work
// See code examples below
}
}
}
Installation checklist:
- ✗ Install core package
- ✗ Install HtmlToPdf add-on package
- ✗ Request trial license (wait for email)
- ✗ Add license key to code
- ✗ Verify license before operations
- ✓ Ready to use
IronPDF — Installation Checklist
// ✓ STEP 1: Install package
// Install-Package IronPdf
// ✓ STEP 2: Start coding (license optional)
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
// Optional: Add license to remove watermark
// IronPdf.License.LicenseKey = "YOUR-KEY";
// Works immediately with watermark
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
pdf.SaveAs("output.pdf");
}
}
}
Installation checklist:
- ✓ Install package
- ✓ Start coding immediately
- ✓ License optional (adds watermark if unlicensed)
Docotic.PDF — Basic HTML to PDF Checklist
using System;
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
namespace DococticHtmlExample
{
class Program
{
static void Main(string[] args)
{
// ✗ REQUIRED: Set license first
LicenseManager.AddLicenseData("YOUR-LICENSE-KEY");
// ✗ STEP 1: Create HtmlToPdf converter
using (var converter = new HtmlToPdfConverter())
{
// ✗ STEP 2: Configure options
var options = new PdfConversionOptions
{
PageWidth = 210, // mm (A4)
PageHeight = 297, // mm (A4)
MarginLeft = 10,
MarginRight = 10,
MarginTop = 10,
MarginBottom = 10
};
// ✗ STEP 3: HTML string
string html = @"
<html>
<head>
<style>
body { font-family: Arial; margin: 20px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>Hello from Docotic.PDF</h1>
<p>Sample content with <strong>formatting</strong>.</p>
</body>
</html>";
// ✗ STEP 4: Convert HTML to PDF
using (var pdf = converter.Convert(html, options))
{
// ✗ STEP 5: Save PDF
pdf.Save("output.pdf");
Console.WriteLine("✓ PDF created successfully");
}
}
}
}
}
Code checklist:
- ✗ Set license key
- ✗ Create HtmlToPdfConverter
- ✗ Configure PdfConversionOptions
- ✗ Call Convert method
- ✗ Save result
- ✓ Clean using statements for disposal
IronPDF — Basic HTML to PDF Checklist
using System;
using IronPdf;
namespace IronPdfHtmlExample
{
class Program
{
static void Main(string[] args)
{
// ✓ STEP 1: Create renderer
var renderer = new ChromePdfRenderer();
// ✓ STEP 2: Render HTML
string html = @"
<html>
<head>
<style>
body { font-family: Arial; margin: 20px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>Hello from IronPDF</h1>
<p>Sample content with <strong>formatting</strong>.</p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
// ✓ STEP 3: Save
pdf.SaveAs("output.pdf");
}
}
}
Code checklist:
- ✓ Create renderer
- ✓ Render HTML
- ✓ Save PDF
- ✓ Done
For HTML string details, see the HTML string to PDF guide.
Docotic.PDF — URL to PDF Checklist
using System;
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
namespace DococticUrlExample
{
class Program
{
static void Main(string[] args)
{
// ✗ Set license
LicenseManager.AddLicenseData("YOUR-LICENSE-KEY");
// ✗ Create converter
using (var converter = new HtmlToPdfConverter())
{
// ✗ Configure options
var options = new PdfConversionOptions();
// ✗ OPTIONAL: Configure delay for JavaScript
// Verify exact property name in docs for your version
// options.JavaScriptDelayMilliseconds = 1000; // (verify in docs)
// ✗ URL to convert
string url = "https://example.com";
// ✗ Convert URL
// Note: Authentication/headers configuration unclear from docs
using (var pdf = converter.ConvertUrl(url, options))
{
// ✗ Save
pdf.Save("url_output.pdf");
Console.WriteLine("✓ URL converted");
}
}
}
}
}
URL rendering checklist:
- ✗ License key set
- ✗ HtmlToPdfConverter created
- ✗ URL passed to ConvertUrl method
- ✗ JavaScript delay configured (if needed—verify API)
- ✗ Authentication options (unclear from docs—verify)
- ✓ Result saved
IronPDF — URL to PDF Checklist
using System;
using IronPdf;
namespace IronPdfUrlExample
{
class Program
{
static void Main(string[] args)
{
// ✓ Create renderer
var renderer = new ChromePdfRenderer();
// ✓ Configure timeout
renderer.RenderingOptions.Timeout = 120;
// ✓ Render URL
var pdf = renderer.RenderUrlAsPdf("https://example.com");
// ✓ Save
pdf.SaveAs("url_output.pdf");
}
}
}
URL rendering checklist:
- ✓ Create renderer
- ✓ Configure options
- ✓ Render URL
- ✓ Save PDF
For URL rendering with authentication, see the URL to PDF documentation.
Docotic.PDF — HTML File Checklist
using System;
using System.IO;
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
namespace DococticFileExample
{
class Program
{
static void Main(string[] args)
{
// ✗ License key
LicenseManager.AddLicenseData("YOUR-LICENSE-KEY");
// ✗ Create HTML file
string htmlFile = "template.html";
string html = @"
<html>
<head>
<link rel='stylesheet' href='styles/main.css'>
</head>
<body>
<img src='images/logo.png'>
<h1>HTML File</h1>
</body>
</html>";
File.WriteAllText(htmlFile, html);
// ✗ Create converter
using (var converter = new HtmlToPdfConverter())
{
// ✗ Configure base path for assets
var options = new PdfConversionOptions();
// Base path for relative URLs
// Exact property name - verify in docs
// options.BasePath = Path.GetDirectoryName(htmlFile);
// ✗ Read HTML content
string htmlContent = File.ReadAllText(htmlFile);
// ✗ Convert
using (var pdf = converter.Convert(htmlContent, options))
{
// ✗ Save
pdf.Save("file_output.pdf");
}
}
}
}
}
File rendering checklist:
- ✗ License key set
- ✗ HTML file created/exists
- ✗ Base path configured for assets
- ✗ HTML content read
- ✗ Converter created
- ✗ Convert called
- ✓ PDF saved
IronPDF — HTML File Checklist
using System;
using IronPdf;
namespace IronPdfFileExample
{
class Program
{
static void Main(string[] args)
{
// ✓ Create renderer
var renderer = new ChromePdfRenderer();
// ✓ Render file (auto-resolves assets)
var pdf = renderer.RenderHtmlFileAsPdf("template.html");
// ✓ Save
pdf.SaveAs("file_output.pdf");
}
}
}
File rendering checklist:
- ✓ Create renderer
- ✓ Render file
- ✓ Assets auto-resolved
- ✓ Save PDF
For file rendering, see the HTML file to PDF guide.
Docotic.PDF — Async Operations Checklist
using System;
using System.Threading.Tasks;
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
namespace DococticAsyncExample
{
class Program
{
static async Task Main(string[] args)
{
// ✗ License key
LicenseManager.AddLicenseData("YOUR-LICENSE-KEY");
// ✗ Async support unclear from docs
// May need to wrap synchronous calls
await Task.Run(() =>
{
using (var converter = new HtmlToPdfConverter())
{
var options = new PdfConversionOptions();
using (var pdf = converter.Convert("<h1>Async</h1>", options))
{
pdf.Save("async_output.pdf");
}
}
});
// ✗ OR check if ConvertAsync exists (verify in docs)
// using (var converter = new HtmlToPdfConverter())
// {
// var options = new PdfConversionOptions();
// using (var pdf = await converter.ConvertAsync("<h1>Async</h1>", options))
// {
// pdf.Save("async_output.pdf");
// }
// }
}
}
}
Async checklist:
- ✗ License key set
- ✗ Check if native async methods exist
- ✗ May require Task.Run wrapping
- ✗ Async patterns not clearly documented
IronPDF — Async Operations Checklist
using System;
using System.Threading.Tasks;
using IronPdf;
namespace IronPdfAsyncExample
{
class Program
{
static async Task Main(string[] args)
{
// ✓ Create renderer
var renderer = new ChromePdfRenderer();
// ✓ Native async support
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async</h1>");
// ✓ Async save
await pdf.SaveAsAsync("async_output.pdf");
}
}
}
Async checklist:
- ✓ Native async methods
- ✓ Full async/await support
- ✓ No manual Task wrapping needed
API Mapping Reference
| Docotic.PDF Operation | IronPDF Equivalent |
|---|---|
LicenseManager.AddLicenseData(key) |
License.LicenseKey = key (optional) |
new HtmlToPdfConverter() |
new ChromePdfRenderer() |
new PdfConversionOptions() |
renderer.RenderingOptions |
converter.Convert(html, options) |
renderer.RenderHtmlAsPdf(html) |
converter.ConvertUrl(url, options) |
renderer.RenderUrlAsPdf(url) |
pdf.Save(path) |
pdf.SaveAs(path) |
options.PageWidth/PageHeight |
renderer.RenderingOptions.PaperSize |
options.Margin* |
renderer.RenderingOptions.Margin* |
| Check docs for ConvertAsync | renderer.RenderHtmlAsPdfAsync(html) |
| Manual base path config | Auto-detected |
Comprehensive Feature Comparison
| Category | Feature | Docotic.PDF | IronPDF |
|---|---|---|---|
| Status | Active Development | ✓ Yes | ✓ Yes |
| Product Focus | PDF manipulation | HTML-to-PDF | |
| HTML Module | ✗ Separate add-on | ✓ Core | |
| Support | Commercial Support | ✓ Available | ✓ Included |
| Free Licenses | ✓ For eligible projects | ✓ For dev/test | |
| Documentation | ✗ Scattered | ✓ Unified | |
| Code Examples | ✓ GitHub samples | ✓ Extensive | |
| Content Creation | HTML5 Support | ✓ Chromium | ✓ Chromium |
| CSS3 Support | ✓ Complete | ✓ Complete | |
| JavaScript | ✓ Full | ✓ Full | |
| Modern Frameworks | ✓ Supported | ✓ Supported | |
| Responsive Design | ✓ Supported | ✓ Supported | |
| Web Fonts | ✓ Automatic | ✓ Automatic | |
| PDF Operations | HTML to PDF | ✓ Via add-on | ✓ Native |
| URL to PDF | ✓ Via add-on | ✓ Native | |
| Text Extraction | ✓ Excellent | ✓ Good | |
| PDF Editing | ✓ Comprehensive | ✗ Limited | |
| Form Fields | ✓ Excellent | ✓ Good | |
| Architecture | Native Dependencies | ✓ None (managed) | ✓ None (managed) |
| Package Count | ✗ 2 (core + addon) | ✓ 1 | |
| License Requirement | ✗ Always | ✓ Optional | |
| Async Support | ✗ Unclear | ✓ Full | |
| Installation | Complexity | ✗ Moderate | ✓ Simple |
| License Setup | ✗ Required first | ✓ Optional | |
| Trial Access | ✗ Email request | ✓ Instant | |
| Development | Learning Curve | ✗ Moderate | ✓ Shallow |
| API Clarity | ✓ Clean | ✓ Clear | |
| Error Messages | ✓ Good | ✓ Detailed |
Setup Checklist Comparison
Docotic.PDF Setup Checklist
- ✗ Install core package (BitMiracle.Docotic.Pdf)
- ✗ Install HTML add-on (BitMiracle.Docotic.Pdf.HtmlToPdf)
- ✗ Visit website to request trial license
- ✗ Wait for email with license key
- ✗ Add license key to code with LicenseManager
- ✗ Verify license loads correctly
- ✓ Begin development
Time to first PDF: 30+ minutes (waiting for trial license email)
IronPDF Setup Checklist
- ✓ Install package (IronPdf)
- ✓ Begin development
- ✓ Add license key later to remove watermark (optional)
Time to first PDF: 2 minutes
License Management Checklist
Docotic.PDF License
- ✗ Required for all operations (even read/write)
- ✗ Trial: 31 days after email request
- ✗ Must be set before any PDF operation
- ✗ License validation errors block all functionality
- ✓ Free licenses available for eligible projects
- ✓ Royalty-free commercial licenses
IronPDF License
- ✓ Optional for development (adds watermark)
- ✓ Trial: 30 days instant access
- ✓ Full functionality during trial
- ✓ Watermark-only restriction when unlicensed
- ✓ Set license anytime to remove watermark
- ✓ Royalty-free commercial licenses
Common Issues Checklist
Docotic.PDF Common Issues:
- ✗ "License not valid" - forgot to set license before operations
- ✗ Trial license request delayed - email spam folder
- ✗ Two packages needed - core + HtmlToPdf add-on
- ✗ Async patterns unclear - check docs for version
- ✗ Base path for assets - verify property name in docs
IronPDF Common Issues:
- ✓ Watermark appears - add license key to remove
- ✓ All other operations work without license
Installation Comparison
Docotic.PDF:
# Step 1: Install core
dotnet add package BitMiracle.Docotic.Pdf
# Step 2: Install HTML add-on
dotnet add package BitMiracle.Docotic.Pdf.HtmlToPdf
# Step 3: Request trial license
# Visit: https://bitmiracle.com/pdf-library/
# Fill form, wait for email
# Step 4: Add license to code
using BitMiracle.Docotic;
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.HtmlToPdf;
// Required before any operation
LicenseManager.AddLicenseData("YOUR-KEY");
IronPDF:
# Step 1: Install
dotnet add package IronPdf
# Done - start coding
using IronPdf;
using IronPdf.Rendering;
// Optional - add later to remove watermark
// IronPdf.License.LicenseKey = "YOUR-KEY";
Conclusion
BitMiracle Docotic.PDF provides a comprehensive PDF manipulation library with excellent text extraction, form handling, and editing capabilities. The HtmlToPdf add-on uses Chromium for pixel-perfect rendering. Teams needing extensive PDF manipulation features alongside HTML-to-PDF conversion may find Docotic.PDF's modular architecture matches their requirements. The 100% managed code with no native dependencies is an architectural strength.
The operational checklist surfaces where complexity emerges: two packages to install, trial license requiring email request, license key mandatory before any operations (including development), and async support patterns requiring documentation verification. For teams where PDF manipulation is primary and HTML rendering secondary, working through this checklist may be justified.
Migration consideration centers on workflow focus. If your codebase shows more HTML-to-PDF operations than PDF manipulation (text extraction, form filling, page editing), the two-package architecture and license-first requirement may add friction. Production deployments benefit from instant trial access for testing, single-package installation for CI/CD, and clear async patterns for web applications.
IronPDF's single-package installation with optional licensing eliminates the checklist complexity. The ChromePdfRenderer provides immediate HTML-to-PDF functionality without license configuration, adding only a watermark until licensed. For comprehensive HTML-to-PDF examples, review the HTML to PDF tutorial, and see the ChromePdfRenderer API documentation for configuration details.
What's your experience managing multi-package dependencies and trial license workflows in .NET projects?
Top comments (0)