Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Migrieren von PDFmyURL zu IronPDF in C#

Migrieren von PDFmyURLzu IronPDF: Ein kompletter C#-Entwicklerleitfaden

PDFmyURL ist ein Cloud-basierter API-Dienst zur Konvertierung von URLs und HTML-Inhalten in PDF-Dokumente. Der Dienst verarbeitet alle Konvertierungen auf externen Servern und bietet einen unkomplizierten Integrationspfad, der nur eine minimale lokale Infrastruktur erfordert. Diese von der Cloud abhängige Architektur wirft jedoch erhebliche Probleme für Produktionsanwendungen auf, die mit sensiblen Daten umgehen, Offline-Funktionen benötigen oder laufende Abonnementkosten vermeiden müssen.

Dieser Leitfaden bietet einen vollständigen Migrationspfad von PDFmyURLzu IronPDF, mit Schritt-für-Schritt-Anleitungen, Code-Vergleichen und praktischen Beispielen für professionelle .NET-Entwickler, die diesen Übergang evaluieren.

Warum von PDFmyURLmigrieren

Das Cloud-Verarbeitungsmodell von PDFmyURLbringt einige Herausforderungen mit sich, die die Entwicklerteams berücksichtigen müssen:

Datenschutz und Datensicherheit: Jedes Dokument, das Sie konvertieren, wird auf die Server von PDFmyURLübertragen und dort verarbeitet - sensible Verträge, Finanzberichte und persönliche Daten werden extern verarbeitet.

Laufende Abonnementkosten: Die jährlichen Kosten beginnen bei 39 $/Monat und betragen mehr als 468 $/Jahr, ohne dass Sie Eigentümer sind. Dieses Abonnementmodell bedeutet kontinuierliche Ausgaben unabhängig vom Nutzungsverhalten.

Internetabhängigkeit: Jede Konvertierung erfordert eine Netzwerkanbindung. Die Anwendungen können PDFs nicht offline oder während eines Netzwerkausfalls verarbeiten.

Rate Limits & Throttling: API-Aufrufe können bei Spitzenbelastungen gedrosselt werden, was die Anwendungsleistung beeinträchtigen kann.

Dienstverfügbarkeit: Ihre Anwendung hängt davon ab, dass ein Dienst eines Drittanbieters online und funktionsfähig ist.

Vendor Lock-in: API-Änderungen können Ihre Integration ohne Vorankündigung unterbrechen und erfordern reaktive Code-Aktualisierungen.

IronPDFvs. PDFmyURL: Vergleich der Funktionen

Das Verständnis der architektonischen Unterschiede hilft technischen Entscheidungsträgern, die Investition in die Migration zu bewerten:

Aspekt PDFmyURL IronPDF
Bearbeitungsort Externe Server Lokal (Ihr Server)
Typ API Wrapper .NET-Bibliothek
Authentifizierung API-Schlüssel pro Anfrage Einmaliger Lizenzschlüssel
Netzwerk erforderlich Jede Konvertierung Nur Ersteinrichtung
Preismodell Monatliches Abonnement ($39+) Unbefristete Lizenz verfügbar
Ratengrenzen Ja (planabhängig) Keine
Datenschutz Extern gesendete Daten Daten bleiben lokal
HTML/CSS/JS-Unterstützung W3C-konform Vollständige Chromium-Engine
Async-Muster Erforderlich (nur async) Sync- und async-Optionen
PDF-Bearbeitung Beschränkt Vollständige Suite (zusammenführen, aufteilen, bearbeiten)
Anwendungsfall Geringfügige Anwendungen Großes Volumen und Unternehmen

Schnellstart: PDFmyURLzuIronPDFMigration

Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.

Schritt 1: Ersetzen von NuGet-Paketen

PDFmyURL-Pakete entfernen:

# Remove PDFmyURLpackages
dotnet remove package PdfMyUrl
dotnet remove package Pdfcrowd
# Remove PDFmyURLpackages
dotnet remove package PdfMyUrl
dotnet remove package Pdfcrowd
SHELL

IronPDF installieren:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

Schritt 2: Namespaces aktualisieren

Ersetzen Sie die Namensräume von PDFmyURLdurch IronPDF:

// Before: PDFmyURL
using PdfMyUrl;
using Pdfcrowd;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PDFmyURL
using PdfMyUrl;
using Pdfcrowd;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Schritt 3: Lizenz initialisieren

Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Beispiele für die Code-Migration

