Diese Seite kann automatisch übersetzten Text enthalten.

Konvertieren Sie HTML in PDF in C# und VB.NET

Wenn Sie bereits viel Zeit und Geld in die Erstellung von Inhalten im HTML-Format investiert haben, möchten Sie vielleicht PDFs aus diesem HTML erstellen. Ein solcher Ansatz ist eine natürliche Richtung für jeden, der Doppelarbeit vermeiden möchte.

Für eine erfolgreiche Wiederverwendung von Investitionen sollte die Konvertierung programmgesteuert durchgeführt werden und das resultierende PDF sollte optisch so nah wie möglich am Quell-HTML sein.

Konvertierung von HTML in PDF

API für die HTML-zu-PDF-Konvertierung in .NET-Anwendungen

Das kostenlose HTML-zu-PDF-Add-on für die Docotic.Pdf-Bibliothek bietet eine API für solche Konvertierungen. Sowohl das Add-on als auch die Bibliothek können von Web- und Desktopanwendungen verwendet werden, die für .NET- und .NET Core-Frameworks erstellt wurden.

Docotic.Pdf-Bibliothek 9.5.17615-dev HTML-zu-PDF-Add-on 9.5.17615-dev
Regressionstests 14,813 bestanden NuGet-Downloads insgesamt 4,924,084

Das Add-on ist eine HTML-zu-PDF-.NET-Bibliothek, die bei der Konvertierung Chromium verwendet. Vor jeder Konvertierung prüft das Add-on automatisch, ob das aktuellste unterstützte Chromium bereits heruntergeladen ist. Jede bereits heruntergeladene berechtigte Version wird wiederverwendet. Wenn keine geeignete Version gefunden wird, lädt das Add-on vor der Konvertierung eine herunter. Es wird erwartet, dass die gleichen Webstandards eingehalten werden wie in Google Chrome (R).

Das Add-on kann PDFs aus HTML in Windows-, macOS- und Linux-Umgebungen generieren. Lesen Sie im Artikel über die HTML-zu-PDF-Konvertierung in Azure, wie Sie das Add-on unter Linux konfigurieren.

Das Add-on ist auf NuGet und im Zip mit Binärdateien der Bibliothek verfügbar. Holen Sie sich die Bibliothek, das Add-on und einen kostenlosen zeitlich begrenzten Lizenzschlüssel auf der Seite Laden Sie die C# .NET PDF-Bibliothek herunter.

Einfache Konvertierung von HTML in PDF C#

Unter Verwendung der HTML-zu-PDF-API kann der C#-Konvertierungscode wie folgt aussehen:

static async Task convertUrlToPdfAsync(string urlString, string pdfFileName)
{
    using (var converter = await HtmlConverter.CreateAsync())
    {
        using (var pdf = await converter.CreatePdfAsync(new Uri(urlString)))
            pdf.Save(pdfFileName);
    }
}

Es ist ziemlich einfach. Zur Erstellung eines PDF-Dokuments sind nur zwei Anrufe erforderlich. Wie Sie sehen, ist die API asynchron und stellt überhaupt keine synchronen Methoden bereit.

In Fällen, in denen Sie die API von einem synchronen Code aus aufrufen möchten, können Sie den folgenden Wrapper verwenden:

Task.Run(async () =>
{
    await convertUrlToPdfAsync("https://bitmiracle.com/", "output.pdf");
}).GetAwaiter().GetResult();

Bitte beachten Sie, dass es im Allgemeinen nicht empfohlen wird, asynchrone Methoden synchron aufzurufen. Verwenden Sie den Wrapper daher nur, wenn Sie keine andere Wahl haben.

Wir stellen Beispielcode bereit, der zeigt, wie die API verwendet wird sowohl von synchronen als auch von asynchronen Konsolenanwendungen aus. Außerdem gibt es Beispielcodes für Windows Forms- und WPF-Anwendungen.

Es gibt auch die Beispielgruppe HTML to PDF. Jedes Beispiel ist in der C#- und VB.NET-Version erhältlich.

