Pdf4me.Client 2.0.0

dotnet add package Pdf4me.Client --version 2.0.0
                    
NuGet\Install-Package Pdf4me.Client -Version 2.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Pdf4me.Client" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Pdf4me.Client" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Pdf4me.Client" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Pdf4me.Client --version 2.0.0
                    
#r "nuget: Pdf4me.Client, 2.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Pdf4me.Client@2.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Pdf4me.Client&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Pdf4me.Client&version=2.0.0
                    
Install as a Cake Tool

Pdf4me.Client

NuGet License

.NET client for the PDF4me API. Convert, optimize, merge, split, stamp, OCR and extract content from documents with async methods and typed results.

Targets .NET 8, 9 and 10, and .NET Standard 2.0 for .NET Framework 4.6.2 and later. Requires a PDF4me API key.

Upgrading from 1.x? Version 2.0 is a rewrite on the PDF4me API v2 and nothing from 1.x keeps working. See Migrating from 1.x.

Installation

dotnet add package Pdf4me.Client

Quick start

Set your API key in the environment:

export PDF4ME_API_KEY="your-api-key"

This program uploads input.pdf for optimization and saves the result as optimized.pdf:

using Pdf4me.Client;

var apiKey = Environment.GetEnvironmentVariable("PDF4ME_API_KEY")
    ?? throw new InvalidOperationException("Set PDF4ME_API_KEY first.");

using var client = new Pdf4meClient(apiKey);
var result = await client.OptimizeAsync(
    File.ReadAllBytes("input.pdf"), docName: "input.pdf", profile: OptimizeProfile.Max);
File.WriteAllBytes("optimized.pdf", result);

Create one client and reuse it for every call: it keeps a pooled connection, so a client per call would set up TLS every time. Dispose it when you are done.

Using actions

Every action is an async method on Pdf4meClient, named after its endpoint: /api/v2/ConvertOcrPdf is ConvertOcrPdfAsync. The first parameters are what the action works on; everything else is optional, so pass it by name:

var searchable = await client.ConvertOcrPdfAsync(
    scan, language: "English", qualityType: QualityType.Draft);

var numbered = await client.AddPageNumberAsync(
    pdf, pageNumberFormat: "Page # of {1}", alignX: AddPageNumberAlignX.Center);

Documents are a DocumentSource: the file's bytes, or a string the API fetches itself - a pdf4meblobid://<id> for an uploaded blob, or an https URL. Both convert implicitly, so pass either straight in. A string is never read as a local path; read the file and pass its bytes.

Results. Actions that produce a document return its byte[]. Actions that answer with data return a typed model, such as DocMetadata from GetPdfMetadataAsync or ReadBarcodesRes from ReadBarcodesAsync.

Options that are objects - ConvertToPdfAction, ImageAction, the result models - are generated from the API description and live in Pdf4me.Client.Generated.Models. Enums an action takes have short names in Pdf4me.Client (QualityType, AlignX, SplitAction, ...); the few enums whose generated name is already short (DocType, ImageTypeExtract, ...) are used straight from Pdf4me.Client.Generated.Models.

using Pdf4me.Client;
using Pdf4me.Client.Generated.Models;

var pages = await client.CreateImagesAsync(
    pdf, new ImageAction { ImageExtension = ImageExtension.Png }, pageNrs: "1");

Every action also takes:

  • extra - additional request fields, for options the API description does not list yet. They are sent as they are, next to the action's own.
  • maxWait - how long to wait for this call's queued job; see below.
  • cancellationToken - cancels the request and any polling.

Examples

Each snippet assumes using Pdf4me.Client;, using Pdf4me.Client.Generated.Models; and a client created as in the quick start.

A document in, a document out - most actions:

byte[] pdf = File.ReadAllBytes("input.pdf");

byte[] compressed = await client.OptimizeAsync(pdf, profile: OptimizeProfile.Web);
byte[] protectedPdf = await client.ProtectAsync(pdf, password: "secret", pdfPermission: ProtectPdfPermission.All);
byte[] wordFile = await client.ConvertPdfToWordAsync(pdf, docName: "input.pdf");

A blob or URL instead of bytes - the API fetches it itself:

