Diese Seite kann automatisch übersetzten Text enthalten.

Rendern und drucken Sie PDF-Dokumente in C# und VB.NET

Beim Lesen von PDF-Dokumenten denkt jeder an den Adobe Reader. Doch was tun, wenn Sie als Softwareentwickler PDF-Dokumente in Ihrer Anwendung anzeigen möchten? Sie möchten den Benutzer nicht bitten, Adobe Reader einzurichten und das Dokument dort zu öffnen.

Möglicherweise müssen Sie auch andere PDF-bezogene Anforderungen implementieren. Drucken Sie beispielsweise PDF-Dokumente. Oder generieren Sie Miniaturansichten für hochgeladene PDF-Dokumente. Oder unterstützen Sie die PDF-Bearbeitung in Ihrer Desktop- oder Webanwendung.

Sie benötigen lediglich eine PDF-Bibliothek, die PDF-Dokumente rendern und drucken kann.

PDF in C# drucken

.NET-Bibliothek zum Anzeigen, Bearbeiten oder Drucken von PDF-Dokumenten

Mit der Docotic.Pdf-Bibliothek können Sie PDF-Dokumente in C# und VB.NET anzeigen, bearbeiten und drucken. Mit drei Kernfunktionen können Sie jeden komplexen PDF-Rendering-Ablauf implementieren.

Die erste Möglichkeit ist die Möglichkeit, PDF in Bilder umzuwandeln. Mit dieser Funktion können Sie fast alles umsetzen. Vom PDF-Druck über die Anzeige eines PDFs auf HoloLense bis hin zum Posten eines PDFs auf Instagram. Das ist möglich, weil Bilder überall unterstützt werden.

Die zweite Schlüsselfunktion ist die Möglichkeit, PDF-Seiten auf der Zeichenoberfläche eines System.Drawing.Graphics zu zeichnen. Es ermöglicht Ihnen, PDFs in Windows Forms- oder WPF-Anwendungen zu rendern und zu drucken. Um diese Funktion zu nutzen, fügen Sie Ihrem Projekt BitMiracle.Docotic.Pdf.Gdi-Erweiterungs-DLL hinzu.

Last but not least gibt es die Möglichkeit, PDF-Seitenobjekte zu extrahieren. Mit dieser Funktion können Sie einen PDF-Viewer oder PDF-Editor in Ihrer C#- oder VB.NET-Anwendung erstellen.

Sie können die Binärdateien der Bibliothek herunterladen oder deren NuGet-Paket verwenden. Um Docotic.Pdf ohne Einschränkungen im Testmodus auszuprobieren, erhalten Sie möglicherweise den kostenlosen, zeitlich begrenzten Lizenzschlüssel, indem Sie dieses Formular verwenden.

.NET unterstützt das Drucken von PDF-Dokumenten nicht sofort. Sie müssen Ihr PDF-Dokument in ein Bild oder eine XPS-Datei umwandeln oder es auf einer System.Drawing.Graphics-Oberfläche zeichnen. Anschließend können Sie .NET-Klassen verwenden, um die Ausgabe aus einer Windows Forms- oder WPF-Anwendung heraus zu drucken.

In Windows Forms-Anwendungen können Sie Klassen aus dem Namespace System.Drawing.Printing verwenden. Es gibt auch praktische Klassen PrintDialog und PrintPreviewDialog zum Erstellen einer Druck-Benutzeroberfläche.

Bitte beachten Sie, dass es nicht empfohlen wird, in macOS- und Linux-Umgebungen etwas aus dem Namespace System.Drawing zu verwenden. Die macOS- und Linux-Implementierungen von System.Drawing sind unvollständig und unterscheiden sich von der Windows-Implementierung. Wenn Sie den Namespace System.Drawing in macOS- und Linux-Umgebungen verwenden, erhalten Sie möglicherweise falsche und/oder inkonsistente Ergebnisse.

WPF stellt eine weitere PrintDialog-Klasse bereit, stellt jedoch keine Klassen für die Druckvorschau bereit. Glücklicherweise ermöglicht Ihnen WPF die Verwendung der Klasse PrintPreviewDialog aus System.Windows.Forms.dll. Daher ist es einfacher, Druckklassen aus den Namespaces System.Windows.Forms und System.Drawing.Printing in WPF-Anwendungen zu verwenden.

