v1.6.2
Fixed
  • Azure preset no longer breaks multi-page PDFs. CloudEnvironment.ConfigureForAzure (and ConfigureForLowMemory) no longer add --single-process — that flag crashes the Chromium renderer on multi-page or non-trivial documents (only trivial single-page renders survived it). 1.6.1 could fail real renders on Azure when these presets were used, so upgrading from 1.6.1 is recommended. The presets now use the stable multi-process model.
Changed
  • The bundled Linux dependencies (added in 1.6.1) now activate only when the host is missing Chromium's graphics stack, so Linux hosts that already provide the libraries render exactly as before.
v1.6.1
Added
  • Runs on stock Linux with no container. The package now ships Chromium's OS-level dependencies (system libraries, NSS modules, and base fonts) and points the browser's loader at them automatically on Linux — so the Chromium edition runs on a stock Azure Functions Linux plan or a slim container with a plain code deploy (no custom container, no apt). On Linux hosts that already provide the libraries, nothing changes: the host's own libraries and fonts are used exactly as before, and the bundled set is used only when the host is missing them.
  • CobaltPDF.Requests dependency pinned to v1.6.1.
v1.6.0
Added
  • WithCompression(bool) — output PDFs now re-encode embedded images to shrink the file (typically several times smaller on image-heavy pages). Call WithCompression(false) for raw, lossless output. Powered by Magick.NET (Apache-2.0).
  • WithViewportSize(width[, height]) — sets the render viewport; a tall height triggers IntersectionObserver lazy images without scrolling. Parity with the WebKit edition.
  • WithEagerImages() — forces lazy-loaded images to load before rendering, additionally promoting the JavaScript data-src/data-srcset convention the print path cannot.
  • Pool backpressure & metrics. New PoolOptions.MaxQueueDepth + PoolBusyException let a saturated pool fast-fail extra requests so the host can return HTTP 503 instead of a slow timeout (default 0 = unbounded). New CobaltEngine.GetPoolStatistics() / CobaltPoolStatistics expose live pool gauges and lifetime counters for health endpoints.
Changed
  • Desktop-layout rendering by default. Renders now capture the full desktop layout (≈1280 px wide) scaled to fit the page — matching the WebKit edition — instead of reflowing to the narrow print width. The paper keeps its true size (e.g. A4). Set WithMediaType(CssMediaType.Print) to restore the old Chrome-print reflow.
  • Image compression is on by default (see above), so output is now slightly lossy unless you call WithCompression(false).
  • Default User-Agent now matches the WebKit edition (a desktop Chrome UA via PdfOptions.DefaultUserAgent) so UA-sensitive sites serve both engines the same markup. Override with WithUserAgent(...).
  • Auto-sized concurrency. PoolOptions.MaxSize now defaults to a host-aware value — the smaller of the vCPU count and what fits in ~75% of detected memory, clamped 1–8 — instead of a fixed 5, so it stays safe on memory-constrained hosts. Always overridable.
  • CobaltPDF.Requests dependency updated to v1.6.1.
Deprecated
  • WithoutPostProcessing() — use WithCompression(bool) instead (WithoutPostProcessing() is equivalent to WithCompression(false)). It still compiles, and is no longer a no-op on this edition.
Compatibility
  • No public API was removed; existing code compiles and runs unchanged. The default output now differs (desktop-scaled layout + image compression) — combine WithMediaType(CssMediaType.Print) and WithCompression(false) to reproduce v1.5.x output.
v1.5.0
Added
  • PDF page splitting, extraction & merging. New PdfDocument members: PageCount, ExtractPage(int), ExtractPages(start, end), ExtractPages(IEnumerable<int>), SplitIntoPages(), and static FromFile(path), FromBytes(data), and Merge(params PdfDocument[]). Works on any PDF — freshly rendered or loaded from disk — on any OS. Page indices are 0-based; out-of-range indices throw ArgumentOutOfRangeException.
  • Watermark rasterization. New opt-in WatermarkOptions.Rasterize flag (fluent .WithRasterize()) flattens a watermark into a high-resolution image baked into every page — no selectable text and no separate deletable object in a PDF editor. Tamper-resistance for confidential documents; default behaviour is unchanged. The same flag was added to CobaltPDF.WebKit, so both libraries behave identically.
  • WithoutPostProcessing() added as an accepted no-op for drop-in compatibility with CobaltPDF.WebKit (where it skips a separate post-processing pipeline). Chromium's PDF backend already subsets fonts and compresses images natively, so the method has no effect here — code written against either engine compiles and runs against the other unchanged.
Security
  • Encryption upgraded to AES-256 (security handler V5/R6, previously AES-128). The WithEncryption(...) API, PdfEncryptionOptions, and all password/permission behaviour are unchanged — only the cipher strength improved. Both CobaltPDF libraries now produce identical AES-256 protection from identical options.
Changed
  • CobaltPDF.Requests dependency updated to v1.5.0 — a serialized PdfRequest can now request a rasterized watermark and carry the new SkipPostProcessing flag (honoured by CobaltPDF.WebKit; accepted and ignored here).
  • Deployment documentation corrected and expanded after validation on real Azure infrastructure: Linux Azure Functions require a custom container for Chromium (the stock image lacks its system libraries) — the Azure Functions guide and docs now carry validated container walkthroughs and engine toggles.