byte[] fromUrl = await client.OptimizeAsync("https://example.com/report.pdf");
byte[] fromBlob = await client.OptimizeAsync("pdf4meblobid://<id>");

Several documents - merged in the order given:

byte[] merged = await client.MergeAsync([File.ReadAllBytes("a.pdf"), File.ReadAllBytes("b.pdf")]);

No document - the input is text or a URL:

byte[] qrCode = await client.CreateBarcodeAsync("https://pdf4me.com", barcodeType: CreateBarcodeBarcodeType.QRCode);
byte[] webPage = await client.ConvertUrlToPdfAsync("https://example.com");

Data instead of a file - the result is a typed model:

DocMetadata metadata = await client.GetPdfMetadataAsync(pdf);
Console.WriteLine($"{metadata.PageCount} pages, PDF {metadata.PdfVersion}");

ReadBarcodesRes scan = await client.ReadBarcodesAsync(pdf);
foreach (var barcode in scan.Barcodes ?? [])
    Console.WriteLine($"page {barcode.Page}: {barcode.Value}");

Some answers have no fixed shape - the AI document parser decides its own - so everything they return is in the model's AdditionalData:

var parsed = await client.AiDocumentParserAsync(File.ReadAllBytes("invoice.pdf"), "invoice parser");
foreach (var (field, value) in parsed.AdditionalData)
    Console.WriteLine($"{field}: {value}");

Long jobs and cancelling - wait longer for one call, and stop it from your side:

using var cancel = new CancellationTokenSource(TimeSpan.FromMinutes(20));
byte[] searchable = await client.ConvertOcrPdfAsync(
    File.ReadAllBytes("scan.pdf"), language: "English",
    maxWait: TimeSpan.FromMinutes(20), cancellationToken: cancel.Token);

An option the API description does not list yet - send it through extra:

byte[] result = await client.OptimizeAsync(pdf, extra: new Dictionary<string, object> { ["someNewOption"] = true });

Client configuration and errors

using var client = new Pdf4meClient(apiKey, new Pdf4meClientOptions
{
    BaseUrl = Pdf4meClient.DefaultBaseUrl,       // https://api.pdf4me.com
    Timeout = TimeSpan.FromSeconds(100),         // each HTTP request
    MaxWait = TimeSpan.FromMinutes(5),           // waiting for one queued job
    Logger = loggerFactory.CreateLogger<Pdf4meClient>(),
});

Every action is submitted as an asynchronous job: a call returns the finished result whether the server answered at once or queued the work, polling it in between as the server suggests. MaxWait limits that wait; pass maxWait: to an action to change it for that call. The OCR actions (ConvertOcrPdfAsync, ImageExtractTextAsync) wait at least 10 minutes (DefaultOcrMaxWait), or longer if MaxWait is higher.

Errors. A refused or failed request throws Pdf4meException (in Pdf4me.Client.Generated.Models) with:

Property Holds
Message The API's message; else the response body, cut to 500 characters; else the HTTP status
ResponseStatusCode The HTTP status code
TraceId The API's trace id; quote it when reporting a problem
ResponseBody The whole response body as sent
ResponseHeaders The response headers

A job still running when the wait runs out throws TimeoutException. Invalid arguments, such as an empty document, throw ArgumentException before any request is sent.

try
{
    byte[] result = await client.OptimizeAsync(pdf);
}
catch (Pdf4meException e)
{
    // The API refused or failed the request: say what it said.
    Console.Error.WriteLine($"PDF4me returned {e.ResponseStatusCode}: {e.Message} (trace {e.TraceId})");
}
catch (TimeoutException e)
{
    // The job was still running when maxWait ran out.
    Console.Error.WriteLine(e.Message);
}

Logging. Give the client an ILogger (from Microsoft.Extensions.Logging) to see every request, response, queued job and poll at Debug. Nothing logged carries the API key or a document's content. In a console app, with the Microsoft.Extensions.Logging.Console package:

using Microsoft.Extensions.Logging;

using var loggerFactory = LoggerFactory.Create(logging => logging
    .AddSimpleConsole(console => console.SingleLine = true)
    .SetMinimumLevel(LogLevel.Debug));