Erstellen Sie ein PDF mit einer HTML-Zeichenfolge oder -Datei in C# und VB.NET

Mit der API ist es ganz einfach, einen HTML-String in PDF zu konvertieren. Der String kann ein komplettes HTML-Dokument oder nur ein Fragment enthalten. Der Konverter erstellt für Sie ein PDF aus dem HTML-Code.

var html = "<body><br><br><br><h1>Hello, World<h1></body>";
using (var pdf = await converter.CreatePdfFromStringAsync(html))
    pdf.Save("output.pdf");

Sie können eine Basis-URL für alle relativen Links im HTML-Code angeben, den Sie konvertieren möchten. Hier ist ein Codeausschnitt zum Konvertieren von HTML in PDF mit einer Basis-URL in C#.

var incompleteHtml = "<img src=\"/images/team.svg\"></img>";
var options = new HtmlConversionOptions();
options.Load.BaseUri = new Uri("https://bitmiracle.com/");
using (var pdf = await converter.CreatePdfFromStringAsync(incompleteHtml, options))
    pdf.Save("output.pdf");

Das Konvertieren einer HTML-Datei ist fast dasselbe wie das Konvertieren einer URL. Verwenden Sie einfach die Überladung CreatePdfAsync, die einen Pfad anstelle einer URL akzeptiert. Die Basis-URL und andere Optionen werden auch beim Konvertieren einer HTML-Datei in PDF in C#- oder VB.NET-Code unterstützt.

var sampleHtmlPath = @"C:\path\to\sample.html";
using (var pdf = await converter.CreatePdfAsync(sampleHtmlPath))
    pdf.Save("output.pdf");

Sie können mithilfe der API auch SVG-Bilder in PDF konvertieren.

Verwenden Sie benutzerdefinierte Seitengröße, Ränder und Skalierung

Sie können jede HTML-zu-PDF-C#-Konvertierung einrichten, indem Sie Konvertierungsoptionen für PDF-Erstellungsmethoden bereitstellen.

Hier ist ein Codeausschnitt, der zeigt, wie die Größe, Ränder und Skalierung der Ausgabeseite in C# konfiguriert werden:

using (var converter = await HtmlConverter.CreateAsync())
{
    var options = new HtmlConversionOptions();

    // Sie können auch angeben, ob die Seitenausrichtung im Querformat erfolgen soll, 
    // und Sie können eine Größe in Punkt oder Zoll angeben
    options.Page.SetSize(PdfPaperSize.ItalyEnvelope);

    options.Page.MarginLeft = 10;
    options.Page.MarginTop = 20;
    options.Page.MarginRight = 30;
    options.Page.MarginBottom = 40;

    options.Page.Scale = 1.5;

    using (var pdf = await converter.CreatePdfAsync(url, options))
        pdf.Save("output.pdf");
}

Sie können Kopf- und Fußzeilenvorlagen mit Seitenoptionen angeben. Die Vorlagen verwenden regulären HTML-Code mit Unterstützung für einige Variablen. Diese Variablen sind date, title, url, pageNumber und totalPages. Kopfzeilenvorlagen und Fußzeilenvorlagen unterstützen denselben Variablensatz.

Es wird empfohlen, für Bilder Inline-Stile und Daten-URIs zu verwenden.

Möglicherweise möchten Sie den oberen und unteren Rand für die Seite festlegen. Ohne Ränder kann die Kopf- oder Fußzeile durch den Seiteninhalt verdeckt werden.

Der Beispielcode HTML in PDF mit Kopf- und Fußzeile in C# oder VB.NET konvertieren zeigt, wie die Variablen und Daten-URIs in den Vorlagen verwendet werden.

Passwortgeschützte HTML-zu-PDF-C#-Konvertierung

Sie können PDFs auch dann erstellen, wenn eine HTML-Seite durch ein Benutzername/Passwort-Paar geschützt ist. Es ist so einfach wie das Festlegen der Authentifizierungsoptionen in HtmlConversionOptions.