Konvertierung von URLs zu PDF

Die URL-zu-PDF-Operation demonstriert die grundlegenden API-Unterschiede zwischen PDFmyURLund IronPDF.

PDFmyURL-Ansatz:

// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.convertUrlToFile("https://example.com", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.convertUrlToFile("https://example.com", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL erfordert die Erstellung eines HtmlToPdfClientmit Benutzernamen und API-Schlüssel für jede Konvertierungsanfrage und den anschließenden Aufruf von convertUrlToFile() mit der URL und dem Ausgabepfad. Der gesamte Vorgang muss in try-catch für den benutzerdefinierten Fehler-Typ von PDFmyURLverpackt werden.

IronPDF vereinfacht dies auf drei Zeilen: Erstellen Sie einen ChromePdfRenderer, rufen Sie RenderUrlAsPdf() auf, und verwenden Sie die eingebaute Methode SaveAs(). Es sind keine Anmeldeinformationen pro Anfrage erforderlich - die Lizenz wird einmalig beim Start der Anwendung festgelegt.

Für fortgeschrittene URL-zu-PDF-Szenarien siehe die URL-zu-PDF-Dokumentation.

Konvertierung von HTML-Strings zu PDF

Die Konvertierung von HTML-Strings zeigt die Musterunterschiede deutlich auf.

PDFmyURL-Ansatz:

// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            string html = "<html><body><h1>Hello World</h1></body></html>";
            client.convertStringToFile(html, "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            string html = "<html><body><h1>Hello World</h1></body></html>";
            client.convertStringToFile(html, "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL verwendet convertStringToFile(), das den HTML-Inhalt zur Verarbeitung an externe Server sendet. IronPDFs RenderHtmlAsPdf() verarbeitet alles lokal unter Verwendung der Chromium-Rendering-Engine.

Im Leitfaden zur Konvertierung von HTML in PDF finden Sie weitere Optionen.

HTML-Dateikonvertierung mit Seiteneinstellungen

Die Konfiguration von Papiergröße, Ausrichtung und Rändern erfordert in jeder Bibliothek unterschiedliche Ansätze.

PDFmyURL-Ansatz:

// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.setPageSize("A4");
            client.setOrientation("landscape");
            client.setMarginTop("10mm");
            client.convertFileToFile("input.html", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// Install PDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.setPageSize("A4");
            client.setOrientation("landscape");
            client.setMarginTop("10mm");
            client.convertFileToFile("input.html", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL verwendet Setter-Methoden mit String-Parametern wie setPageSize("A4")und setMarginTop("10mm").IronPDFbietet stark typisierte Eigenschaften durch RenderingOptions mit Enums wie PdfPaperSize.A4 und Integer-Werten für Ränder in Millimetern.

PDFmyURLAPI zuIronPDFMapping Referenz

Dieses Mapping beschleunigt die Migration, indem es direkte API-Entsprechungen aufzeigt:

Kern-Klassen

PDFmyURL IronPDF Notizen
HtmlToPdfClient ChromePdfRenderer Hauptkonvertierungsklasse
PdfMyUrlClient ChromePdfRenderer Alternative Client-Klasse
API-Antwort-Objekt PdfDocument Ergebnis PDF-Objekt

Methoden

PDFmyURL IronPDF Notizen
client.convertUrlToFile(url, file) renderer.RenderUrlAsPdf(url).SaveAs(file) URL zu PDF
client.convertStringToFile(html, file) renderer.RenderHtmlAsPdf(html).SaveAs(file) HTML-String in PDF
client.convertFileToFile(input, output) renderer.RenderHtmlFileAsPdf(input).SaveAs(output) Datei zu Datei
Antwort.GetBytes() pdf.BinaryData Rohbytes erhalten
Antwort.GetStream() pdf.Stream Als Stream erhalten

Konfigurationsoptionen

PDFmyURL(setXxx-Methoden) IronPDF(RenderingOptions) Notizen
setPageSize("A4") .PaperSize = PdfPaperSize.A4 Papierformat
setPageSize("Letter") .PaperSize = PdfPaperSize.Letter US-Brief
setOrientation("landscape") .PaperOrientation = PdfPaperOrientation.Landscape Orientierung
setOrientation("Hochformat") .PaperOrientation = PdfPaperOrientation.Portrait Porträt
setMarginTop("10mm") .MarginTop = 10 Oberer Rand (mm)
setMarginBottom("10mm") .MarginBottom = 10 Unterer Rand (mm)
setMarginLeft("10mm") .MarginLeft = 10 Linker Rand (mm)
setMarginRight("10mm") .MarginRight = 10 Rechter Rand (mm)
setHeaderHtml(html) .HtmlHeader = new HtmlHeaderFooter { HtmlFragment = html } Kopfzeile
setFooterHtml(html) .HtmlFooter = new HtmlHeaderFooter { HtmlFragment = html } Fußzeile
setJavascriptDelay(500) .RenderDelay = 500 JS-Wartezeit (ms)
setDisableJavascript(true) .EnableJavaScript = false JS deaktivieren
setUsePrintMedia(true) .CssMediaType = PdfCssMediaType.Print CSS drucken

Vergleich der Authentifizierung

PDFmyURL IronPDF
new HtmlToPdfClient("username", "apikey") IronPdf.License.LicenseKey = "LICENSE-KEY"
API-Schlüssel pro Anfrage Einmalig bei Startup
Für jeden Aufruf erforderlich Einmal global eingestellt

Gängige Migrationsprobleme und Lösungen

Aufgabe 1: API-Schlüssel vs. Lizenzschlüssel

PDFmyURL: Für jede Konvertierungsanfrage sind Anmeldedaten erforderlich.

Lösung: Setzen Sie die IronPDF-Lizenz einmalig beim Start der Anwendung:

// PDFmyURL: API key per request
var client = new HtmlToPdfClient("username", "apikey");

// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
// PDFmyURL: API key per request
var client = new HtmlToPdfClient("username", "apikey");

// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Aufgabe 2: Platzhalter-Syntax in Kopf-/Fußzeilen

PDFmyURL: Verwendet {Seitennummer} und {Gesamtseiten} Platzhalter.

Lösung: Aktualisierung auf das Platzhalterformat von IronPDF:

// PDFmyURL: "Page {page_number} of {total_pages}"
// IronPDF: "Page {page} of {total-pages}"
// PDFmyURL: "Page {page_number} of {total_pages}"
// IronPDF: "Page {page} of {total-pages}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ausgabe 3: Async-Muster

PDFmyURL: Erfordert async/await-Muster.

Lösung:IronPDFist standardmäßig synchron; bei Bedarf für async einpacken:

// PDFmyURL: Native async
var response = await client.ConvertUrlAsync(url);

// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
// PDFmyURL: Native async
var response = await client.ConvertUrlAsync(url);

// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ausgabe 4: Fehlerbehandlung

PDFmyURL: Verwendet den benutzerdefinierten Ausnahmetyp Pdfcrowd.Error.

Lösung: Aktualisierung der Catch-Blöcke für IronPDF-Ausnahmen:

// PDFmyURL: Pdfcrowd.Error
catch (Pdfcrowd.Error e) { ... }

// IronPDF: Standard exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
// PDFmyURL: Pdfcrowd.Error
catch (Pdfcrowd.Error e) { ... }

// IronPDF: Standard exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ausgabe 5: Konfigurationsmuster

PDFmyURL: Verwendet Setter-Methoden mit String-Werten.

Lösung: Verwenden Sie stark typisierte RenderingOptions-Eigenschaften:

// PDFmyURL: Setter methods
client.setPageSize("A4");
client.setOrientation("landscape");

// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// PDFmyURL: Setter methods
client.setPageSize("A4");
client.setOrientation("landscape");

// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL-Migrations-Checkliste

Vor der Migration anfallende Aufgaben

Überprüfen Sie Ihre Codebasis, um die Verwendung von PDFmyURLzu identifizieren:

# Find PDFmyURLusage
grep -r "PdfMyUrl\|Pdfcrowd\|HtmlToPdfClient" --include="*.cs" .

# Find API key references
grep -r "apikey\|api-key\|api_key" --include="*.cs" --include="*.json" --include="*.config" .

# Find placeholder patterns to migrate
grep -r "{page_number}\|{total_pages}" --include="*.cs" .
# Find PDFmyURLusage
grep -r "PdfMyUrl\|Pdfcrowd\|HtmlToPdfClient" --include="*.cs" .

# Find API key references
grep -r "apikey\|api-key\|api_key" --include="*.cs" --include="*.json" --include="*.config" .

# Find placeholder patterns to migrate
grep -r "{page_number}\|{total_pages}" --include="*.cs" .
SHELL

Dokumentieren Sie die aktuell verwendeten Konfigurationsoptionen. Planen Sie die Speicherung von Lizenzschlüsseln mithilfe von Umgebungsvariablen.

Aufgaben der Code-Aktualisierung

  1. PDFmyURL/Pdfcrowd NuGet-Pakete entfernen
  2. IronPdf NuGet-Paket installieren
  3. Aktualisieren aller Namensraumimporte
  4. Ersetzen der API-Schlüssel-Authentifizierung durch IronPDF-Lizenzschlüssel
  5. Setter-Methoden in RenderingOptions-Eigenschaften umwandeln
  6. Aktualisierung der Platzhaltersyntax in Kopf- und Fußzeilen ({Seitennummer}{Seite}, {Gesamtseiten}{Gesamtseiten})
  7. Aktualisierung des Fehlerbehandlungscodes für IronPDF-Ausnahmetypen
  8. IronPDF-Lizenzinitialisierung beim Start hinzufügen

Post-Migrationstests

Überprüfen Sie diese Aspekte nach der Migration:

  • Testen Sie, ob die Qualität der PDF-Ausgabe den Erwartungen entspricht
  • Überprüfen, ob async-Muster korrekt funktionieren
  • Vergleich der Wiedergabetreue mit früheren Ausgaben
  • Testen Sie die korrekte Wiedergabe aller Vorlagenvarianten
  • Validierung der Seiteneinstellungen (Größe, Ausrichtung, Ränder)
  • Installieren Sie Linux-Abhängigkeiten, wenn Sie die Software auf Linux-Servern einsetzen

Die wichtigsten Vorteile der Migration zu IronPDF

Der Wechsel von PDFmyURLzuIronPDFbietet mehrere entscheidende Vorteile:

Kompletter Datenschutz: Die Dokumente verlassen niemals Ihren Server. Die gesamte Verarbeitung erfolgt lokal, wodurch Bedenken hinsichtlich der Datensicherheit für sensible Inhalte ausgeräumt werden.

Einmalige Kosten: Durch die unbefristete Lizenzoption entfallen die wiederkehrenden Abonnementgebühren. Keine monatlichen Zahlungen mehr, unabhängig vom Nutzungsvolumen.

Offline-Fähigkeit: Funktioniert nach der Ersteinrichtung auch ohne Internet. Netzwerkausfälle haben keinen Einfluss auf die PDF-Erstellung.

Keine Ratenbeschränkung: Verarbeiten Sie unbegrenzt viele Dokumente ohne Drosselungsprobleme.

Niedrigere Latenz: Kein Netzwerk-Overhead bedeutet schnellere Konvertierungen, insbesondere für Anwendungen mit hohem Volumen.

Vollständige Kontrolle: Sie haben die Kontrolle über die Verarbeitungsumgebung, nicht ein Drittanbieterdienst.

Moderne Chromium-Engine: Volle CSS3- und JavaScript-Unterstützung mit der gleichen Rendering-Engine, die auch den Chrome-Browser antreibt.

Aktive Entwicklung: Da die Verbreitung von .NET 10 und C# 14 bis 2026 zunimmt, gewährleisten die regelmäßigen Updates vonIronPDFdie Kompatibilität mit aktuellen und zukünftigen .NET-Versionen.

Abschluss

PDFmyURL bietet eine unkomplizierte Cloud-basierte Lösung für die PDF-Erstellung in kleinen Mengen. Das externe Verarbeitungsmodell führt jedoch zu Datenschutzproblemen, laufenden Kosten und Abhängigkeitsrisiken, die viele Produktionsanwendungen nicht akzeptieren können.

IronPDF bietet eine lokale Verarbeitung, bei der sensible Daten auf Ihren Servern verbleiben, eliminiert Abonnementgebühren mit unbefristeter Lizenzierung und bietet eine moderne Chromium-basierte Rendering-Engine. Der Migrationspfad ist einfach: Ersetzen Sie NuGet-Pakete, aktualisieren Sie Setter-Methoden auf stark typisierte Eigenschaften und passen Sie die Syntax der Platzhalter an.

Beginnen Sie Ihre Migration noch heute mit einer kostenlosen Testversion von IronPDF und erleben Sie die Vorteile der lokalen PDF-Verarbeitung.

Eine umfassende Anleitung zur Implementierung finden Sie in der IronPDF-Dokumentation und den Tutorials.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen