
Jak stworzyć aplikację raportującą w C#
Otwieranie pliku PDF w domyślnej przeglądarce jest częstym zadaniem podczas tworzenia aplikacji .NET. Po wygenerowaniu plików PDF programowo za pomocą IronPDF często trzeba je natychmiast wyświetlić użytkownikom w wybranej przez nich domyślnej aplikacji — takiej jak Adobe Acrobat lub Microsoft Edge. Ten przewodnik przeprowadza cie przez kroki tworzenia plikow PDF przy uzyciu IronPDF i automatycznego otwierania ich w Windows za pomoca System.Diagnostics.Process.Start.
Polaczenie potężnych mozliwosci konwersji HTML do PDF IronPDF z prostą metodą uruchamiania Process tworzy praktyczny przeplyw pracy do budowania i wyswietlania profesjonalnych plikow PDF w domyslnej aplikacji skonfigurowanej na komputerze uzytkownika.
Jak zainstalować IronPDF w projekcie .NET?
Przed wygenerowaniem lub otwarciem jakiegokolwiek pliku PDF należy zainstalować IronPDF w swoim projekcie. Użyj konsoli menedżera pakietów NuGet lub interfejsu CLI .NET:
Po instalacji dodaj klucz licencyjny lub rozpocznij bezpłatny okres próbny, aby uzyskać dostęp do pełnej funkcjonalności. Dokumentacja IronPDF szczegółowo opisuje wszystkie opcje konfiguracyjne, w tym instalację za pośrednictwem NuGet.
Po zainstalowaniu uzyskasz dostęp do pełnego zestawu funkcji IronPDF, w tym konwersji HTML na PDF, renderowania adresów URL, scałania plików PDF, dodawania znaków wodnych, podpisywania cyfrowego i wielu innych.
Jak wygenerować i otworzyć plik PDF?
Najprostsze podejście obejmuje trzy etapy:
- Utwórz dokument PDF za pomocą IronPDF.
- Zapisz plik w katalogu.
- Otworz PDF w domyslnej aplikacji uzywając
Process.Start.
Oto kompletny przykład, który można wypróbować w Visual Studio w nowym projekcie aplikacji konsolowej:
using IronPdf;
using System.Diagnostics;
// Create a new PDF renderer
var renderer = new ChromePdfRenderer();
// Generate PDF from HTML content
var pdf = renderer.RenderHtmlAsPdf(@"
<html>
<body>
<h1>Invoice #12345</h1>
<p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
<table>
<tr><td>Product</td><td>Price</td></tr>
<tr><td>IronPDF License</td><td>$299</td></tr>
</table>
</body>
</html>");
// Save the PDF to a file
string outputPath = "invoice.pdf";
pdf.SaveAs(outputPath);
// Open the PDF in the default viewer
Process.Start(new ProcessStartInfo
{
FileName = outputPath,
UseShellExecute = true
});Imports IronPdf
Imports System.Diagnostics
' Create a new PDF renderer
Dim renderer As New ChromePdfRenderer()
' Generate PDF from HTML content
Dim pdf = renderer.RenderHtmlAsPdf("
<html>
<body>
<h1>Invoice #12345</h1>
<p>Generated on: " & DateTime.Now.ToString("yyyy-MM-dd") & "</p>
<table>
<tr><td>Product</td><td>Price</td></tr>
<tr><td>IronPDF License</td><td>$299</td></tr>
</table>
</body>
</html>")
' Save the PDF to a file
Dim outputPath As String = "invoice.pdf"
pdf.SaveAs(outputPath)
' Open the PDF in the default viewer
Process.Start(New ProcessStartInfo With {
.FileName = outputPath,
.UseShellExecute = True
})Ten kod najpierw tworzy instancję ChromePdfRenderer, ktora jest glowną klasą IronPDF do konwersji HTML do PDF. Metoda RenderHtmlAsPdf konwertuje ciag HTML na obiekt dokumentu PDF. Więcej informacji na temat tego podejścia można znaleźć w przewodniku IronPDF dotyczącym konwersji HTML do PDF.
Po zapisaniu PDF przy użyciu SaveAs, kod uzywa Process.Start z ProcessStartInfo, aby otworzyc plik w domyslnym przegladarce PDF. Kluczowe ustawienie tutaj to UseShellExecute = true, ktore informuje Windows, aby otworzyc plik PDF z jego domyslną aplikacją.
Wynik
Jak pokazano na poniższym obrazku, IronPDF z powodzeniem generuje plik PDF i wyświetla go przy użyciu domyślnej przeglądarki skonfigurowanej w systemie — w tym przypadku Opera GX.

Dlaczego stwierdzenia najwyższego poziomu?
W .NET 10 i nowoczesnych wersjach C#, najwyzsze poziomy instrukcji usuwają potrzebe otoczki klasy Program. Kod uruchamia się bezpośrednio od początku pliku, dzięki czemu przykłady są krótsze i łatwiejsze do zrozumienia. Wszystkie przykłady w tym przewodniku wykorzystują ten schemat.
Dlaczego funkcja UseShellExecute ma znaczenie podczas otwierania dokumentów PDF?
W .NET Core i nowoczesnych wersjach .NET (.NET 5 do .NET 10), parametr UseShellExecute domyslnie ustawia sie na false. Bez wyraźnego ustawienia na true, twoja aplikacja zgłosi blad przy probie uruchomienia pliku PDF.
using IronPdf;
using System.Diagnostics;
using System.IO;
// Generate a report with IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
var pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page");
// Save to temp directory for immediate viewing
string tempPath = Path.Combine(Path.GetTempPath(), $"URL_{Guid.NewGuid()}.pdf");
pdf.SaveAs(tempPath);
// IMPORTANT: Set UseShellExecute = true for .NET Core/5+
var startInfo = new ProcessStartInfo
{
FileName = tempPath,
UseShellExecute = true // Required in .NET Core/5+ to open PDF in default viewer
};
Process.Start(startInfo);Imports IronPdf
Imports System.Diagnostics
Imports System.IO
' Generate a report with IronPDF
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
Dim pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page")
' Save to temp directory for immediate viewing
Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"URL_{Guid.NewGuid()}.pdf")
pdf.SaveAs(tempPath)
' IMPORTANT: Set UseShellExecute = true for .NET Core/5+
Dim startInfo As New ProcessStartInfo With {
.FileName = tempPath,
.UseShellExecute = True ' Required in .NET Core/5+ to open PDF in default viewer
}
Process.Start(startInfo)Wlasciwosc UseShellExecute okresla, czy uzywac powloki systemu operacyjnego do rozpoczynania procesu. Po ustawieniu na true, Windows uzywa rejestru skojarzen plikow, aby okreslic, ktory domyslny czytnik PDF powinien otworzyc plik. Bez tego ustawienia w nowoczesnych wersjach .NET, napotkasz blad wykonania, mowiac, ze plik nie moze zostac otwarty.
Uzywanie katalogu tymczasowego z unikalnym nazewnictwem (przez Guid.NewGuid()) zapobiega konfliktom plikow przy generowaniu wielu PDFow w szybkim tempie. Domyślny folder tymczasowy jest automatycznie czyszczony przez system operacyjny zgodnie z ustalonym harmonogramem.
Wynik

Jak poprawnie obsługiwać ścieżki do plików?
Ścieżki plików zawierające spacje i znaki specjalne wymagają ostrożnego traktowania. Brakujący katalog lub nieprawidlowo sformowana sciezka bedą fail silent lub zgloszą wyjatek, zanim osiągniesz Process.Start. Oto podejście obejmujące tworzenie katalogów i sprawdzanie istnienia plików:
using IronPdf;
using System.Diagnostics;
using System.IO;
// Generate PDF from HTML file
var renderer = new ChromePdfRenderer();
var htmlContent = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Create output directory if it doesn't exist
string outputDir = @"C:\PDF Reports\Monthly";
Directory.CreateDirectory(outputDir);
// Build file path with timestamp
string fileName = $"Report_{DateTime.Now:yyyyMMdd_HHmmss}.pdf";
string fullPath = Path.Combine(outputDir, fileName);
// Save the PDF
pdf.SaveAs(fullPath);
// Verify file exists before opening in default PDF viewer
if (File.Exists(fullPath))
{
Process.Start(new ProcessStartInfo
{
FileName = fullPath,
UseShellExecute = true
});
}
else
{
Console.WriteLine($"Error: PDF file not found at {fullPath}");
}Imports IronPdf
Imports System.Diagnostics
Imports System.IO
' Generate PDF from HTML file
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = File.ReadAllText("template.html")
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Create output directory if it doesn't exist
Dim outputDir As String = "C:\PDF Reports\Monthly"
Directory.CreateDirectory(outputDir)
' Build file path with timestamp
Dim fileName As String = $"Report_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"
Dim fullPath As String = Path.Combine(outputDir, fileName)
' Save the PDF
pdf.SaveAs(fullPath)
' Verify file exists before opening in default PDF viewer
If File.Exists(fullPath) Then
Process.Start(New ProcessStartInfo With {
.FileName = fullPath,
.UseShellExecute = True
})
Else
Console.WriteLine($"Error: PDF file not found at {fullPath}")
End IfTen kod demonstruje kilka najlepszych praktyk: uzywanie Path.Combine do poprawnego tworzenia sciezek plikow bez wzgledu na system operacyjny, tworzenie katalogow zgodnie z potrzebą za pomoca Directory.CreateDirectory oraz weryfikowanie istnienia plikow przed proba ich otwarcia w domyslnej przegladarce PDF.
Sygnatura czasowa w nazwie pliku zapewnia unikalność i stanowi jasny zapis daty utworzenia każdego pliku PDF. Aby uzyskać informacje na temat zaawansowanych opcji edycji plików PDF, takich jak łączenie lub dzielenie plików, dodawanie znaków wodnych, podpisów cyfrowych oraz nagłówków i stopek, zapoznaj się z poradnikami IronPDF.
A co z ścieżkami zawierającymi spacje?
Path.Combine poprawnie obsluguje spacje, poniewaz tworzy sciezki jako ciagi, zamiast polegac na ekspansji powloki. Klasa ProcessStartInfo również poprawnie obsluguje otoczone cudzyslowem sciezki przy UseShellExecute = true. Jeśli kiedykolwiek przekazujesz ścieżkę do polecenia powłoki bezpośrednio, zawsze otaczaj ją podwójnymi cudzysłowami. Dzięki Process.Start, wlasciwosc FileName nie wymaga recznego otoczenia cudzyslowiem.
Jak stosować najlepsze praktyki gotowe do wdrożenia w środowisku produkcyjnym?
W przypadku aplikacji produkcyjnych warto rozważyć bardziej kompletny proces, który obsługuje cykl życia plików PDF wraz z obsługą błędów, konfigurowalnymi opcjami renderowania i przewidywalnymi katalogami wyjściowymi:
using IronPdf;
using IronPdf.Rendering;
using System.Diagnostics;
using System.IO;
static void GenerateAndDisplayPdf(string htmlContent, string documentName)
{
try
{
// Configure IronPDF renderer with production settings
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
PaperSize = PdfPaperSize.A4,
PrintHtmlBackgrounds = true,
CreatePdfFormsFromHtml = true
}
};
// Generate the PDF
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Use the user's Documents folder for better accessibility
string documentsPath = Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments);
string pdfFolder = Path.Combine(documentsPath, "Generated PDFs");
Directory.CreateDirectory(pdfFolder);
string outputPath = Path.Combine(pdfFolder, $"{documentName}.pdf");
pdf.SaveAs(outputPath);
// Open PDF in default viewer without waiting for it to close
Process.Start(new ProcessStartInfo
{
FileName = outputPath,
UseShellExecute = true // Essential for opening PDF in default application
});
Console.WriteLine($"PDF opened: {outputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"Error generating or opening PDF: {ex.Message}");
}
}Imports IronPdf
Imports IronPdf.Rendering
Imports System.Diagnostics
Imports System.IO
Module PdfGenerator
Sub GenerateAndDisplayPdf(htmlContent As String, documentName As String)
Try
' Configure IronPDF renderer with production settings
Dim renderer As New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.PaperSize = PdfPaperSize.A4,
.PrintHtmlBackgrounds = True,
.CreatePdfFormsFromHtml = True
}
}
' Generate the PDF
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Use the user's Documents folder for better accessibility
Dim documentsPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim pdfFolder As String = Path.Combine(documentsPath, "Generated PDFs")
Directory.CreateDirectory(pdfFolder)
Dim outputPath As String = Path.Combine(pdfFolder, $"{documentName}.pdf")
pdf.SaveAs(outputPath)
' Open PDF in default viewer without waiting for it to close
Process.Start(New ProcessStartInfo With {
.FileName = outputPath,
.UseShellExecute = True ' Essential for opening PDF in default application
})
Console.WriteLine($"PDF opened: {outputPath}")
Catch ex As Exception
Console.WriteLine($"Error generating or opening PDF: {ex.Message}")
End Try
End Sub
End ModuleTen przykład zawiera ustrukturyzowaną obsługę błędów i zapisuje pliki PDF w folderze Dokumenty użytkownika, który jest dostępny niezależnie od sposobu uruchomienia aplikacji. Konfiguruje również IronPDF z opcjami renderowania odpowiednimi dla dokumentów biznesowych: format papieru A4, włączone drukowanie tła HTML oraz automatyczne tworzenie pól formularza z elementów formularza HTML.
Możesz dowiedzieć się więcej o interaktywnych formularzach PDF i niestandardowych znakach wodnych w bibliotece how-to IronPDF.
Metoda ta nie czeka na zamknięcie przeglądarki PDF, co pozwala aplikacji na dalsze działanie podczas przeglądania dokumentu przez użytkownika. Zgodnie z dokumentacją Microsoftu dotyczącą Process.Start takie podejście zapewnia właściwe zarządzanie zasobami i zapobiega blokowaniu aplikacji przez długotrwały proces przeglądarki. Dokumentacja klasy ProcessStartInfo w serwisie Microsoft Learn zawiera pełną listę właściwości, które można skonfigurować, w tym styl okna, czasownik (otwórz, PRINT) oraz katalog roboczy.

