Diese Seite kann automatisch übersetzten Text enthalten.

Erstellen Sie PDF-Dokumente in C# und VB.NET

Müssen Sie als .NET-Entwickler PDF-Berichte, Rechnungen, Quittungen oder andere Dokumente erstellen? Verwenden Sie die Docotic.Pdf-Bibliothek, um PDF-Dokumente in Ihren .NET Core-, .NET Standard- oder .NET Framework-Projekten zu generieren. Sie können dies einfach und ohne Kenntnisse über das PDF-Format tun.

Erstellen Sie PDF-Dokumente in C# und VB.NET

.NET-API für die PDF-Generierung

Docotic.Pdf ist die zu 100 % verwaltete Codebibliothek ohne externe Abhängigkeiten. Sie können damit PDF-Dokumente in Windows-, Linux-, Amazon- und Azure-Cloud-Umgebungen erstellen. Auch macOS, iOS, Android und andere Cloud-Umgebungen sind in Ordnung.

Die Bibliothek bietet verschiedene Möglichkeiten zur Generierung von PDF-Dokumenten. Erstens können Sie die High-Level-Layout-API verwenden, um Seitenkopf- und -fußzeilen, Tabellen und Absätze hinzuzufügen und Inhalte automatisch auf Seiten aufzuteilen. Die Layout-API ist im kostenlosen Docotic.Pdf.Layout-Add-on verfügbar.

Oder Sie können PDF-Dokumente basierend auf HTML-Vorlagen erstellen, indem Sie das HTML-zu-PDF-Add-on (ebenfalls kostenlos) verwenden. Weitere Einzelheiten finden Sie im Artikel HTML in PDF konvertieren.

Und Sie können PDF-Dokumente mithilfe der Kernbibliotheks-API erstellen. Es unterstützt alle PDF-Inhalte – Text, Bilder, Vektorgrafiken, Formulare, Annotationen, Lesezeichen, Ebenen und Andere. Die Kern-API unterstützt jedoch keine übergeordneten Layoutkomponenten wie Überschriften, Tabellen und Abschnitte. Bei der Kernbibliothek müssen Sie den Inhalt selbst messen und auf die PDF-Seiten aufteilen.

Docotic.Pdf-Bibliothek 9.3.17014-dev Layout-Add-on 9.3.17014-dev HTML-zu-PDF-Add-on 9.3.17014-dev
Regressionstests 14,645 bestanden NuGet-Downloads insgesamt 4,172,488

Sie können Add-ons auch zusammen mit der Kernbibliothek verwenden. Generieren Sie beispielsweise das PDF-Dokument mithilfe der Layout-API und fügen Sie dann weitere Inhalte mit der Kernbibliothek hinzu. Beachten Sie, dass das Layout-Add-on .NET Standard 2.1, .NET Core, .NET 5 und neuere Frameworks unterstützt. Die Kernbibliothek und das HTML-zu-PDF-Add-on unterstützen .NET Standard 2.0, .NET 4.7.2+, .NET Core, .NET 5 und höher.

Docotic.Pdf-Add-Ons sind auf NuGet verfügbar und in der ZIP-Datei mit Binärdateien der Bibliothek enthalten. Um die Bibliothek ohne Einschränkungen im Evaluierungsmodus auszuprobieren, erhalten Sie möglicherweise den kostenlosen, zeitlich begrenzten Lizenzschlüssel hier.

Erstellen Sie PDF-Dokumente mit der Layout-API

Dieses C#-Beispiel zeigt, wie Sie mithilfe der Layout-API ein PDF-Dokument in C# generieren:

PdfDocumentBuilder
    .Create()
    .Generate("long-text.pdf", doc => doc.Pages(page =>
    {
        string text = File.ReadAllText(@"C# in Depth, Fourth Edition.txt");
        page.Content().Text(text);

        page.Footer().AlignCenter().Text(t => t.CurrentPageNumber());
    }));

Der Code konvertiert eine Textdatei in ein PDF. Es teilt langen Text in Seiten auf und zeichnet auch Seitenzahlen in den Fußzeilenbereich ein. Sie müssen weder die Texthöhe berechnen noch die Seiten zählen – die Bibliothek übernimmt diese Routineaufgaben.

Die Layout-API ist eine Fluent-API. Die meisten Aufrufe können miteinander verkettet werden, sodass Sie kompakteren Code schreiben können als mit „deklarativen“ Frameworks. Sehen wir uns die API genauer an.

Legen Sie die Eigenschaften eines PDF-Dokuments fest