using var client = new Pdf4meClient(apiKey, new Pdf4meClientOptions
{
    Logger = loggerFactory.CreateLogger<Pdf4meClient>(),
});

In ASP.NET Core, or any app using dependency injection, register one client for the whole app; the logger comes from the app's own logging setup:

builder.Services.AddSingleton(services => new Pdf4meClient(
    builder.Configuration["Pdf4me:ApiKey"]!,
    new Pdf4meClientOptions { Logger = services.GetRequiredService<ILogger<Pdf4meClient>>() }));

Available sections

The client provides 106 actions, grouped by the sections of the API documentation; each section's actions live in their own file.

File Docs section Actions
AiDocumentExtraction.cs AI Document Extraction 14
Barcode.cs Barcode 7
Convert.cs Convert 13
Edit.cs Edit 7
Excel.cs Excel 1
Extract.cs Extract 8
FindSearch.cs Find Search 2
Forms.cs Forms 2
Generate.cs Generate 6
Image.cs Image 13
MergeSplit.cs Merge & Split 5
Optimize.cs Optimize 1
Organize.cs Organize 5
Pdf.cs PDF 16
Pdf4me.cs PDF4me 1
Security.cs Security 2
Word.cs Word 2
Zugferd.cs ZUGFeRD 1

The same actions, with the same names and defaults, are in the Python and JavaScript clients.

All actions

Every action, by section. The method links to its documentation page where the docs have one; hover over a method in your editor for its parameters.

AI Document Extraction (14)

Method What it does
AiDocumentParserAsync Parse a document with the PDF4me AI parser and return the extracted content as JSON.
ProcessBankChequeAsync Extract structured data from a bank cheque.
ProcessBankStatementAsync Extract structured data (account, balances, transactions) from a bank statement.
ProcessContractAsync Extract structured data (parties, dates, terms) from a contract document.
ProcessCreditCardAsync Extract structured data from a credit card image or statement.
ProcessHealthCardAsync Extract structured data from a health insurance card.
ProcessInvoiceAsync Extract structured invoice data (parties, line items, totals, tax) from an invoice document.
ProcessMarriageCertificateAsync Extract structured data from a marriage certificate.
ProcessMortgageDocumentAsync Extract structured data from a mortgage document.
ProcessOrderAsync Extract structured purchase-order data from an order document.
ProcessPayStubAsync Extract structured payroll data (employer, employee, earnings, deductions) from a pay stub.
ProcessReceiptAsync Extract structured receipt data (merchant, line items, totals) from a receipt document.
ProcessShippingLabelAsync Extract structured shipping-label data (carrier, tracking number, sender and recipient) from a label.
ProcessTaxDocumentAsync Extract structured data from a tax document, optionally for a specific tax form model.

Barcode (7)

Method What it does
AddBarcodeAsync Add a barcode or QR code to your PDF document.
CreateBarcodeAsync Create Barcode or QR code image from text.
CreateSwissQrBillAsync Create a Swiss QR-bill payment part and add it to a PDF document, or return it as a standalone file.
ReadBarcodesAsync Reads and extracts barcode or QR code data from PDF.
ReadSwissQrBillAsync Read the Swiss QR-bill payment data contained in a PDF document.
CreateEpcQrCodeAsync Create an EPC (SEPA credit transfer) QR code image from the given payment details.
ReadBarcodesFromImageAsync Read the barcode or QR code contained in an image file.

Convert (13)

Method What it does
ConvertHtmlToPdfAsync Convert HTML pages to PDF.
ConvertJsonToExcelAsync Convert Json To Excel.
ConvertMdToPdfAsync Convert MD files to PDF.
ConvertPdfToExcelAsync Convert PDFs with tabular data into Excel spreadsheets.
ConvertPdfToPowerpointAsync Convert PDF into Powerpoint Presentation slides.
ConvertPdfToWordAsync Convert PDF documents to high quality editable Word files.
ConvertToPdfAsync Convert any type of office documents or images into PDFs.
ConvertUrlToPdfAsync Convert your URL file to PDF.
ConvertVisioAsync Convert Visio to any format.
ConvertWordToPdfFormAsync Convert a Word file to PDF with form controls intact.
CreatePdfAAsync Create PDFA compliant document.
FlattenPdfAsync Use Flatten to remove all form controls from the PDF file.
LinearizePdfAsync Linearize PDF.