Konfigurowanie opcji renderowania
Klasa ChromePdfRenderOptions daje ci precyzyjną kontrole nad wyjsciowym PDF. Typowe ustawienia obejmują:
- PaperSize -- Ustawione na
PdfPaperSize.A4,Letterlub dowolny standardowy rozmiar. - PrintHtmlBackgrounds — renderuje kolory tła i obrazy z kodu HTML.
- CreatePdfFormsFromHtml -- Konwertuje elementy
<input>i<select>HTML na interaktywne pola formularzy PDF. - MarginTop / MarginBottom / MarginLeft / MarginRight -- Kontroluje marginesy strony w milimetrach.
Ustawienia te mają zastosowanie niezależnie od tego, czy renderujesz ciągi HTML, lokalne pliki HTML czy zdalne adresy URL.
Jak wyodrębnić dane z wygenerowanych plików PDF?
Po wygenerowaniu i otwarciu pliku PDF może być również konieczne ponowne odczytanie jego zawartości. IronPDF obsługuje wyodrębnianie tekstu z plików PDF, co jest przydatne do rejestrowania, weryfikacji lub dalszego przetwarzania.
W przypadku dokumentów zawierających dużo obrazów można również skorzystać z konwersji PDF na obraz, aby renderować poszczególne strony jako pliki PNG lub JPEG. Jest to powszechne w generowaniu podglądów i procesach tworzenia miniatur.
Obie funkcje są dostępne za pośrednictwem tej samej biblioteki IronPDF i nie wymagają dodatkowych zależności. Pełna dokumentacja API IronPDF zawiera opisy metod dla wszystkich operacji wyodrębniania i konwersji.
Co się stanie, jeśli nie ma zainstalowanej przeglądarki PDF?
Jeśli na komputerze docelowym nie jest zainstalowana przeglądarka plików PDF, system Windows wyświetli okno dialogowe z prośbą o wybranie aplikacji lub odwiedzenie sklepu Microsoft Store w celu jej znalezienia. To standardowe zachowanie Windows i jest poza kontrolą Process.Start.
Aby radzic sobie z tym elegancko w kodzie produkcyjnym, mozesz złapać Win32Exception, ktory wyrzuca Process.Start, gdy żaden zarejestrowany obslugujacy nie zostanie znaleziony dla rozszerzenia pliku .pdf:
using System.ComponentModel;
using System.Diagnostics;
try
{
Process.Start(new ProcessStartInfo
{
FileName = outputPath,
UseShellExecute = true
});
}
catch (Win32Exception ex) when (ex.NativeErrorCode == 1155)
{
// Error 1155: No application associated with the file extension
Console.WriteLine("No PDF viewer is installed. Please install a PDF reader such as Adobe Acrobat Reader.");
}Imports System.ComponentModel
Imports System.Diagnostics
Try
Process.Start(New ProcessStartInfo With {
.FileName = outputPath,
.UseShellExecute = True
})
Catch ex As Win32Exception When ex.NativeErrorCode = 1155
' Error 1155: No application associated with the file extension
Console.WriteLine("No PDF viewer is installed. Please install a PDF reader such as Adobe Acrobat Reader.")
End TryKod bledu 1155 odpowiada ERROR_NO_ASSOCIATION, ktory Windows zwraca, gdy zadna aplikacja nie jest zarejestrowana dla typu pliku. Wykrycie tego konkretnego błędu pozwala wyświetlić pomocny komunikat zamiast powodować awarię. Pełna lista kodów błędów systemu Windows jest udokumentowana w przewodniku po kodach błędów Win32 na platformie Microsoft Learn.
Jak wybrać odpowiednie podejście do swojej aplikacji?
Metoda otwierania pliku PDF zależy od typu tworzonej aplikacji:
| Typ aplikacji | Zalecane podejście | Kluczowe kwestie |
|---|---|---|
| Aplikacja konsolowa lub desktopowa | Process.Start z UseShellExecute = true | Proste, bez dodatkowych zależności |
| Usługa Windows | Zapisz na dysku; powiadom użytkownika za pośrednictwem IPC lub kolejki komunikatów | Usługi działają bez sesji pulpitu |
| Aplikacja internetowa (ASP.NET) | Przesyłaj strumieniowo pliki PDF jako pliki do pobrania lub bezpośrednio w przeglądarce | Process.Start nie jest prawidłowy w kontekście serwerów internetowych |
| MAUI lub WinForms | Process.Start lub wbudowany kontrolka PDF | Wbudowana funkcja podglądu zapewnia lepsze wrażenia podczas korzystania z aplikacji |
Dla aplikacji webowych budowanych w ASP.NET Core, nie uzywaj Process.Start. Proces serwera działa w środowisku bezinterfejsowym i nie może otwierać aplikacji desktopowych. Zamiast tego, zwroc PDF jako wynik plikowy uzywajacy File() z typem MIME application/pdf, i pozwol przegladarce na obsluge wyswietlania.
Dla aplikacji konsolowych i desktopowych, Process.Start z UseShellExecute = true pozostaje najprostszą i najpewniejszą opcją.
Chcesz rozpocząć generowanie i przeglądanie plików PDF w swojej aplikacji .NET? Zacznij od bezpłatnej wersji próbnej, aby uzyskać dostęp do pełnego zestawu funkcji, lub zapoznaj się ze stroną licencyjną IronPDF, aby znaleźć plan odpowiedni dla swojego projektu.

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.
Powiązane artykuły