Schauen Sie sich die Demoanwendung PDF in .NET drucken an, die in C#- und VB.NET-Versionen für WinForms und WPF erhältlich ist. Die Anwendung zeigt, wie man:

  • Anzeige einer Druckvorschau für PDF-Dokumente
  • PDF-Dokumente auf einem ausgewählten Drucker drucken
  • Richten Sie das Papierformat, den Skalierungsmodus und andere Druckeinstellungen ein

Die Anwendung verwendet die Docotic.Pdf-Bibliothek, BitMiracle.Docotic.Pdf.Gdi-Erweiterungs-DLL und Druckklassen aus den Namespaces System.Windows.Forms und System.Drawing.Printing. Sie können die Klassen PdfPrintDocument und PdfPrintHelper in Ihren WPF- oder Windows Forms-Projekten verwenden.

Die Klasse PdfPrintDocument beschreibt die Hauptdrucklogik. Diese Klasse verbindet Docotic.Pdf mit der Klasse System.Drawing.Printing.PrintDocument. Die Schlüsselmethode ist der Event-Handler printDocument_PrintPage:

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics;

    // In Punkten arbeiten, um konsistente Einheiten für alle Kontexte zu haben:
    // 1. Drucker
    // 2. Druckvorschau
    // 3. PDF
    gr.PageUnit = GraphicsUnit.Point;

    if (m_printAction == PrintAction.PrintToPreview)
    {
        gr.Clear(Color.LightGray);
        gr.FillRectangle(Brushes.White, m_printableAreaInPoints);
        gr.IntersectClip(m_printableAreaInPoints);

        gr.TranslateTransform(m_printableAreaInPoints.X, m_printableAreaInPoints.Y);
    }

    PdfPage page = m_pdf.Pages[m_pageIndex];
    PdfSize pageSizeInPoints = getPageSizeInPoints(page);

    if (m_printSize == PrintSize.FitPage)
    {
        float sx = (float)(m_printableAreaInPoints.Width / pageSizeInPoints.Width);
        float sy = (float)(m_printableAreaInPoints.Height / pageSizeInPoints.Height);
        float scaleFactor = Math.Min(sx, sy);

        centerContentInPrintableArea(gr, pageSizeInPoints, scaleFactor);
        gr.ScaleTransform(scaleFactor, scaleFactor);
    }
    else if (m_printSize == PrintSize.ActualSize)
    {
        centerContentInPrintableArea(gr, pageSizeInPoints, 1);
    }

    page.Draw(gr);

    ++m_pageIndex;
    e.HasMorePages = (m_pageIndex <= m_lastPageIndex);
}

Zuerst richten wir Transformationen des Graphics-Objekts der gedruckten Seite ein. Es ist wichtig, die Einstellungen „Seite anpassen“ und „Tatsächliche Größe“ zu beachten. Und wir zeigen auch die harten Ränder des Druckers im Druckvorschau-Dialog an. Dann zeichnen wir die aktuelle PDF-Seite mit der Erweiterungsmethode PdfPage.Draw auf das Objekt Graphics.

Mit der Klasse PdfPrintHelper können Sie PdfPrintDocument mit UI-Klassen zum Drucken verwenden. Sie können den Druckdialog für Ihr PDF-Dokument beispielsweise so anzeigen:

using (var pdf = new PdfDocument("your_document.pdf"))
    action(pdf, getPrintSize());

public static DialogResult ShowPrintDialog(PdfDocument pdf, PrintSize printSize)
{
    using (var printDialog = new PrintDialog())
    {
        printDialog.AllowSomePages = true;
        printDialog.AllowCurrentPage = true;
        printDialog.AllowSelection = true;

        printDialog.PrinterSettings.MinimumPage = 1;
        printDialog.PrinterSettings.MaximumPage = pdf.PageCount;
        printDialog.PrinterSettings.FromPage = printDialog.PrinterSettings.MinimumPage;
        printDialog.PrinterSettings.ToPage = printDialog.PrinterSettings.MaximumPage;

        var result = printDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            using (var printDocument = new PdfPrintDocument(pdf, printSize))
                printDocument.Print(printDialog.PrinterSettings);
        }

        return result;
    }
}

Das ist es. Gehen Sie wie folgt vor, um den PDF-Druck in Ihrer Windows Forms- oder WPF-Anwendung zu implementieren:

  • Fügen Sie die Dateien PdfPrintDocument, PdfPrintHelper und PrintSize aus dem Beispiel hinzu
  • Fügen Sie einen Verweis auf die Docotic.Pdf-Bibliothek hinzu
  • Fügen Sie einen Verweis auf BitMiracle.Docotic.Pdf.Gdi-Erweiterungs-DLL hinzu.
  • (Nur WPF) Verweise auf System.Windows.Forms- und System.Drawing-Assemblys hinzufügen