Edit (7)

Method What it does
AddAttachmentToPdfAsync Attach files as attachment to the PDF file.
AddHtmlHeaderFooterAsync Add HTML content as header or footer or both to PDF file.
ImageStampAsync Add Image Watermark or Stamp to the PDF document.
AddMarginAsync Add Margins to the PDF document.
AddPageNumberAsync Add Page Numbers to PDF Pages.
StampAsync Add a background Text Watermark to PDF document.
SignPdfAsync Place a Sign to the PDF document.

Excel (1)

Method What it does
FindAndReplaceTextInExcelAsync Find and replace text in an Excel workbook, optionally restyling the replacement text.

Extract (8)

Method What it does
ClassifyDocumentAsync Classify or Identify documents based on the file content.
ExtractAttachmentFromPdfAsync Extract attachments from the PDF file.
ExtractPdfFormDataAsync Extract form data from the PDF.
ExtractResourcesAsync Extract text and images from the PDF document.
ExtractTableFromPdfAsync Extract Table as Json from PDF.
ExtractTextByExpressionAsync Extracts text from PDF using regular expression.
ExtractTextFromWordAsync Extract text from a Word file.
ParseDocumentAsync Parse or read content from PDF based on preconfigured templates.

Find Search (2)

Method What it does
FindAndReplaceAsync Find and replace text in PDF.
ConvertOcrPdfAsync Recognize text and create searchable PDF using OCR.

Forms (2)

Method What it does
AddFormFieldAsync Add a form field to a PDF document.
FillPdfFormAsync Fill a PDF form using JSON Data and return a single PDF.

Generate (6)

Method What it does
EnableTrackingChangesInWordAsync Enable track changes in Word file.
GenerateDocumentSingleAsync Generate Documents from DOCX, PDF or HTML template.
GenerateDocumentMultipleAsync Generate Document from Docx/PDF/Html.
GetTrackingChangesInWordAsync Get Tracked Changes In Word.
ReplaceTextWithImageInWordAsync Replace matching text in a Word document with an image.
GenerateDocumentSingleV2Async Generate a single document from a DOCX, PDF or HTML template and a JSON, XML or CSV data set.

Image (13)

Method What it does
AddImageWatermarkToImageAsync Draw a second image onto an image as a watermark, with control over position, rotation and opacity.
AddTextWatermarkToImageAsync Draw a text watermark onto an image, with control over font, colour, position, rotation and opacity.
CompressImageAsync Compresses an image based on image type and compression level.
ConvertImageFormatAsync Changes file format of an image file.
CreateImagesAsync Convert PDF pages into Images.
CropImageAsync Crop an image through border or rectangle.
FlipImageAsync Flip an image horizontally or vertically or both.
GetImageMetadataAsync Read the technical metadata of an image file: format, dimensions, resolution, EXIF and XMP presence.
ImageExtractTextAsync Run OCR on an image and return the recognised text.
RemoveExifTagsFromImageAsync Removes EXIF tags from images.
ResizeImageAsync Resize an image based on percentage or specific size.
RotateImageAsync Rotate an image by a given angle, with an optional background colour and proportionate resizing.
RotateImageByExifDataAsync Rotate an image so that it is displayed upright, using the orientation recorded in its EXIF data.

Merge & Split (5)

Method What it does
MergeAsync Merge multiple PDF documents into a single PDF document.
MergeOverlayAsync Merge two PDF documents one over another as Overlay.
SplitPdfAsync Split PDF by page number or recurring pages.
SplitPdfByBarcodeAsync Split PDF documents using barcode contained in them.
SplitByTextAsync Split PDF by recognizing specific text in them.

Optimize (1)

Method What it does
OptimizeAsync Optimize or Compress a PDF document.

Organize (5)

Method What it does
DeleteBlankPagesAsync Delete blank pages from the PDF document.
DeletePagesAsync Delete unwanted pages from the PDF document.
ExtractPagesAsync Extract required pages from a PDF document.
RotateAsync Rotate all the pages of a PDF document.
RotatePageAsync Rotate a specific page of a PDF document.

