Versions and Release Notes
Here you'll find the most important changes in the current and upcoming FactoorSharp versions.
Version 19.1
CurrentVersion 19.1 renders invoices as HTML, supports advance payments and VAT in a foreign currency, extracts text from PDFs together with its position, and detects the invoice format even more reliably.
What's new in detail:
-
Display invoices as HTML VisualizationInvoices can now be rendered as HTML as well as PDF – either as a standalone page or as a building block you embed directly into your web or desktop application. Delivery note, order reference and product characteristics are now shown too.
// Invoice as a standalone HTML page string html = InvoiceVisualizer.RenderHtml(invoice); // Or as a fragment to embed into an existing page string fragment = InvoiceVisualizer.RenderHtml(invoice, options: new HtmlRenderOptions { Standalone = false }); // The PDF output is now called RenderPdf() InvoiceVisualizer.RenderPdf(invoice, "invoice.pdf"); ' Invoice as a standalone HTML page Dim html As String = InvoiceVisualizer.RenderHtml(invoice) ' Or as a fragment to embed into an existing page Dim fragment As String = InvoiceVisualizer.RenderHtml(invoice, options:=New HtmlRenderOptions With {.Standalone = False}) ' The PDF output is now called RenderPdf() InvoiceVisualizer.RenderPdf(invoice, "invoice.pdf") -
Itemize advance payments (BG-X-45) CoreAdvance payments already received can be listed individually in the EXTENDED profile – with amount, payment date, included VAT and a reference to the related prepayment invoice.
// Advance payment with included VAT and a reference to the prepayment invoice invoice.AddAdvancePayment(2975m, new DateTime(2026, 6, 7)) .SetInvoiceReferencedDocument("PI-2026-0601", new DateTime(2026, 6, 1), InvoiceType.PartialInvoice) .AddIncludedTradeTax(475m, 19m, TaxTypes.VAT, TaxCategoryCodes.S); ' Advance payment with included VAT and a reference to the prepayment invoice invoice.AddAdvancePayment(2975D, New DateTime(2026, 6, 7)) _ .SetInvoiceReferencedDocument("PI-2026-0601", New DateTime(2026, 6, 1), InvoiceType.PartialInvoice) _ .AddIncludedTradeTax(475D, 19D, TaxTypes.VAT, TaxCategoryCodes.S) -
VAT in a foreign currency with exchange rate (BG-X-41) CoreFor invoices in a foreign currency, you now set the VAT accounting currency (BT-6), the VAT amount in that currency (BT-111) and the exchange rate in a single step – exactly as EN 16931 expects.
// Invoice in USD, VAT additionally stated in euros invoice.SetTaxCurrencyExchange(taxTotalInAccountingCurrency: 175.08m, accountingCurrency: CurrencyCodes.EUR, conversionRate: 0.9215m, conversionRateTimestamp: new DateTime(2026, 9, 1)); ' Invoice in USD, VAT additionally stated in euros invoice.SetTaxCurrencyExchange(taxTotalInAccountingCurrency:=175.08D, accountingCurrency:=CurrencyCodes.EUR, conversionRate:=0.9215D, conversionRateTimestamp:=New DateTime(2026, 9, 1)) -
Electronic address for every party (BT-34, BT-49, BT-X-160) CoreNot just seller and buyer, but also the ship-to party and other parties can now carry an electronic address, such as an email address. The information is fully preserved when reading invoices.
// Electronic address of the ship-to party invoice.ShipTo.ElectronicAddress = new ElectronicAddress { Address = "goods-in@customer.com", ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp }; ' Electronic address of the ship-to party invoice.ShipTo.ElectronicAddress = New ElectronicAddress With { .Address = "goods-in@customer.com", .ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp } -
Extract text from PDFs with its position PDFYou can now extract text runs from the visible content of a PDF together with page, position and font size, for example to pick a value from a specific table column. Plain text extraction also reproduces the page layout much more faithfully.
foreach (PdfTextFragment fragment in PdfUtils.ExtractTextFragments("invoice.pdf")) { // Page, position in points and text Console.WriteLine($"Page {fragment.PageNumber}, x={fragment.X:0}, y={fragment.Y:0}: {fragment.Text}"); } For Each fragment As PdfTextFragment In PdfUtils.ExtractTextFragments("invoice.pdf") ' Page, position in points and text Console.WriteLine($"Page {fragment.PageNumber}, x={fragment.X:0}, y={fragment.Y:0}: {fragment.Text}") Next -
More details for invoice lines (BT-158-1, BT-X-98) CoreItems can now be classified using every classification scheme defined by EN 16931, such as UNSPSC or eCl@ss. In the EXTENDED profile you can also state the total of allowances and charges per line.
// Classify the item by UNSPSC item.AddDesignatedProductClassification(DesignatedProductClassificationClassCodes.TST, classCode: "43211503"); // Total of allowances and charges on this line (EXTENDED only) item.TotalAllowanceChargeAmount = 12.50m; ' Classify the item by UNSPSC item.AddDesignatedProductClassification(DesignatedProductClassificationClassCodes.TST, classCode:="43211503") ' Total of allowances and charges on this line (EXTENDED only) item.TotalAllowanceChargeAmount = 12.5D -
More reliable invoice format detection CoreWhether a file is a ZUGFeRD/Factur-X or a UBL invoice is now determined unambiguously from the structure of the document. As a result, invoices from senders that state no or a not yet known specification identifier (BT-24) can be read as well.
-
Current XRechnung validation rules 2.6.0 ValidationLocal validation now uses the current KoSIT rules 2.6.0 for XRechnung 3.0.2. Please note: a violation of rule BR-TMP-2 is now reported as an error instead of a warning. In addition, invoices whose XML is embedded uncompressed in the PDF are validated, and unreadable attachments show up as a clear validation finding.
-
More thorough checks of amounts and totals ValidationThe built-in invoice check now verifies line amounts, allowances and charges, VAT amounts and the amount due much more precisely against the EN 16931 rules – including advance payments, rounding amounts and price base quantities (BT-149).
-
Bug fixes for valid invoices CoreSeveral bugs that could lead to invalid or incomplete invoices have been fixed: no exemption reason is written for zero-rated supplies (category Z) anymore (BR-Z-10), MINIMUM invoices no longer contain an electronic address that is not allowed there, empty IBAN details are omitted, UBL prices keep all their decimal places, and the receiving advice reference (BT-15) is read and written correctly in UBL.
Version 19.0
Version 19.0 introduces free, local invoice validation, improves how XRechnung price details and PDF attachments are handled, and hardens FactoorSharp against crafted documents.
Highlights
Version 18.5
Version 18.5 introduces support for invoicing periods, improves how payment terms are handled, and fixes several bugs around ZUGFeRD 2.0 and 2.5.
Highlights
Version 18.4
Version 18.4 introduces a new visualization component and fixes a number of bugs in working with ZUGFeRD 2.5.
Highlights
Version 18.3
Version 18.3 adds support for ZUGFeRD 2.5 and extends validation to Italian and Spanish invoices.
Highlights
Version 18.2
Version 18.2 extends PDF processing further and improves quota management for validation.
Highlights
Version 18.1
Version 18.1 extends FactoorSharp's PDF processing further and adds signing support for all .NET target platforms.
Highlights
Version 18.0
Version 18.0 is the first published release of FactoorSharp. It forms the stable foundation for working with ZUGFeRD, Factur-X and XRechnung in modern .NET applications.