Klassen aus dem Namespace System.Drawing.Printing funktionieren gut in Windows Forms- und WPF-Anwendungen. Es gibt jedoch Fälle, in denen Sie System.Drawing.Printing nicht verwenden können oder sollten.

Beispielsweise sollten Sie System.Drawing.Printing nicht in Windows-Diensten oder ASP.NET-Anwendungen verwenden. System.Drawing.Printing kann beim Drucken unter Linux oder macOS zu inkonsistenten Ergebnissen führen. Und Sie können System.Drawing.Printing nicht in Eto.Forms- oder Avalonia-Anwendungen verwenden.

In solchen Fällen müssen Sie zuerst PDF-Dokument in Bild konvertieren. Dieses C#-Beispiel zeigt, wie Sie eine PDF-Seite als PNG-Bild speichern oder ein gesamtes PDF-Dokument in ein mehrseitiges TIFF konvertieren:

using (var pdf = new PdfDocument(@"your_document.pdf"))
{
    PdfDrawOptions options = PdfDrawOptions.Create();
    options.HorizontalResolution = printerDpi;
    options.VerticalResolution = printerDpi;

    // save one page
    pdf.Pages[0].Save("page0.png", options);

    // save the whole document as multipage bitonal TIFF
    options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
    pdf.SaveAsTiff("your_document.tiff", options);
}

Drucken Sie dann die Bilder mit einem alternativen Druck-Framework oder -Tool. Schauen Sie sich die Demoanwendung PDF in Eto.Forms drucken an, die zeigt, wie Sie PDF-Dokumente ohne System.Drawing.Printing drucken.

PDF in C# und VB.NET rendern

Das Anzeigen von PDF-Dateien in Ihrer Anwendung ähnelt dem Drucken. In ASP.NET, WPF, Eto.Forms, Avalonia oder einem anderen Anwendungstyp PDF in Bild konvertieren und dann das Bild anzeigen.

In einer Windows Forms-App können Sie von jedem Steuerelement aus eine PDF-Seite in einem System.Drawing.Graphics-Kontext zeichnen. Oder Sie können eine PDF-Seite in eine System.Drawing.Bitmap konvertieren und die Bitmap dann in einer PictureBox anzeigen.

Dieses Beispiel zeigt, wie man eine PDF-Seite in Bitmap in C# konvertiert:

using (var pdf = new PdfDocument("render.pdf"))
{
    const float TargetResolution = 300;
    
    PdfPage page = pdf.Pages[0];
    double scaleFactor = TargetResolution / page.Resolution;

    using (var bitmap = new Bitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor)))
    {
        bitmap.SetResolution(TargetResolution, TargetResolution);

        using (Graphics gr = Graphics.FromImage(bitmap))
            page.Draw(gr);

        bitmap.Save("result.png");
    }
}

Für den obigen Code müssen Sie Ihrem Projekt BitMiracle.Docotic.Pdf.Gdi-Erweiterungs-DLL hinzufügen.

Erstellen Sie einen PDF-Viewer oder PDF-Editor in einer .NET-Anwendung

Mit Docotic.Pdf können Sie detaillierte Informationen zu jedem Objekt auf einer PDF-Seite abrufen. Sie können Textblöcke, Bilder, Vektorpfade, Formularsteuerelemente und Anmerkungen aus einer PDF-Seite extrahieren.

Anschließend können Sie in Ihrer Anwendung alle extrahierten Objekte rendern. Sie können auch die Möglichkeit implementieren, die gerenderten Objekte auszuwählen und zu bearbeiten.

Schauen Sie sich das Beispiel Text, Bilder und Pfade aus PDF extrahieren an. Es zeigt, wie Seitenobjekte extrahiert und in den Kontext System.Drawing.Graphics gezeichnet werden.

Sie können Textobjekte auch als Vektorpfade extrahieren. Verwenden Sie dazu die Überladung PdfPage.GetObjects(PdfObjectExtractionOptions).

Abschluss

Verwenden Sie die Docotic.Pdf-Bibliothek, um PDF-Dokumente in Ihren .NET-Projekten anzuzeigen und zu drucken. Sehen Sie sich verwandte C#- und VB.NET-Beispiele an:

Kontaktieren Sie uns, wenn Sie Fragen zum Drucken oder Rendern von PDFs haben.