PDF (16)

Method What it does
MergeV3Async Merge multiple PDF documents into a single PDF document.
GetPdfMetadataAsync Get PDF Metadata.
RepairPdfAsync Recover broken PDFs partially or fully.
CreateHyperlinkAnnotationAsync Turn matching text in a PDF document into a hyperlink annotation pointing at the given URL.
DeleteHyperlinkAnnotationAsync Remove the hyperlink annotations from the selected pages of a PDF document.
DigitalSignPdfAsync Add digital sign to the PDF document.
ExtractHyperlinkAnnotationAsync List the hyperlink annotations contained in a PDF document, with the page they appear on.
GetDocumentByTextAsync Split a PDF into documents by locating a given text, and return the matching documents.
GetTextAndCoordinatesAsync Extract the text of a PDF document together with the position of each text fragment. textInfo carries the result as a JSON-encoded string.
GetTextByPositionAsync Extract the text contained in a rectangular region (x1/y1 to x2/y2) of the PDF pages.
HighlightTextAsync Highlight one or more pieces of text in a PDF document, each with its own highlight colour.
PrepareForPrintAsync Impose the pages of a PDF document onto a print-ready sheet layout (n-up), using a print profile, paper size and a rows/columns grid.
ReplaceTextWithImageAsync Replace text in the PDF file with an image.
ResizePdfAsync Change the page size of a PDF document, optionally adding padding around the existing content.
SetPdfMetadataAsync Set PDF metadata.
SignDocumentAsync Send a document into the PDF4me e-signature flow, notifying the signer by e-mail.

PDF4me (1)

Method What it does
UpdateHyperlinkAnnotationAsync Update the display text and/or target URL of existing hyperlink annotations in a PDF document.

Security (2)

Method What it does
ProtectAsync Protect PDF document with custom password.
UnlockAsync Removes password protection from a PDF file.

Word (2)

Method What it does
DisableTrackingChangesInWordAsync Disable track changes in Word file.
FindAndReplaceTextInWordAsync Find and replace text in a Word document, optionally restyling the replacement text.

ZUGFeRD (1)

Method What it does
CreateZugferdInvoiceAsync Create a ZUGFeRD / Factur-X electronic invoice from structured invoice data or from an XML, JSON or CSV source, optionally embedding it into a PDF/A document.

Migrating from 1.x

Version 2.0 replaces the whole library. Upgrading is not a drop-in change:

  • It talks to API v2. 1.x called the v1 endpoints (/Optimize/OptimizeByProfile and so on); 2.0 calls /api/v2/..., with the options the v2 documentation describes.
  • The singleton and the per-area clients are gone. Pdf4me.Instance.Init(token) and Pdf4me.Instance.OptimizeClient become one new Pdf4meClient(apiKey) with every action as a method on it.
  • The namespace is Pdf4me.Client, not Pdf4meClient.
  • Newtonsoft.Json is no longer a dependency. The vulnerable 12.0.3 that 1.x pulled in goes with it.
  • Errors are one type. Pdf4meApiException and Pdf4meBackendException become Pdf4meException.
  • .NET Framework 4.5.2 and 4.6.1 are no longer supported. The minimum is 4.6.2, through .NET Standard 2.0.
1.x 2.0
Pdf4me.Instance.Init(token) using var client = new Pdf4meClient(apiKey);
OptimizeClient.OptimizeByProfileAsync(file, profile) client.OptimizeAsync(file, profile: ...)
MergeClient.Merge2PdfsAsync(file1, file2) client.MergeAsync([file1, file2])
SplitClient.SplitByPageNrAsync(file, pageNr) client.SplitPdfAsync(file, splitActionNumber: pageNr)
ExtractClient.ExtractPagesAsync(file, pageNrs) client.ExtractPagesAsync(file, pageNumbers: pageNrs)
ConvertClient.ConvertFileToPdfAsync(file, fileName) client.ConvertToPdfAsync(file, docName: fileName)
PdfAClient.CreatePdfAAsync(file, compliance) client.CreatePdfAAsync(file, compliance: ...)
PdfAClient.RotateDocumentAsync(file, rotate) client.RotateAsync(file, rotationType: ...)
PdfAClient.ProtectDocumentAsync(file, password, perms) client.ProtectAsync(file, password: ..., pdfPermission: ...)
PdfAClient.UnlockDocumentAsync(file, password) client.UnlockAsync(file, password: ...)
PdfAClient.RepairDocumentAsync(file) client.RepairPdfAsync(file)
ImageClient.CreateThumbnailAsync(file, width, pageNr, fmt) client.CreateImagesAsync(file, new ImageAction { ... }, pageNrs: ...)