var options = new HtmlConversionOptions();
options.Authentication.SetCredentials("foo", "bar");

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Es ist auch einfach, wenn die Seite einige Cookies benötigt, damit sie ordnungsgemäß funktioniert. Fügen Sie diese Cookies einfach zu den Optionen hinzu. Hier ist, wie:

var options = new HtmlConversionOptions();
options.Cookies.Add(new Cookie("sessionID", "my-session-ID"));

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Konvertierungsstart verzögern

Standardmäßig startet die Konvertierung sofort nach dem Laden. Es gibt jedoch Fälle, in denen die Seite einige Zeit benötigt, um sich zu stabilisieren. Wenn es beispielsweise einige Berechnungen durchführt und den Inhalt aktualisiert, nachdem diese Berechnungen fertig sind.

Mit den Konvertierungsstartoptionen können Sie die Konvertierung um eine bestimmte Anzahl von Millisekunden verzögern.

// Warten Sie 10 Sekunden, bevor Sie mit der Konvertierung beginnen.
var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

Manchmal ist es erforderlich, ein Skript auszuführen, um Elemente auf der geladenen Seite umzuschalten oder das dynamische Laden von Inhalten zu ermöglichen. Dies ist auch möglich:

var options = new HtmlConversionOptions();
var js = @"
    async function scrollDownUntilYouCantAnyMore() {
        await new Promise((resolve, reject) => {
            // der Kürze halber weggelassen
            }, 400);
        });
    }
    scrollDownUntilYouCantAnyMore();
";
options.Start.SetStartAfterScriptRun(js);
using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Der Beispielcode HTML zu PDF nach der Ausführung eines Skripts in C# oder VB.NET enthält die vollständige Funktion scrollDownUntilYouCantAnyMore. Das Beispiel zeigt, wie ein Skript vor der HTML-zu-PDF-Konvertierung ausgeführt wird.

Konvertieren Sie HTML in PDF in .NET und ignorieren Sie dabei SSL-Fehler

Bei einer Konvertierung kann ein SSL-Fehler auftreten. Solche Fehler treten normalerweise aufgrund selbstsignierter oder anderweitig nicht vertrauenswürdiger Zertifikate auf. Auch widerrufene und abgelaufene Zertifikate können dazu führen, dass der HTML-zu-PDF-Konverter Ausnahmen auslöst.

Sie können SSL-Fehler ignorieren, wenn Sie verstehen, warum sie auftreten, und sicher sind, dass sie sicher ignoriert werden können. Um SSL-Fehler während einer HTML-zu-PDF-Konvertierung zu ignorieren, verwenden Sie die Engine-Optionen mit IgnoreSslErrors = true.

var engineOptions = new HtmlEngineOptions
{
    IgnoreSslErrors = true
};
using (var converter = await HtmlConverter.CreateAsync(engineOptions))
{
    var url = new Uri("https://self-signed.badssl.com/");
    using (var pdf = await converter.CreatePdfAsync(url))
        pdf.Save("output.pdf");
}

Platzieren Sie HTML-Inhalte über PDF-Seiten

Es gibt Fälle, in denen Sie möglicherweise HTML konvertieren und das Konvertierungsergebnis über einige vorhandene PDF-Seiten einfügen müssen. Wenn Sie beispielsweise ein Bild eines Formulars haben, möchten Sie möglicherweise etwas über leere Bereiche in diesem Bild legen. Das Ergebnis sieht aus wie ein ausgefülltes Formular.

Um konvertiertes HTML über vorhandenen PDF-Inhalt zu legen, müssen Sie Folgendes tun:

  • Erstellen Sie PDF-Seiten mit transparentem Hintergrund aus dem HTML
  • XObjects aus den konvertierten Seiten erstellen
  • Zeichnen Sie diese XObjects auf vorhandenen PDF-Seiten.

Der Beispielcode HTML auf ein vorhandenes PDF legen zeigt alle Schritte. Bitte schauen Sie sich das Beispiel an.