Die PDF-Generierung beginnt mit der PdfDocumentBuilder-Klasse. Es ermöglicht Ihnen, Eigenschaften eines generierten PDF-Dokuments festzulegen. Sie können beispielsweise Metadaten, Verschlüsselung und PDF-Version festlegen oder eine schnelle Webansicht aktivieren. Hier ist das grundlegende C#-Beispiel:

PdfDocumentBuilder
    .Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Info(info =>
    {
        info.Author = "Docotic.Pdf library";
        info.Title = "How to create PDF in .NET";
        info.Keywords = "C#, VB.NET";
    })
    .Version(PdfVersion.Pdf16)
    .Generate("result.pdf", doc => doc.Pages(_ => {}));

Dieses Beispiel erstellt ein leeres, passwortgeschütztes PDF-Dokument mit benutzerdefinierten Metadaten und speichert es in einer Datei. Sie können das Dokument auch in einem Stream speichern. Verwenden Sie dazu einfach die PdfDocumentBuilder.Generate(Stream, ..)-Überladung.

Wenn Sie einen PdfDocumentBuilder einrichten, ist es an der Zeit, das PDF-Dokument mit Inhalt zu füllen. Die Layout-API stellt ein Document-Objekt zum Registrieren allgemeiner Ressourcen (Typografie, Bilder) und zum Definieren von PDF-Seiteninhalten bereit. Sie können ein Document im zweiten Argument der PdfDocumentBuilder.Generate-Methoden konfigurieren. Erfahren Sie, wie Sie PDF-Seiten einrichten.

Definieren Sie das PDF-Seitenlayout

Dieses C#-Beispiel zeigt, wie Sie ein PDF-Dokument mit A3-Seiten im Querformat erstellen:

PdfDocumentBuilder.Create().Generate("pages.pdf", doc =>
{
    doc.Pages((PageLayout page) =>
    {
        page.Size(PdfPaperSize.A3, PdfPaperOrientation.Landscape)
            .MarginVertical(50)
            .MarginHorizontal(40);

        page.Header().PaddingBottom(30).AlignRight().Text("Hello PDF");

        page.Content().Column(c =>
        {
            c.Item().Text("Page 1");
            c.Item().PageBreak();
            c.Item().Text("Page 2");
        });

        page.Footer().Text(t => t.CurrentPageNumber());
    });
});

Die Document.Pages()-Methode definiert das Layout für eine oder mehrere Seiten. Zunächst legt der Beispielcode allgemeine Einstellungen für alle Seiten fest – Größe, Ausrichtung, Ränder. Sie können auch die Inhaltsrichtung, den Standardtextstil oder die Hintergrundfarbe angeben.

Anschließend generiert das Beispiel das Seitenlayout und den Inhalt. Die PageLayout-Klasse stellt Methoden zum Platzieren von Seiteninhalten in den folgenden Slots bereit:

  • Background() – eine Hintergrundebene, die von anderen Inhalten abgedeckt wird
  • Header() – ein gemeinsamer Header für alle Seiten
  • Content() – ein Hauptseiteninhalt
  • Footer() – eine gemeinsame Fußzeile für alle Seiten
  • Foreground() – eine Vordergrundebene, die andere Inhalte verdeckt

Die Layout-Engine generiert Seiten abhängig vom Inhalt, der dem PageLayout.Content()-Slot hinzugefügt wird. Andere Slots werden auf jeder Seite wiederholt. Sie können Inhalt zu Slots hinzufügen, indem Sie die LayoutContainer-Klasse verwenden. Dies ist ein wichtiger Baustein der Layout-API, mit dem Sie beliebige Layouts, Tabellen, Texte oder Bilder generieren können.

Das vorherige Beispiel verwendet die Methode LayoutContainer.Column, die Inhalte vertikal stapelt. Diese Spalte enthält drei Elemente: den Textblock für die erste Seite, den expliziten Seitenumbruch und den Textblock für die zweite Seite.

Es gibt auch die Methode LayoutContainer.Row. Sehen Sie sich an, wie man mehrspaltige PDF-Dokumente erstellt, indem man Zeilen und Spalten zusammen verwendet.

Sie können verschiedene Seitenlayouts in einem PDF-Dokument mischen. Rufen Sie einfach die Methode Document.Pages mehrmals auf. Ein Beispiel finden Sie im Beispiel PDF-Seitenlayouteinstellungen auf GitHub.

Fügen Sie Text zu PDF-Dokumenten hinzu

Text ist ein wichtiger Bestandteil von PDF-Dokumenten. Sie können LayoutContainer.Text-Methoden verwenden, um Text hinzuzufügen. Zuvor haben Sie Anwendungsfälle für die Überladung LayoutContainer.Text(string) gesehen. Schauen wir uns eine weitere Überladung dieser Methode an:

PdfDocumentBuilder.Create().Generate("text.pdf", doc =>
{
    doc.Pages(p => p.Content().Text(text =>
    {
        text.Span("VB.NET").Style(t => t.Strong);
        text.Span(" is a multi-paradigm, object-oriented programming language, implemented on.NET, Mono, and the ");
        text.Hyperlink(".NET Framework", new Uri("https://dotnet.microsoft.com/en-us/download/dotnet-framework"));
        text.Line(".");

        text.Line("Microsoft launched VB.NET in 2002 as the successor to its original Visual Basic language.");
    }));
});

Die TextContainer-Klasse bietet Methoden zum Zeichnen von Text, Links und Seitenzahlen. Verwenden Sie die Methoden Span und Line, um einer aktuellen Zeile Text hinzuzufügen. Die Methode Line vervollständigt zusätzlich die aktuelle Zeile. Dieses Beispiel verwendet auch die Methode Hyperlink, die einen externen Ressourcenlink hinzufügt.

Hier ist ein weiteres Beispiel, das zeigt, wie dynamische Seitenzahlen in einer Seitenfußzeile verwendet werden:

PdfDocumentBuilder.Create().Generate("footer.pdf", doc =>
{
    doc.Pages(p => p.Footer().AlignRight().Text(text =>
    {
        text.Style(t => t.Parent.FontColor(new PdfRgbColor(255, 0, 0)));

        text.CurrentPageNumber();
        text.Span(" / ");
        text.PageCount();
    }));
});

Die Layout-API bietet eine Möglichkeit, Seitenzahlen zu formatieren. Sie können beispielsweise hexadezimale Seitenzahlen wie folgt zeichnen:

text.CurrentPageNumber().Format(p => "0x" + p?.ToString("x2"));

Das Beispiel zum Hinzufügen von Kopf- und Fußzeilen zu PDF-Dokumenten in C# und VB.NET zeigt, wie Seitenzahlen als römische Ziffern formatiert werden.

Möglicherweise sehen Sie, dass die obigen Beispiele die Methode Style verwenden. Lassen Sie uns das Konzept der Textstile genauer untersuchen.

Typografie

Mit Textstilen können Sie das Erscheinungsbild des Textes anpassen. Die TextStyle-Klasse bietet Methoden zum Ändern von Schriftgröße, Buchstabenabstand, Farben und anderen Texteigenschaften. TextStyle-Objekte sind unveränderlich, sodass jeder Methodenaufruf einen neuen Textstil erzeugt. Sie können den Textstil auf verschiedenen Layoutebenen anwenden:

PdfDocumentBuilder.Create().Generate("text-styles.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.TextStyle(TextStyle.Parent.FontSize(30));

        page.Content()
            .TextStyle(TextStyle.Parent.FontColor(new PdfRgbColor(0, 0, 255)))
            .Text(t =>
            {
                t.Style(TextStyle.Parent.Underline());

                t.Span("Hello PDF").Style(TextStyle.Parent.DirectionRightToLeft());
            });
    });
});

Die Eigenschaft TextStyle.Parent gibt einen speziellen Stil zurück, bei dem alle Texteigenschaften undefiniert sind. Das vorherige Beispiel zeichnet "Hello PDF" als blaue, unterstrichene Schriftgröße von 30 Punkt in umgekehrter Reihenfolge (von rechts nach links). Sehen Sie sich das Beispiel Textdarstellung in PDF-Dokumenten anpassen an, um ein weiteres Beispiel für die Vererbung von Textstilen zu finden.

Die Klasse TextStyle unterstützt das Anpassen aller Elemente außer einer zugehörigen Schriftart. Verwenden Sie die Methoden Document.TextStyleWithFont, wenn Sie eine benutzerdefinierte Schriftart für Ihren Textstil angeben müssen. Dieses C#-Beispiel zeigt, wie eine Systemschriftart verwendet wird:

PdfDocumentBuilder.Create().Generate("fonts.pdf", doc =>
{
    doc.Pages(page =>
    {
        TextStyle style = doc.TextStyleWithFont(SystemFont.Family("Arial").Bold());
        page.Content().Text("Bold text").Style(style);
    });
});

Die Layout-Engine entfernt standardmäßig nicht verwendete Schriftartenglyphen. Aus diesem Grund können generierte Dokumente selbst bei großen Schriftarten eine geringe Größe aufweisen. Sie können auch einen benutzerdefinierten Schriftartenlader, Ersatzschriftarten und einen Handler für fehlende Glyphen angeben. Weitere Einzelheiten finden Sie im Beispiel Verschiedene Schriftarten in PDF-Dokumenten verwenden.

