Jak generować pliki PDF w bibliotece VB .NET | IronPDF
Migracja z SQL Server Reporting Services (SSRS) na IronPDF przekształca twój przepływ pracy generacji PDF z ciężkiej, serwerowej infrastruktury na lekką, biblioteczkę wewnątrz aplikacji, która może być osadzona bezpośrednio w dowolnej aplikacji .NET. Ten przewodnik dostarcza pełną, szczegółową ścieżkę migracji, która eliminuje zależności SQL Server, obciążenie serwera raportów i zamknięcie w ekosystemie Microsoft.
Dlaczego migrować z SSRS do IronPDF
Zrozumienie SSRS
SQL Server Reporting Services (SSRS) to platforma raportowa firmy Microsoft dla przedsiębiorstw — pełen zestaw do tworzenia, wdrażania i zarządzania raportami, ściśle zintegrowany z ekosystemem SQL Server. Microsoft potwierdził, że SSRS 2022 to ostatnia niezależna wersja: począwszy od SQL Server 2025, raportowanie lokalne zostanie skoncentrowane w Power BI Report Server (PBIRS), a nowe wersje SSRS nie będą publikowane. SSRS 2022 otrzymuje aktualizacje zabezpieczeń do 11 stycznia 2033, zgodnie z cyklem życia SQL Server 2022 (zobacz FAQ o konsolidacji usług raportowania).
Dla wielu scenariuszy generowania PDF, infrastruktura SSRS jest nadmiarem. Kluczowe powody do migracji obejmują:
- Koniec z SSRS: SQL Server 2025 jest dostarczany bez SSRS; PBIRS go zastępuje. Nowe prace skierowane na SSRS to ślepa uliczka.
- Ciężka infrastruktura: Wymaga SQL Server, Report Server i (dla starszego widoku Web Forms) konfiguracji IIS
- Uwiązanie przez ekosystem Microsoft: Powiązane z licencjonowaniem SQL Server i Windows Server
- Złożona implementacja: Wdrożenie raportów, konfiguracja zabezpieczeń i zarządzanie subskrypcjami
- Drogie licencjonowanie: Licencje SQL Server, zwłaszcza dla funkcji przedsiębiorstwa
- Brak wsparcia pierwszej klasy dla .NET Core: pakiety Microsoft
Microsoft.ReportingServices.ReportViewerControl.WebForms/.Winformssą przeznaczone tylko dla .NET Framework 4.0–4.8.1. Użytkownicy .NET Core / .NET 5+ polegają na porcie społecznościowymReportViewerCore.NETCore. - Dodatkowe obciążenie konserwacyjne: Łatanie serwera, konserwacja baz danych, zarządzanie raportami
- Brak opcji zintegrowanej z chmurą: Zaprojektowane dla środowisk lokalnych, wsparcie w chmurze jest niezręczne
Kiedy SSRS to przesada
| Twoje potrzeby | SSRS narzut |
|---|---|
| Generowanie faktur | Pełny serwer raportów |
| Eksport tabel danych | Licencja SQL Server |
| Tworzenie plików PDF na podstawie danych | Windows Server |
| Proste generowanie dokumentów | Subskrypcje raportów |
IronPDF umożliwia generowanie plików PDF w trakcie przetwarzania bez konieczności posiadania infrastruktury serwerowej.
Porównanie SSRS z IronPDF
| Funkcja | SSRS | IronPDF |
|---|---|---|
| Zależności | Wymaga SQL Server | Brak konkretnej zależności od bazy danych |
| Wdrożenie | Oparte na serwerze | Biblioteka (wbudowana w aplikacje) |
| Integracja | Ścisła integracja z Microsoftem | Działa z dowolnym źródłem danych |
| Wizualizacja danych | Szeroki wybór opcji językowych | Wizualizacje skupione na plikach PDF |
| Złożoność | Wysoki (wymagana konfiguracja serwera) | Umiarkowana do niskiej (konfiguracja biblioteki) |
| Koszt | Koszty licencji SQL Server | Koszt licencji dla programisty |
| HTML do PDF | Nie | Pełny Chromium |
| URL do pliku PDF | Nie | Tak |
| Obsługa CSS | Ograniczone | Pełny CSS3 |
| JavaScript | Nie | Pełna wersja ES2024 |
IronPDF, w odróżnieniu od SSRS, nie jest związany z żadnym specyficznym ekosystemem baz danych ani serwerów. Zapewnia deweloperom elastyczną bibliotekę do dynamicznego tworzenia, edytowania i manipulowania dokumentami PDF bezpośrednio w C#. To rozdzielenie od infrastruktury opartej na serwerze oferuje zauważalną korzyść — jest proste i elastyczne, nadające się do szerokiej gamy aplikacji, nie tylko do raportowania.
Dla zespołów przyjmujących nowoczesny .NET, IronPDF dostarcza silnik renderujący Chromium, który eliminuje złożoność infrastruktury SSRS.
Zanim zaczniesz
Wymagania wstępne
- Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com
Zmiany w pakiecie NuGet
# SSRS itself is server-based, but the in-process LocalReport API
# ships via Microsoft's ReportViewerControl packages (latest 150.1652.0,
# June 2024 — .NET Framework 4.0–4.8.1 only).
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WebForms
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.Winforms
# If your project used the community .NET Core port, remove it too:
# dotnet remove package ReportViewerCore.NETCore
# Install IronPDF
dotnet add package IronPdf
Konfiguracja licencji
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"Kompletna dokumentacja API
Zmiany w przestrzeni nazw
// Before: SSRS
using Microsoft.Reporting.WebForms;
using Microsoft.Reporting.WinForms;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;Imports Microsoft.Reporting.WebForms
Imports Microsoft.Reporting.WinForms
' After: IronPDF
Imports IronPdf
Imports IronPdf.RenderingMapowania podstawowych interfejsów API
| Koncepcja SSRS | Odpowiednik IronPDF | Uwagi |
|---|---|---|
LocalReport | ChromePdfRenderer | Renderowanie rdzenia |
ServerReport | RenderUrlAsPdf() | Renderowanie oparte na URL |
.rdlc pliki | Szablony HTML/CSS | Format szablonu |
ReportParameter | Interpolacja ciągów znaków | Parametry |
ReportDataSource | Dane C# + HTML | Powiązanie danych |
LocalReport.Render("PDF") | RenderHtmlAsPdf() | Wynik w formacie PDF |
SubReport | Połączone pliki PDF | Raporty zagnieżdżone |
Report Server URL | Nie jest potrzebne | Nie wymaga serwera |
ReportViewer kontrola | Nie jest potrzebne | Bezpośrednia generacja PDF |
| Formaty eksportu | PDF jest formatem natywnym | Skoncentrowane output |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF
Before (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSHtmlToPdf
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
// Load RDLC report definition
reportViewer.LocalReport.ReportPath = "Report.rdlc";
// Add HTML content as a parameter or dataset
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var param = new ReportParameter("HtmlContent", htmlContent);
reportViewer.LocalReport.SetParameters(param);
// Render the report to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF",
null,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
File.WriteAllBytes("output.pdf", bytes);
}
}
Po (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Save the PDF file
pdf.SaveAs("output.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Module IronPdfHtmlToPdf
Sub Main()
' Create a ChromePdfRenderer instance
Dim renderer = New ChromePdfRenderer()
' Convert HTML string to PDF
Dim htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Save the PDF file
pdf.SaveAs("output.pdf")
End Sub
End ModuleTen przykład ilustruje podstawową różnicę architektoniczną. SSRS wymaga utworzenia instancji ReportViewer, załadowania pliku definicji raportu .rdlc, ustawienia parametrów, a następnie wywołania LocalReport.Render("PDF") z wieloma out parametrami metadanych.
IronPDF używa ChromePdfRenderer z RenderHtmlAsPdf() w zaledwie trzech liniach kodu. Nie są wymagane pliki definicji raportów, obiekty parametrów ani obsługa metadanych. Kompleksowe przykłady można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: URL do PDF z nagłówkami i stopkami
Before (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.IO;
using System.Net;
using Microsoft.Reporting.WebForms;
class SSRSUrlToPdf
{
static void Main()
{
// Download HTML content from URL
string url = "https://example.com";
string htmlContent;
using (var client = new WebClient())
{
htmlContent = client.DownloadString(url);
}
// Create RDLC report with header/footer configuration
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "WebReport.rdlc";
// Set parameters for header and footer
var parameters = new ReportParameter[]
{
new ReportParameter("HeaderText", "Company Report"),
new ReportParameter("FooterText", "Page " + DateTime.Now.ToString()),
new ReportParameter("HtmlContent", htmlContent)
};
reportViewer.LocalReport.SetParameters(parameters);
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("webpage.pdf", bytes);
}
}
Po (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class IronPdfUrlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options with header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Company Report</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages} - " + DateTime.Now.ToString("MM/dd/yyyy") + "</div>"
};
// Convert URL to PDF
string url = "https://example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save the PDF file
pdf.SaveAs("webpage.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Class IronPdfUrlToPdf
Shared Sub Main()
' Create a ChromePdfRenderer instance
Dim renderer As New ChromePdfRenderer()
' Configure rendering options with header and footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Company Report</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages} - " & DateTime.Now.ToString("MM/dd/yyyy") & "</div>"
}
' Convert URL to PDF
Dim url As String = "https://example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
' Save the PDF file
pdf.SaveAs("webpage.pdf")
End Sub
End ClassSSRS nie może bezpośrednio konwertować URL do PDF. Musisz ręcznie pobrać treść HTML za pomocą WebClient.DownloadString(), utworzyć oddzielny plik raportu .rdlc, przekazać treść HTML i tekst nagłówka/stopki jako tablice ReportParameter, a następnie wyrenderować złożonym podpisem metody Render().
RenderUrlAsPdf() w IronPDF obsługuje cały proces jednym wywołaniem. Nagłówki i stopki są konfigurowane z obiektami HtmlHeaderFooter, które obsługują pełny HTML/CSS i placeholdery jak {page} i {total-pages}. Dowiedz się więcej z naszych samouczków.
Przykład 3: Raport oparty na bazie danych
Before (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSDatabaseReport
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "SalesReport.rdlc";
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
var dataSet = new DataSet();
adapter.Fill(dataSet, "Sales");
// Bind data to report
var dataSource = new ReportDataSource("SalesDataSet", dataSet.Tables[0]);
reportViewer.LocalReport.DataSources.Clear();
reportViewer.LocalReport.DataSources.Add(dataSource);
}
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("sales-report.pdf", bytes);
}
}
Po (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
class IronPdfDatabaseReport
{
static void Main()
{
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
var dataTable = new DataTable();
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
adapter.Fill(dataTable);
}
// Build HTML table from data
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<h1>Sales Report</h1><table border='1'><tr>");
foreach (DataColumn column in dataTable.Columns)
htmlBuilder.Append($"<th>{column.ColumnName}</th>");
htmlBuilder.Append("</tr>");
foreach (DataRow row in dataTable.Rows)
{
htmlBuilder.Append("<tr>");
foreach (var item in row.ItemArray)
htmlBuilder.Append($"<td>{item}</td>");
htmlBuilder.Append("</tr>");
}
htmlBuilder.Append("</table>");
// Convert to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlBuilder.ToString());
pdf.SaveAs("sales-report.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Class IronPdfDatabaseReport
Shared Sub Main()
' Create database connection and fetch data
Dim connString As String = "Server=localhost;Database=SalesDB;Integrated Security=true;"
Dim dataTable As New DataTable()
Using connection As New SqlConnection(connString)
Dim adapter As New SqlDataAdapter("SELECT * FROM Sales", connection)
adapter.Fill(dataTable)
End Using
' Build HTML table from data
Dim htmlBuilder As New StringBuilder()
htmlBuilder.Append("<h1>Sales Report</h1><table border='1'><tr>")
For Each column As DataColumn In dataTable.Columns
htmlBuilder.Append($"<th>{column.ColumnName}</th>")
Next
htmlBuilder.Append("</tr>")
For Each row As DataRow In dataTable.Rows
htmlBuilder.Append("<tr>")
For Each item In row.ItemArray
htmlBuilder.Append($"<td>{item}</td>")
Next
htmlBuilder.Append("</tr>")
Next
htmlBuilder.Append("</table>")
' Convert to PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlBuilder.ToString())
pdf.SaveAs("sales-report.pdf")
End Sub
End ClassSSRS wymaga wstępnie zaprojektowanego pliku raportu .rdlc ("SalesReport.rdlc"), wypełnienia DataSet, stworzenia ReportDataSource z określoną nazwą ("SalesDataSet"), która musi zgadzać się z definicją raportu, usunięcia istniejących źródeł danych, dodania nowego źródła danych, a następnie renderowania.
IronPDF używa Twojego istniejącego kodu dostępu do danych (ten sam wzorzec SqlDataAdapter), a następnie dynamicznie buduje HTML za pomocą StringBuilder. Masz pełną kontrolę nad układem używając standardowego HTML/CSS — nie są wymagane pliki definicji raportów.
Porównanie funkcji
| Funkcja | SSRS | IronPDF |
|---|---|---|
| :Infrastructure: | ||
| Licencja SQL Server | Wymagane | Nie jest potrzebne |
| Windows Server | Wymagane | Dowolna platforma |
| Wymagana baza danych | Tak (baza danych ReportServer) | Nie |
| :Rozwój: | ||
| Format szablonu | RDLC/RDL | HTML/CSS/Razor |
| Źródła danych | Wbudowany DSN | Wszelkie dane w języku C# |
| :Rendering: | ||
| URL do pliku PDF | Nie | Tak |
| Obsługa CSS | Ograniczone | Pełny CSS3 |
| JavaScript | Nie | Pełna wersja ES2024 |
| Wykresy | Wbudowane | Za pośrednictwem bibliotek JS |
| :Wdrozenie: | ||
| Konfiguracja | Złożone | Proste |
| Konserwacja | Wysoka | Niski |
Typowe problemy związane z migracją
Problem 1: Definicje raportów RDLC
SSRS: Używa własnego formatu XML .rdlc.
Rozwiązanie: Konwersja na szablony HTML:
- Otwórz .rdlc w Visual Studio
- Opisz strukturę układu
- Odtwórz w HTML/CSS
- Użyj Razor do łączenia danych
Problem 2: Udostępnione źródła danych
SSRS: Łańcuchy połączeń w Report Server.
Rozwiązanie: Użyj warstwy dostępu do danych aplikacji:
var data = await _dbContext.Sales.ToListAsync();
// Then bind to HTML templateDim data = Await _dbContext.Sales.ToListAsync()
' Then bind to HTML templateProblem 3: UI parametrów raportu
SSRS: Wbudowane wywołania parametrów.
Rozwiązanie: Zbuduj UI parametrów w swojej aplikacji:
// Your own parameter form, then:
var pdf = GenerateReport(startDate, endDate, region);' Your own parameter form, then:
Dim pdf = GenerateReport(startDate, endDate, region)Problem 4: Subskrypcje/zaplanowane raporty
SSRS: Wbudowany silnik subskrypcji.
Rozwiązanie: Użyj frameworka prac w tle:
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);netLista kontrolna migracji
Przed migracją
- Inwentaryzacja wszystkich raportów SSRS (pliki
.rdlc) - Udokumentuj źródła danych i połączenia
- Zrób zrzut ekranowy układów raportów dla odniesienia wizualnego
- Wypisz parametry raportów dla każdego raportu
- Zapisz harmonogramy subskrypcji
- Uzyskaj klucz licencyjny IronPDF ze strony ironpdf.com
Aktualizacje kodu
- Usuń pakiety ReportViewer
- Instalacja pakietu NuGet
IronPdf - Konwersja plików
.rdlcna szablony HTML - Zastąp
LocalReportprzezChromePdfRenderer - Zastąp
ReportDataSourceprzez dane C# + szablony HTML - Zastąp
ReportParameterprzez interpolację łańcuchów - Zastąp
LocalReport.Render("PDF")przezRenderHtmlAsPdf() - Zastosuj nagłówki/stopki za pomocą
HtmlHeaderFooter - Dodaj inicjalizację licencji podczas uruchamiania aplikacji
Infrastruktura
- Zaplanuj wycofanie z użytkowania serwera raportów
- Zmiany subskrypcji na planista zadań (np. Hangfire)
- Aktualizacja skryptów wdrażania
Testowanie
- Porównaj wizualnie wynik PDF
- Zweryfikuj dokładność danych
- Przetestuj paginację
- Sprawdź wszystkie parametry
- Testy wydajności

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.