- Generating ZUGFeRD invoice
- Adding ZUGFeRD structured data as attachment
- Complete code
- Extract ZUGFeRD invoice from PDF
- Validating ZUGFeRD invoices using Adobe Acrobat
Contact Support
Working with ZUGFeRD invoice
26 Mar 202514 minutes to read
The ZUGFeRD invoice is one of the uniformed data format for electronic invoices based on the ISO standard PDF/A-3, which is specifically designed for long term archiving. The ZUGFeRD invoice contains both human-readable invoice and machine-readable structured invoice data (XML).
Generating ZUGFeRD invoice
The Syncfusion® .NET PDF library supports creating PDF documents with PDF/A-3b conformance, allowing external files to be added as attachments. ZUGFeRD has three versions: ZugferdVersion 1.0, ZugferdVersion 2.0, and Factur-X.
ZUGFeRD includes six conformance levels:
- Basic: Represents structured data for simple invoices. Additional information can be included as free text.
- Comfort: Provides structured data for fully automated invoice processing.
- Extended: Includes additional structured data for exchanging invoices across different industry segments.
- Minimum: Represents basic invoice details compatible with the French Standard Factur-X.
- EN16931: Fully compliant with the EU Standard, though it only defines the core elements of an invoice.
- XRechnung: Aligns with Germany’s e-invoicing regulations, ensuring compliance with EN 16931 standards.
NOTE
The Minimum and EN16931 conformance levels are only supported in ZugferdVersion 2.0.
The XRechnung conformance level is only supported in Factur-X.
A PDF/A-3 file contains embedded XML data, making the invoice both human-readable (PDF) and machine-readable (XML) within the same document.
The ZUGFeRD invoice document can be created by specifying the conformance level as Pdf_A3B
through PdfConformanceLevel Enum when creating the new PDF document and set the ZugferdConformanceLevel property as Basic in ZugferdConformanceLevel Enum.
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic;
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic;
'Create ZUGFeRD invoice PDF document
Dim document As PdfDocument = New PdfDocument(PdfConformanceLevel.Pdf_A3B)
'Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic
Using PDF/A-3b conformance, you can create a ZUGFeRD invoice PDF by specifying the ZugferdVersion property as ZugferdVersion2_0 of ZugferdVersion Enum. By default, ZugferdVersion1.0 used.
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Specifies ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.ZugferdVersion2_0;
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Specifies ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.ZugferdVersion2_0;
'Create ZUGFeRD invoice PDF document
Dim document As PdfDocument = New PdfDocument(PdfConformanceLevel.Pdf_A3B)
'Specifies ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.ZugferdVersion2_0
Adding ZUGFeRD structured data as attachment
The PDF/A-3b conformance supports the external files as attachment to the PDF document using PdfAttachment class.
//Creates an attachment
FileStream fontStream = new FileStream("../../Data/ZUGFeRD-invoice.xml", FileMode.Open, FileAccess.Read);
PdfAttachment attachment = new PdfAttachment("ZUGFeRD-invoice.xml",invoiceStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = "ZUGFeRD-invoice";
attachment.MimeType = "application/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
//Creates an attachment
FileStream invoiceStream = new FileStream("../../Data/ZUGFeRD-invoice.xml", FileMode.Open, FileAccess.Read);
PdfAttachment attachment = new PdfAttachment("ZUGFeRD-invoice.xml",invoiceStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = "ZUGFeRD-invoice";
attachment.MimeType = "application/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
'Creates an attachment
Dim invoiceStream As FileStream = New FileStream("../../Data/ZUGFeRD-invoice.xml", FileMode.Open, FileAccess.Read)
Dim attachment As PdfAttachment = New PdfAttachment("ZUGFeRD-invoice.xml", invoiceStream)
attachment.Relationship = PdfAttachmentRelationship.Alternative
attachment.ModificationDate = DateTime.Now
attachment.Description = "ZUGFeRD-invoice"
attachment.MimeType = "application/xml"
//Add attachment to PDF document
document.Attachments.Add(attachment)
NOTE
XML Naming Guidelines
NOTE
As per the ZUGFeRD standard guidelines, the XML file name must follow the specified format:
NOTE
- ZUGFeRD 1.0: The file name should be “ZUGFeRD-invoice.xml”.
- ZUGFeRD 2.0: The file name should be “zugferd-invoice.xml”.
- Factur-X: The file name should be “factur-x.xml”, except for XRechnung, where the file name must be “xrechnung.xml”.
Using PDF/A-3b conformance, you can create a ZUGFeRD invoice PDF by specifying the ZugferdVersion property as Factur-X in the ZugferdVersion Enum.
//Create a new PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.XRechnung;
//Set ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.FacturX;
// Load the font file as stream
FileStream fontStream = new FileStream(@"xrechnung.xml", FileMode.Open, FileAccess.Read);
//Set an attachment
PdfAttachment attachment = new PdfAttachment(@"xrechnung.xml", fontStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = " ZUGFeRD-Xrechnung";
attachment.MimeType = "text/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
//Save the document into stream
MemoryStream stream = new MemoryStream();
document.Save(stream);
stream.Position = 0;
//Closes the document
document.Close(true);
//Create a new PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.XRechnung;
//Set ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.FacturX;
// Load the font file as stream
FileStream fontStream = new FileStream(@"xrechnung.xml", FileMode.Open, FileAccess.Read);
//Set an attachment
PdfAttachment attachment = new PdfAttachment(@"xrechnung.xml", fontStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = " ZUGFeRD-Xrechnung";
attachment.MimeType = "text/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
//Save the document
document.Save("Output.pdf");
//Closes the document
document.Close(true);
' Create a new PDF document
Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A3B)
' Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.XRechnung
' Set ZUGFeRD version
document.ZugferdVersion = ZugferdVersion.FacturX
' Load the file as stream
Dim fontStream As New FileStream("xrechnung.xml", FileMode.Open, FileAccess.Read)
' Set an attachment
Dim attachment As New PdfAttachment("xrechnung.xml", fontStream)
attachment.Relationship = PdfAttachmentRelationship.Alternative
attachment.ModificationDate = DateTime.Now
attachment.Description = "ZUGFeRD-Xrechnung"
attachment.MimeType = "text/xml"
' Add attachment to PDF document
document.Attachments.Add(attachment)
' Save the document
document.Save("Output.pdf")
' Closes the document
document.Close(True)
You can download a complete working sample from GitHub.
Complete code
The complete code to create ZUGFeRD invoice PDF document as follows.
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic;
//Creates an attachment
FileStream fontStream = new FileStream("../../ Data / ZUGFeRD - invoice.xml", FileMode.Open, FileAccess.Read);
PdfAttachment attachment = new PdfAttachment("ZUGFeRD-invoice.xml",invoiceStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = "ZUGFeRD-invoice";
attachment.MimeType = "application/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
//Creating the stream object
MemoryStream stream = new MemoryStream();
//Save the document into memory stream
document.Save(stream);
//If the position is not set to '0', then the PDF will be empty
stream.Position = 0;
//Close the document
document.Close(true);
//Defining the ContentType for PDF file
string contentType = "application/pdf";
//Define the file name
string fileName = "Zugferd.pdf";
//Creates a FileContentResult object by using the file contents, content type, and file name
return File(stream, contentType, fileName);
//Create ZUGFeRD invoice PDF document
PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B);
//Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic;
//Creates an attachment
FileStream invoiceStream = new FileStream("../../ Data / ZUGFeRD - invoice.xml", FileMode.Open, FileAccess.Read);
PdfAttachment attachment = new PdfAttachment("ZUGFeRD-invoice.xml",invoiceStream);
attachment.Relationship = PdfAttachmentRelationship.Alternative;
attachment.ModificationDate = DateTime.Now;
attachment.Description = "ZUGFeRD-invoice";
attachment.MimeType = "application/xml";
//Add attachment to PDF document
document.Attachments.Add(attachment);
//Save and close the document
document.Save("Zugferd.pdf");
document.Close(true);
'Create ZUGFeRD invoice PDF document
Dim document As PdfDocument = New PdfDocument(PdfConformanceLevel.Pdf_A3B)
'Set ZUGFeRD conformance level
document.ZugferdConformanceLevel = ZugferdConformanceLevel.Basic
'Creates an attachment
Dim invoiceStream As FileStream = New FileStream("../../ Data / ZUGFeRD - invoice.xml", FileMode.Open, FileAccess.Read)
Dim attachment As PdfAttachment = New PdfAttachment("ZUGFeRD-invoice.xml",invoiceStream)
attachment.Relationship = PdfAttachmentRelationship.Alternative
attachment.ModificationDate = DateTime.Now
attachment.Description = "ZUGFeRD-invoice"
attachment.MimeType = "application/xml"
//Add attachment to PDF document
document.Attachments.Add(attachment)
'Save and close the document
document.Save("Zugferd.pdf")
document.Close(True)
You can download a complete working sample from GitHub.
Extract ZUGFeRD invoice from PDF
You can extract the ZUGFeRD invoice using PdfAttachment class.
//Get stream from an existing PDF document.
FileStream docStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read);
//Load the PDF document.
PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream);
//Iterates the attachments.
foreach (PdfAttachment attachment in loadedDocument.Attachments)
{
//Extracts the ZUGFeRD invoice attachment and saves it to the disk.
FileStream s = new FileStream("Output/" + attachment.FileName, FileMode.Create, FileAccess.Write);
s.Write(attachment.Data, 0, attachment.Data.Length);
s.Dispose();
}
//Close the PDF document.
loadedDocument.Close(true);
//Loads the PDF document
PdfLoadedDocument document = new PdfLoadedDocument("Sample.pdf");
//Iterates the attachments
foreach (PdfAttachment attachment in document.Attachments)
{
//Extracts the ZUGFeRD invoice attachment and saves it to the disk
FileStream s = new FileStream(attachment.FileName, FileMode.Create);
s.Write(attachment.Data, 0, attachment.Data.Length);
s.Dispose();
}
//Saves and closes the document
document.Save("Output.pdf");
document.Close(true);
'Loads the PDF document
Dim document As New PdfLoadedDocument("Sample.pdf")
'Iterates the attachments
For Each attachment As PdfAttachment In document.Attachments
'Extracts the attachment and saves it to the disk
Dim s As New FileStream(attachment.FileName, FileMode.Create)
s.Write(attachment.Data, 0, attachment.Data.Length)
s.Dispose()
Next
'Saves and closes the document
document.Save("Output.pdf")
document.Close(True)
You can download a complete working sample from GitHub.
Validating ZUGFeRD invoices using Adobe Acrobat
The ZUGFeRD invoices can be validated as follows:
-
Conformance to the PDF/A-3b standard can be checked with Preflight function in Adobe acrobat.
-
Open the PDF and choose Tools > Print Production > Preflight in the right pane.
-
Select the PDF/A-3b profile and click the Analyze button.
-
* Check the result
-
Conformance to the ZUGFeRD invoice can be checked as follows:
-
Open the PDF and choose Tools > Print Production > Preflight in the right pane.
-
Select the ZUGFeRD profile and click the Analyze button.
-
* Check the result