Step by step:

  1. Update the package: dotnet add package Pdf4me.Client --version 2.0.0. Your API key stays the same.
  2. Replace using Pdf4meClient; with using Pdf4me.Client;, and add using Pdf4me.Client.Generated.Models; where you use option or result models or catch Pdf4meException.
  3. Replace Pdf4me.Instance.Init(token) with one Pdf4meClient created at start-up and reused; dispose it on shutdown.
  4. Change each call to the client method from the table, passing options by name.
  5. Change catch (Pdf4meApiException) and catch (Pdf4meBackendException) to catch (Pdf4meException); the status code is ResponseStatusCode.

Before, with 1.x:

using Pdf4meClient;

Pdf4me.Instance.Init(token);
try
{
    byte[] optimized = await Pdf4me.Instance.OptimizeClient
        .OptimizeByProfileAsync(File.ReadAllBytes("input.pdf"), PdfOptimizationProfile.Max);
    byte[] merged = await Pdf4me.Instance.MergeClient
        .Merge2PdfsAsync(File.ReadAllBytes("a.pdf"), File.ReadAllBytes("b.pdf"));
}
catch (Pdf4meBackendException e)
{
    Console.Error.WriteLine(e.Message);
}

After, with 2.0:

using Pdf4me.Client;
using Pdf4me.Client.Generated.Models;

using var client = new Pdf4meClient(token);
try
{
    byte[] optimized = await client.OptimizeAsync(File.ReadAllBytes("input.pdf"), profile: OptimizeProfile.Max);
    byte[] merged = await client.MergeAsync([File.ReadAllBytes("a.pdf"), File.ReadAllBytes("b.pdf")]);
}
catch (Pdf4meException e)
{
    Console.Error.WriteLine($"{e.ResponseStatusCode}: {e.Message}");
}

The table covers the common calls; the sections table above says where to find everything else, and each method's documentation summary matches its docs page.

Contributing

Issues and pull requests are welcome on GitHub.

src/Pdf4me.Client/Generated/ is generated by Kiota from the PDF4me OpenAPI description and is replaced whole on every regeneration, so please open an issue for anything wrong in that tree rather than patching it. The client and the section files around it are hand-written and are the right place for a pull request.

dotnet build                 # the library for every target, and the tests
dotnet test                  # against a stub server: no API key, no network
dotnet pack -c Release src/Pdf4me.Client   # the NuGet package, into src/Pdf4me.Client/bin/Release

The tests call every action once against a stub server and check what it sends, so a new action is covered as soon as it exists. They also check that each short-named enum still matches the generated enum it mirrors, which a regeneration can change.

Support

Quote the TraceId from a Pdf4meException when reporting an API failure.

License

MIT

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  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 is compatible.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
2.0.0 68 10/13/2026
1.1.1 1,065 10/10/2024
1.1.0 1,012 5/14/2024
1.0.20 287 5/13/2024
1.0.19 285 5/13/2024
1.0.18 278 5/7/2024
1.0.17 238 5/2/2024
1.0.16 240 5/2/2024
1.0.15 281 4/19/2024
1.0.14 718 10/19/2023
1.0.13 604 10/19/2023
1.0.12 992 7/11/2023
1.0.11 1,292 11/12/2021
1.0.10 1,896 11/10/2021
1.0.9 1,059 11/9/2021
1.0.8 1,080 10/25/2021
1.0.7 1,143 9/10/2021
1.0.6 1,454 5/12/2020
1.0.5 1,683 3/20/2020
1.0.4 1,381 3/3/2020
Loading failed