Die Layout-API stellt eine Sammlung vordefinierter Stile bereit. Sie können sie über die Typography-Klasse verwenden oder anpassen:

PdfDocumentBuilder.Create().Generate("typography.pdf", doc =>
{
    doc.Typography(t =>
    {
        var baseFont = new FileInfo("arial.ttf");
        t.Document = doc.TextStyleWithFont(baseFont);
        t.Header = t.Parent.FontSize(20).FontColor(new PdfGrayColor(20));
        t.Footer = t.Footnote;
    });

    doc.Pages(page =>
    {
        page.Header().AlignCenter().Text("Header");

        page.Content().Text(t =>
        {
            t.Line("Title").Style(t => t.Title);
            t.Line("Heading 1").Style(t => t.Heading1);
            t.Line("Regular");
        });

        page.Footer().Height(20).AlignCenter().Text(t => t.CurrentPageNumber());
    });
});

Mit der Klasse Typography müssen Sie keine Variablen verwenden, um Textstilreferenzen beizubehalten. Sie registrieren erforderliche Stile mithilfe der Document.Typography-Methoden und laden sie später aus dem Objekt Typography. Sehen Sie sich im Beispiel Typografie an, wie Sie vordefinierte und benutzerdefinierte Stile verwenden.

Bilder

Bilder sind neben Text und Schriftarten ein weiterer wesentlicher Bestandteil von PDF-Dokumenten. Mit der Layout-API können Sie Bilder wie folgt hinzufügen:

PdfDocumentBuilder.Create().Generate("image.pdf", doc =>
{
    var imageFile = new FileInfo("image.jpg");
    Image image = doc.Image(imageFile);
    doc.Pages(page => page.Content().MaxWidth(200).Image(image));
});

Tische

Mit der Layout-API können Sie Tabellen generieren. Dieses C#-Beispiel zeigt, wie man eine Tabelle zu einem PDF-Dokument hinzufügt:

PdfDocumentBuilder.Create().Generate("table.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Table(t =>
        {
            t.Columns(c =>
            {
                c.ConstantColumn(200);
                c.RelativeColumn(1);
            });

            t.Header(h =>
            {
                h.Cell().Text("Product");
                h.Cell().Text("Features");
            });

            t.Cell().Text("Docotic.Pdf");
            t.Cell().Text("Extract text, PDF to images, compress PDF");
            t.Cell().Text("Docotic.Pdf.Layout");
            t.Cell().Text("Create PDF");
        });
    });
});

Sie können Tabellen beliebiger Komplexität erstellen. Dieses Beispiel zeigt, wie Zellränder, Hintergründe und Bereiche verwendet werden.

PDF-Dokumente unterstützen interne Links, mit denen Sie Lesezeichen oder Inhaltsverzeichnisse erstellen können. Dieses einfache C#-Beispiel zeigt, wie Sie mithilfe der Layout-API einen Link zu einem Dokumentabschnitt hinzufügen:

PdfDocumentBuilder.Create().Generate("link.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Column(c =>
        {
            const string SectionName = "Chapter 1";
            c.Item().SectionLink(SectionName).Text("Link");

            c.Item().PageBreak();

            c.Item().Section(SectionName).Text("Target");
        });
    });
});

Sie können auch das Beispiel Inhaltsverzeichnis zu PDF-Dokumenten hinzufügen von GitHub herunterladen und ausprobieren.

Komplexe Layouts

Sie können verschiedene Layoutkomponenten kombinieren, um komplexe PDF-Dokumente zu erstellen. Laden Sie das Beispiel PDF-Dokumente mit komplexem Layout generieren von GitHub herunter und probieren Sie es aus.

Es ist möglich, die Layout-API zu erweitern. Mit den Methoden LayoutContainer.Component und LayoutContainer.Container können Sie benutzerdefinierte Komponenten wiederverwenden. Das Beispiel Layout-Komponenten zeigt, wie eine benutzerdefinierte Komponente mithilfe der Schnittstelle ILayoutComponent implementiert wird.

Abschluss

Docotic.Pdf-Bibliothek bietet verschiedene Möglichkeiten zum Erstellen von PDF-Dokumenten in C# und VB.NET. Sie können PDF-Dokumente von Grund auf mit oder ohne Verwendung von dem Layout-Add-on erstellen. Oder Sie können PDFs aus HTML erstellen, indem Sie das HTML-zu-PDF-Add-on verwenden.

Kontaktieren Sie uns, wenn Sie Fragen zur PDF-Generierung haben.