Compatibility
  • Fully backward compatible — no public API was renamed or removed, and existing code compiles and runs unchanged.
v1.4.1
Added
  • WithUserAgent, WithHttpHeader, and WithHttpHeaders are now declared on the IPdfGenerator and IPdfGeneratorFinal interfaces (previously only available on CobaltEngine), so code holding an interface reference gets the same methods via IntelliSense.
Fixed
  • AddCookie(name, value) without an explicit domain no longer throws "Invalid cookie fields" when the final URL is localhost, an IPv4/IPv6 address, or a single-label intranet hostname. The cookie is now correctly registered as a standard host-only cookie. Cookie inference for public domains is unchanged.
v1.4.0
Security
  • Updated bundled Chromium from 2026.2.1 to 2026.5.16, addressing upstream security advisories.
Removed
  • Dropped the net6.0 target. The package now targets net8.0 (compatible with .NET 8, 9, and 10). Consumers on .NET 6 should stay on v1.3.0 or upgrade their runtime — .NET 6 reached end of Microsoft support in November 2024.
Changed
  • Bumped Microsoft.Extensions.DependencyInjection from 10.0.3 to 10.0.8.
  • Bumped System.Formats.Asn1 from 10.0.3 to 10.0.8.
  • Bumped Microsoft.Playwright from 1.58.0 to 1.60.0.
v1.3.0
Added
  • Multi-target support: the package now ships builds for both net6.0 and net8.0, broadening compatibility with projects on .NET 6, 7, 8, 9, and 10.
Changed
  • CobaltPDF.Requests dependency updated to v1.3.0 (now targets netstandard2.0).
v1.2.2
Fixed
  • Fixed Chromium default header/footer appearing when only one template is provided.
  • Fixed WithLazyLoadPages not working when combined with WithCustomJS or WithWaitStrategy.
Changed
  • WithCustomJS now waits for the page to be fully loaded before executing, so dynamically-injected elements (e.g. cookie consent buttons) are available.
  • Client-side redirects (e.g. bbc.com → bbc.co.uk) are now detected before cookies, custom JS, and wait strategies run.
v1.2.0
Changed
  • Renamed .Landscape() to .WithLandscape() for fluent API consistency.
  • Renamed .UseGrayscale() to .WithGrayscale() for fluent API consistency.
  • Renamed .EmulateMediaType() to .WithMediaType() — shorter and consistent with the With* convention.
  • Renamed .WaitFor() to .WithWaitStrategy() to avoid confusion with async operations.
  • Renamed .ReloadAfterStorageSet() to .WithReloadAfterStorage() for fluent API consistency.
  • Renamed .ConfigureFonts() to .WithFonts() — shorter and consistent with the With* convention.
v1.1.0
Added
  • Fluent .WithWatermark() API for text and HTML watermarks with configurable opacity, rotation, and position.
  • PDF metadata support — set title, author, subject, keywords, and creator via .WithMetadata().
  • CloudEnvironment.ConfigureForAzure preset for Azure App Service and Container Apps deployments.
  • New .ScrollPage() option to trigger lazy-loaded images before capture.
Changed
  • Default pool MaxSize increased from 4 to 8 for better throughput on multi-core hosts.
  • Improved browser recycling logic — instances are now recycled after 50 renders (previously 100).
Fixed
  • Resolved rare deadlock when calling RenderUrlAsPdfAsync with a CancellationToken that fires during navigation.
  • Fixed header/footer templates not respecting @media print styles.
v1.0.1
Fixed
  • Fixed PreWarmAsync() throwing ObjectDisposedException when called immediately after Configure() on Linux containers.
  • Corrected paper size calculation for custom dimensions specified in millimetres.
  • Resolved an issue where AddCookie() cookies were not sent on the initial page load when using RenderUrlAsPdfAsync.
v1.0.0
Added
  • Initial release of CobaltPDF — a high-performance HTML-to-PDF rendering engine for .NET.
  • Chromium-powered rendering with full support for modern CSS (Grid, Flexbox, custom properties, animations).
  • Managed browser pool with configurable MinSize, MaxSize, and automatic recycling.
  • Fluent API for PDF generation — chain options and call a single terminal method.
  • Thread-safe singleton design with isolated browser contexts per render.
  • Cookie, localStorage, and sessionStorage injection per render.
  • Custom HTTP headers and User-Agent per render.
  • Header and footer HTML templates with page number, total pages, and date tokens.
  • PDF encryption with user/owner passwords and granular permission control.
  • Wait strategies: network idle, DOM selector, JavaScript expression, custom signal, fixed delay.
  • Custom JavaScript execution before capture with cobaltNotifyRender() signal support.
  • Cloud environment presets: Docker, AWS ECS, Low-Memory.
  • ASP.NET Core dependency injection via services.AddCobaltPdf().
  • Companion package CobaltPDF.Requests for lightweight microservice clients.