Test in einer Live-Umgebung
Test in der Produktion ohne Wasserzeichen.
Funktioniert überall, wo Sie es brauchen.
NServiceBus ist ein leistungsfähiger und anpassungsfähiger Servicebus für das .NET-Framework, der die Entwicklung verteilter Systeme rationalisiert. Die starken Messaging-Muster, die es bietet, garantieren eine zuverlässige Nachrichtenverarbeitung und -übermittlung über mehrere Microservices und Anwendungen hinweg. NServiceBus abstrahiert die zugrunde liegende Messaging-Architektur, so dass sich die Entwickler auf die Geschäftslogik konzentrieren können, anstatt sich mit den Feinheiten des Aufbaus verteilter Systeme auseinanderzusetzen.
IronPDF hingegen ist eine beliebte .NET-Bibliothek zum Erzeugen, Anzeigen und Ändern von PDF-Dateien. Es ist dafür bekannt, dass es einfach zu bedienen und sehr effizient bei der Erstellung von PDFs aus verschiedenen Quellen, wie ASPX-Dateien und HTML, ist.
Entwickler können durch die Kombination von NServiceBus und IronPDF zuverlässige, skalierbare und wartbare Softwaresysteme aufbauen, die PDF-Dokumente als Teil ihrer Geschäftsabläufe erzeugen und verwalten können.
In diesem Artikel erfahren Sie, wie Sie ein einfaches C# NServiceBus-Projekt einrichten und in IronPDF integrieren, um einen optimierten Workflow für die Verwaltung und Erstellung von PDF-Dokumenten in einer verteilten Anwendungsarchitektur aufzubauen. Nach der Lektüre dieses Einführungslehrgangs sollten Sie genau wissen, wie diese beiden effektiven Technologien zusammenarbeiten können, um Ihre PDF-bezogenen Aufgaben in einer verteilten Umgebung zu vereinfachen.
NServiceBus ist ein leistungsfähiges und anpassungsfähiges Framework, das die Erstellung verteilter Systeme und serviceorientierter .NET-Architekturen erleichtert. Durch den Einsatz von NServiceBus können Sie verschiedene Nachrichtentypen einfach verwalten und eine zuverlässige Kommunikation sicherstellen. Dies ist vor allem bei Webanwendungen und ähnlichen Architekturen von entscheidender Bedeutung, bei denen eine nahtlose Weiterleitung und Verarbeitung von Nachrichten unerlässlich ist. Die Message-Handler von NServiceBus kümmern sich effektiv um den Empfang von Nachrichten und stellen sicher, dass jede logische Komponente reibungslos interagiert. NServiceBus hat die folgenden wichtigen Eigenschaften:
NServiceBus fördert die nachrichtenbasierte Kommunikation zwischen verschiedenen Diensten oder Komponenten in einem System. Durch die Entkopplung von Komponenten schafft diese Methode Entwürfe, die einfacher zu skalieren und zu verwalten sind.
Durch die automatische Verwaltung von Wiederholungsversuchen, Dead-Letter-Queues und anderen Fehlertoleranztechniken wird eine zuverlässige Nachrichtenzustellung gewährleistet. In verteilten Systemen, in denen es häufig zu Netzausfällen und anderen Problemen kommt, ist diese Zuverlässigkeit unerlässlich.
Das Publish/Subscribe-Muster wird von NServiceBus unterstützt und ermöglicht es Diensten, Ereignisse zu veröffentlichen und andere Dienste diese Ereignisse abonnieren zu lassen. Dadurch werden ereignisgesteuerte Architekturen möglich, bei denen Änderungen an Ereignissen in einer Komponente des Systems Reaktionen in anderen Komponenten hervorrufen können.
Langlaufende Geschäftsprozesse können mit NServiceBus dank der integrierten Unterstützung von Sagas verwaltet werden. Sagas ermöglichen der Serviceplattform die Verwaltung des Zustands und die Koordinierung komplizierter Vorgänge zwischen mehreren Diensten.
Es bietet ein außergewöhnliches Maß an Erweiterbarkeit, das es Entwicklern ermöglicht, die Handhabung, Verarbeitung und den Transport von Nachrichten zu personalisieren. Aufgrund seiner Anpassungsfähigkeit kann es in einer Vielzahl von Szenarien eingesetzt werden.
Zahlreiche Messaging-Systeme, einschließlich MSMQ, RabbitMQ, Azure Service Bus, Amazon SQS und andere, können in NServiceBus integriert werden. So können Entwickler die Kommunikationsinfrastrukturlösung auswählen, die ihren Anforderungen am besten entspricht.
Sie müssen zunächst Ihre Entwicklungsumgebung einrichten, ein grundlegendes Projekt erstellen und einen grundlegenden Messaging-Dienst und ein Szenario erstellen, bevor Sie NServiceBus in einem C#-Projekt verwenden können. Hier finden Sie eine Schritt-für-Schritt-Anleitung, damit Sie loslegen können.
In Visual Studio ist das Erstellen eines Konsolenprojekts sehr einfach. Mit diesen einfachen Schritten können Sie in der Visual Studio-Umgebung eine Konsolenanwendung starten:
Stellen Sie sicher, dass Sie Visual Studio auf Ihrem PC installiert haben, bevor Sie es verwenden.
Klicken Sie auf Datei, dann auf Neu und schließlich auf Projekt.
Sie können die "Konsolen-App" oder die "Konsolen-App" auswählen(.NET Core)vorlage" aus der Liste der Projektvorlagen-Referenzen unten.
Geben Sie einen Namen für Ihr Projekt in das Feld "Name" ein.
Wählen Sie einen Speicherort für das Projekt.
Wenn Sie auf "Erstellen" klicken, wird das Projekt der Konsolenanwendung gestartet.
Navigieren Sie zu Extras > NuGet Package Manager > Package Manager Console, um die NuGet Package Manager Console zu öffnen.
Führen Sie den folgenden Befehl aus, um das NServiceBus NuGet-Paket zu installieren.
Install-Package NServiceBus
Install-Package NServiceBus
IRON VB CONVERTER ERROR developers@ironsoftware.com
Der Transport wird von NServiceBus benötigt, um Nachrichten zu empfangen und zu senden. Wir bleiben beim Learning Transport, da er einfach zu bedienen ist und sich gut für Tests und Entwicklung eignet.
Installieren Sie das Paket für Learning Transport, indem Sie es ausführen.
Install-Package NServiceBus.RabbitMQ
Install-Package NServiceBus.RabbitMQ
IRON VB CONVERTER ERROR developers@ironsoftware.com
Legen Sie die NServiceBus-Endpunktkonfiguration in Ihrer Program.cs-Datei fest:
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new MyMessage
{
Content = "Hello, NServiceBus with RabbitMQ!"
};
await endpointInstance.Send("ReceiverEndpoint", message)
.ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new MyMessage
{
Content = "Hello, NServiceBus with RabbitMQ!"
};
await endpointInstance.Send("ReceiverEndpoint", message)
.ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Um die Nachricht darzustellen, fügen Sie eine neue Klasse hinzu.
public class MyMessage : IMessage
{
public string Content { get; set; }
}
public class MyMessage : IMessage
{
public string Content { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Fügen Sie eine neue Klasse hinzu, um die Nachricht zu bearbeiten.
using NServiceBus;
using System.Threading.Tasks;
public class MyMessageHandler : IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message: {message.Content}");
return Task.CompletedTask;
}
}
using NServiceBus;
using System.Threading.Tasks;
public class MyMessageHandler : IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message: {message.Content}");
return Task.CompletedTask;
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Senden Sie eine Nachricht vom Endpunkt aus. Passen Sie Ihre primäre Methode zur Übermittlung einer Nachricht mit Hilfe des Handlers an.
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology(QueueType.Quorum);
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology(QueueType.Quorum);
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Starten Sie die Anwendung und erstellen Sie das Projekt. Die Konsole sollte die Meldung "Received message: Hallo, NServiceBus!"
In einem C#-Projekt beinhaltet die Integration von NServiceBus mit RabbitMQ und IronPDF die Konfiguration von Nachrichten zwischen NServiceBus und RabbitMQ sowie die Verwendung von IronPDF zur Erstellung von PDFs. Hier finden Sie eine ausführliche Anleitung, damit Sie loslegen können:
IronPDF ist eine .NET-Bibliothek, die für das Erstellen, Lesen, Bearbeiten und Konvertieren von PDF-Dateien entwickelt wurde. Damit können Programmierer mit PDF-Dateien in C#- oder VB.NET-Anwendungen mit einem leistungsstarken und intuitiven Werkzeug arbeiten. Die Eigenschaften und Möglichkeiten von IronPDF werden im Folgenden ausführlich beschrieben:
PDF-Erzeugung aus HTML
Konvertieren Sie JavaScript, HTML und CSS in PDF. Unterstützt Media-Queries und Responsive Design, zwei moderne Webstandards. Nützlich für die Erstellung dynamisch gestalteter PDF-Dokumente, Rechnungen und Berichte mit HTML und CSS.
PDF-Bearbeitung
Zu bereits vorhandenen PDFs können Sie Text, Bilder und anderes Material hinzufügen. Entfernen Sie Text und Bilder aus PDF-Dateien. Kombinieren Sie mehrere PDFs in einer Datei. PDF-Dateien in mehrere Dokumente aufteilen. Fügen Sie Anmerkungen, Fußzeilen, Kopfzeilen und Wasserzeichen ein.
PDF-Konvertierung
Konvertieren Sie Word, Excel, Bilder und andere Dateiformate in PDF. Umwandlung von PDF in Bilder(PNG, JPEG, usw.).
Leistung und Verlässlichkeit
Hohe Leistung und Zuverlässigkeit sind die Konstruktionsziele in Produktionsumgebungen. Effiziente Verwaltung großer Dokumente.
Installieren Sie IronPDF, indem Sie die NuGet Package Manager-Konsole öffnen.
Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
Nachrichten sind ein gemeinsames Projekt(klassenbibliothek) die sowohl der Absender als auch der Empfänger verwenden werden. Definieren Sie die Nachrichtenklasse im Projekt Messages. Erstellen Sie ein neues Klassenbibliotheksprojekt mit dem Namen Messages und fügen Sie es der Lösung hinzu.
Definieren Sie die Nachricht:
Erstellen Sie im Projekt Messages eine neue Klasse namens GeneratePdfMessage.cs:
using NServiceBus;
public class GeneratePdfMessage : IMessage
{
public string Content { get; set; }
public string OutputPath { get; set; }
}
using NServiceBus;
public class GeneratePdfMessage : IMessage
{
public string Content { get; set; }
public string OutputPath { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Fügen Sie sowohl im Sender- als auch im Empfängerprojekt einen Verweis auf das Projekt Nachrichten ein.
Richten Sie den NServiceBus-Endpunkt im Sender-Projekt ein, um RabbitMQ für die Nachrichtenübermittlung zu verwenden.
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new GeneratePdfMessage
{
Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
OutputPath = "output.pdf"
};
await endpointInstance.Send("ReceiverEndpoint", message)
.ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new GeneratePdfMessage
{
Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
OutputPath = "output.pdf"
};
await endpointInstance.Send("ReceiverEndpoint", message)
.ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Endpunktkonfiguration: Der Endpunkt wird durch den Aufruf von new EndpointConfiguration mit dem Namen "SenderEndpoint" initialisiert("SenderEndpunkt").
endpointConfiguration ist die Transportkonfiguration. Bei der Verbindung mit einer lokalen RabbitMQ-Instanz wird die Methode UseTransport() richtet NServiceBus für die Verwendung von RabbitMQ als Transportmechanismus ein.
Audit- und Fehlerwarteschlangen Wohin fehlgeschlagene Nachrichten und verarbeitete Nachrichten gesendet werden sollen, wird mit SendFailedMessagesTo konfiguriert("Fehler") und AuditProcessedMessagesTo("Prüfung").
Nachricht gesendet: endpointInstance.A GeneratePdfMessage wird über die Sendedatei an den "ReceiverEndpoint" gesendet("ReceiverEndpoint", Nachricht) funktion.
Richten Sie den NServiceBus-Endpunkt im Receiver-Projekt ein, um Nachrichten über RabbitMQ zu akzeptieren und PDFs mit IronPDF zu erzeugen.
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop()
.ConfigureAwait(false);
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
Diese Einrichtung für den Empfänger-Endpunkt "ReceiverEndpoint" ist vergleichbar mit der Sender-Konfiguration.
Erstellen Sie im Receiver-Projekt eine neue Klasse namens GeneratePdfMessageHandler.cs.
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;
public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message to generate PDF with content: {message.Content}");
// Generate PDF
var renderer = new HtmlToPdf();
var pdf = renderer.RenderHtmlAsPdf(message.Content);
pdf.SaveAs(message.OutputPath);
Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");
return Task.CompletedTask;
}
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;
public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message to generate PDF with content: {message.Content}");
// Generate PDF
var renderer = new HtmlToPdf();
var pdf = renderer.RenderHtmlAsPdf(message.Content);
pdf.SaveAs(message.OutputPath);
Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");
return Task.CompletedTask;
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
GeneratePdfMessage, das den InterfaceHandler IHandleMessages verwendet, gibt an, dass es Nachrichten des TypsGeneratePdfMessage durch Implementierung einer Schnittstelle für IHandleMessages.
Manage Approach: Nach Erhalt der Nachricht erstellt die Funktion Handle mit IronPDF eine PDF-Datei. Der HTML-Inhalt der Nachricht wird durch den HtmlToPdf-Renderer-Code in ein PDF-Dokument umgewandelt und im angegebenen Ausgabepfad gespeichert.
NServiceBus kann mit RabbitMQ und IronPDF in C# integriert werden, um eine skalierbare und stabile Lösung für verteilte Systeme zu bieten, die PDFs dynamisch und zuverlässig erzeugen müssen. Diese Kombination nutzt die Fähigkeiten von NServiceBus zur Nachrichtenverarbeitung, die Zuverlässigkeit und Anpassungsfähigkeit von RabbitMQ als Message Broker und die robusten PDF-Bearbeitungswerkzeuge von IronPDF. Die daraus resultierende Architektur gewährleistet die Entkopplung zwischen den Diensten und ermöglicht eine autonome Entwicklung und Skalierbarkeit.
RabbitMQ stellt die Zustellung von Nachrichten auch bei Netzwerk- oder Anwendungsausfällen sicher. NServiceBus vereinfacht die Weiterleitung und Verarbeitung von Nachrichten, und IronPDF ermöglicht die Umwandlung von HTML-Text in hochwertige PDF-Dokumente. Diese Integration bietet einen flexiblen Rahmen für die Entwicklung anspruchsvoller, umfangreicher Anwendungen und verbessert darüber hinaus die Wartbarkeit und Zuverlässigkeit des Systems.
Wenn Sie IronPDF und Iron Software zu Ihrem Toolkit für die .NET-Programmierung hinzufügen, können Sie effektiv mit Barcodes arbeiten, PDFs erzeugen, OCR durchführen und mit Excel verknüpfen. IronPDFs Lizenzierungsseite, das bei $749 beginnt, nahtlos seine Funktionen mit der Leistung, Kompatibilität und Benutzerfreundlichkeit von Offizielle Website von Iron Softwaresuite, um zusätzliche Webanwendungen und -funktionen sowie eine effizientere Entwicklung zu ermöglichen.
Wenn es klar definierte Lizenzoptionen gibt, die auf die spezifischen Anforderungen des Projekts zugeschnitten sind, können die Entwickler das optimale Modell mit Sicherheit auswählen. Diese Vorteile ermöglichen es Entwicklern, eine Reihe von Schwierigkeiten effektiv und transparent zu bewältigen.
9 .NET API-Produkte für Ihre Bürodokumente