Regira Office.PDF provides a unified abstraction for PDF operations — HTML→PDF, images→PDF, PDF→images, text extraction, merge/split, and printing — across multiple underlying libraries.
| Project | Package | Backend | HTML→PDF | PDF ops | |
|---|---|---|---|---|---|
Common.Office |
(transitive) | Shared abstractions | — | — | — |
PDF.SelectPdf |
Regira.Office.PDF.SelectPdf |
Select.HtmlToPdf | ✓ full | — | — |
PDF.Puppeteer |
Regira.Office.PDF.Puppeteer |
PuppeteerSharp | ✓ Letter | — | — |
PDF.Playwright |
Regira.Office.PDF.MsPlaywright |
Microsoft.Playwright | ✓ A4 | — | — |
PDF.DocNET |
Regira.Office.PDF.DocNET |
Docnet.Core | — | merge, split, img↔pdf, text | — |
PDF.Spire |
Regira.Office.PDF.Spire |
FreeSpire.PDF | — | merge, split, pdf→img, text | ✓ |
PDF.PDFtoPrinter |
Regira.Office.PDF.PDFtoPrinter |
PDFtoPrinter | — | — | ✓ (Win) |
PDF.PockyBum522 |
Regira.Office.PDF.PockyBum522 |
SimpleFreePdfPrinter | — | — | ✓ (Win) |
<!-- HTML→PDF (recommended — full options support) -->
<PackageReference Include="Regira.Office.PDF.SelectPdf" Version="6.*" />
<!-- HTML→PDF (headless Chromium) -->
<PackageReference Include="Regira.Office.PDF.Puppeteer" Version="6.*" />
<PackageReference Include="Regira.Office.PDF.MsPlaywright" Version="6.*" />
<!-- PDF operations (merge, split, text, images) -->
<PackageReference Include="Regira.Office.PDF.DocNET" Version="6.*" />
<PackageReference Include="Regira.Office.PDF.Spire" Version="6.*" />
<!-- Print (Windows) -->
<PackageReference Include="Regira.Office.PDF.PDFtoPrinter" Version="6.*" />
<PackageReference Include="Regira.Office.PDF.PockyBum522" Version="6.*" />
// HTML → PDF (SelectPdf)
IHtmlToPdfService pdf = new Regira.Office.PDF.SelectPdf.PdfManager();
IMemoryFile file = await pdf.Create(new HtmlInput
{
HtmlContent = "<h1>Hello</h1>",
Format = PageSize.A4,
Orientation = PageOrientation.Portrait
});
// Merge PDFs (DocNET — needs an IImageService for the image-related operations)
IMemoryFile pdf1 = File.ReadAllBytes("1.pdf").ToMemoryFile();
IMemoryFile pdf2 = File.ReadAllBytes("2.pdf").ToMemoryFile();
IMemoryFile pdf3 = File.ReadAllBytes("3.pdf").ToMemoryFile();
IImageService imageService = new Regira.Drawing.SkiaSharp.Services.ImageService();
IPdfMerger merger = new Regira.Office.PDF.DocNET.PdfManager(imageService);
IMemoryFile merged = (await merger.Merge([pdf1, pdf2, pdf3]))!;
// Reading a result — GetBytes() (Regira.IO.Extensions), not .Bytes
byte[] bytes = merged.GetBytes()!;
IMemoryFile extends both IMemoryBytesFile (Bytes) and IMemoryStreamFile (Stream), and a producer
fills exactly one. Which one varies per method rather than per backend — DocNET’s Split returns
byte-backed files while the Merge above returns a stream-backed one — so .Bytes reads null for half the
API and yields an empty file with no exception. GetBytes() normalises both and is correct everywhere.
Task<IMemoryFile> Create(HtmlInput template, CancellationToken cancellationToken = default);
// IPdfMerger
Task<IMemoryFile?> Merge(IEnumerable<IMemoryFile> items, CancellationToken cancellationToken = default);
// IPdfSplitter
Task<IEnumerable<IMemoryFile>> Split(IMemoryFile pdf, IEnumerable<PdfSplitRange> ranges, CancellationToken cancellationToken = default);
Task<int> GetPageCount(IMemoryFile pdf, CancellationToken cancellationToken = default);
// IPdfEditor : IPdfMerger, IPdfSplitter
Task<IMemoryFile?> RemovePages(IMemoryFile pdf, IEnumerable<int> pages, CancellationToken cancellationToken = default);
Task<IList<IImageFile>> ToImages(IMemoryFile pdf, PdfToImagesOptions? options = null, CancellationToken cancellationToken = default);
Task<IMemoryFile?> ImagesToPdf(ImagesInput input, CancellationToken cancellationToken = default);
Task<string> GetText(IMemoryFile pdf, CancellationToken cancellationToken = default);
Task<IList<string>> GetTextPerPage(IMemoryFile pdf, CancellationToken cancellationToken = default);
Task<IMemoryFile?> RemoveEmptyPages(IMemoryFile pdf, CancellationToken cancellationToken = default);
string DefaultPrinter { get; }
Task<IList<string>> List(CancellationToken cancellationToken = default);
Task Print(PdfPrinterInput input, CancellationToken cancellationToken = default);
Composite: IPdfEditor + IPdfImageService + IPdfTextService.
| Property | Type | Default | Description |
|---|---|---|---|
HtmlContent |
string? |
null |
HTML to convert |
HeaderHtmlContent |
string? |
null |
Repeating page header |
FooterHtmlContent |
string? |
null |
Repeating page footer |
HeaderHeight |
int? |
null |
Header height in mm |
FooterHeight |
int? |
null |
Footer height in mm |
Format |
PageSize |
A4 |
Paper size |
Orientation |
PageOrientation |
Portrait |
Portrait / Landscape |
Margins |
Margins |
10mm all |
Page margins (in points) |
DPI |
int |
96 |
Render resolution |
Same base properties as HtmlInput plus:
| Property | Type | Description |
|---|---|---|
Images |
ICollection<byte[]> |
One image per page |
| Property | Type | Default | Description |
|---|---|---|---|
Size |
ImageSize? |
1080 × 1920 |
Output image dimensions |
Format |
ImageFormat |
Jpeg |
Output image format |
| Property | Type | Description |
|---|---|---|
Start |
int |
First page (1-indexed) |
End |
int? |
Last page (null = last page of document) |
| Property | Type | Default | Description |
|---|---|---|---|
PdfFile |
IMemoryFile |
(required) | PDF to print |
PrinterName |
string? |
default printer | Target printer |
PageSize |
PageSize |
A4 |
Paper size |
PageOrientation |
PageOrientation |
Portrait |
Orientation |
Full support for all HtmlInput properties: page size, orientation, margins, headers, footers. Does not require a browser installation.
Both download Chromium automatically on first use (thread-safe via semaphore). Custom page sizes and margins from HtmlInput are not respected: Playwright always renders A4, while Puppeteer uses the PuppeteerSharp default paper size (Letter). Use for pixel-perfect rendering of complex CSS.
Implements IPdfService (merge, split, images↔pdf, text extraction, page removal). Requires IImageService in the constructor.
IImageService imageService = new Regira.Drawing.SkiaSharp.Services.ImageService();
var pdf = new Regira.Office.PDF.DocNET.PdfManager(imageService);
Implements IPdfMerger, IPdfSplitter, IPdfToImageService and IPdfTextExtractor — not the full IPdfService: there is no RemovePages, ImagesToPdf, GetTextPerPage or RemoveEmptyPages, and image conversion is PDF→image only. Also ships PdfPrinter for Windows printing with page size override support.