Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Eksport do formatu PDF jednym kliknięciem w języku C# dla pulpitów administracyjnych

Problem związany z eksportowaniem pulpitów nawigacyjnych

Strona główna IronPDF Wewnętrzne pulpity nawigacyjne są tworzone do wyświetlania w przeglądarce internetowej. W momencie, gdy ktoś chce udostępnić go poza nią: na prezentację na spotkaniu zarządu, cotygodniowy zrzut stanu KPI dla zespołu kierowniczego lub raport z audytu zgodności, to sprawy szybko się komplikują.

Drukowanie do PDF w przeglądarce to pierwsza rzecz, którą ludzie próbują i pierwsza, która zawodzi. Strony łamią się i przecinają wykresy, paski boczne nawigacji przeciekają do układu, a otrzymany PDF wygląda zupełnie inaczej niż żywy pulpit nawigacyjny. Zrzuty ekranu są gorsze: rozdzielczość pogarsza się po skali do A4, tekst nie jest wyszukiwalny, a wielosekcyjny widok KPI rzadko mieści się w jednym obrazie bez utraty połowy danych.

Głębszym problemem są wykresy renderowane w JavaScript. Ponieważ Chart.js, ApexCharts i Highcharts rysują do elementu HTML asynchronicznie, natywne zrzuty HTML do PDF często uchwycają pustą płaszczyznę. Zawartość HTML znajduje się w DOM, ale wizualizacja nie. Tutaj IronPDF może pomóc.

Wynikiem jest, że programista otrzymuje ikonę wiadomości w każdy poniedziałek, proszącą o ręczne pobranie i sformatowanie raportu. To nie jest skalowalny przepływ pracy. Dzisiaj przyjrzymy się przykładzie użycia IronPDF, aby zobaczyć, jak można tworzyć dokumenty PDF z zawartości HTML.

Rozwiązanie: Renderowanie pulpitu nawigacyjnego po stronie serwera za pomocą IronPDF

IronPDF renderuje ten sam HTML, który zasila twój pulpit nawigacyjny, do idealnie odwzorowanego dokumentu PDF. Użytkownik klika przycisk "Eksportuj do PDF" (może oznaczony kluczem w niebieskim kółku lub niebieskim kluczem w kółku), punkt końcowy API obsługuje logikę konwersji HTML, a przeglądarka pobiera treść PDF.

Nie ma potrzeby wdrażania Puppeteer ani zarządzania plikiem binarnym wkhtmltopdf, ani płacenia za eksport API od dostawców trzecich i ich monitorowania. IronPDF działa wewnątrz istniejącej aplikacji ASP.NET jako C# NuGet biblioteka do zadań PDF. Zawiera silnik Chromium, który wykonuje JavaScript w taki sam sposób, jak robi to rzeczywista przeglądarka, co oznacza, że Chart.js i ApexCharts renderują się poprawnie, ponieważ faktycznie działają, zanim strona zostanie uchwycona.

Przycisk eksportu staje się funkcją samoobsługową, którą każdy użytkownik biznesowy może obsługiwać, bez wciągania programisty w pętlę.

Jak to działa w praktyce

1. Użytkownik kliknie "Eksportuj do PDF"

Standardowe wywołanie JavaScript na stronie pulpitu nawigacyjnego wysyła aktywne filtry użytkownika i zakres dat do punktu końcowego API, aby pomóc w utworzeniu dokumentu PDF:

document.getElementById('export-btn').addEventListener('click', async () => {
    const params = new URLSearchParams({ from: dateFrom, to: dateTo, region: selectedRegion });
    const response = await fetch(`/api/reports/export?${params}`);
    const blob = await response.blob();
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'dashboard-report.pdf';
    a.click();
});
document.getElementById('export-btn').addEventListener('click', async () => {
    const params = new URLSearchParams({ from: dateFrom, to: dateTo, region: selectedRegion });
    const response = await fetch(`/api/reports/export?${params}`);
    const blob = await response.blob();
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'dashboard-report.pdf';
    a.click();
});
JAVASCRIPT

Przycisk z naszym kodem JavaScript

Przycisk używający naszego kodu JavaScript Brak przeładowania strony, brak przekierowania, tylko pobranie pliku wyzwolone z obecnego widoku pulpitu nawigacyjnego.

2. Serwer buduje zawartość HTML pulpitu nawigacyjnego

Warstwa kontrolera lub usług zapytuje te same dane, które użytkownik widzi na ekranie, i wypełnia szablon HTML — albo rendrowaną stronę Razor, albo skonstruowany łańcuch HTML — kartami KPI, tabelami danych i konfiguracją wykresu JSON, którą wykona Chart.js lub ApexCharts.

HTML może odwoływać się do arkusza stylów marki, zawierać logo IronSoftware lub używać logo klientów Iron Software. Może również zawierać zasady CSS @media print do ukrywania elementów nawigacyjnych i kontrolowania łamania stron.

Przykładowy plik kontrolera

Przykładowy plik kontrolera

3. ChromePdfRenderer renderuje plik HTML lub zawartość z włączonym JavaScript

Tutaj IronPDF radzi sobie z trudną częścią. EnableJavaScript = true nakazuje rendererowi wykonywać skrypty przed uchwyceniem. WaitFor.NetworkIdle0() wstrzymuje zrzut, dopóki wszystkie asynchroniczne zasoby, w tym dane wykresu ładowane przez fetch, nie zostaną pobrane.

Po zainstalowaniu IronPDF za pomocą DLL PDF w języku C# możesz użyć następującego kodu:

using IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.EnableJavaScript = true;

renderer.RenderingOptions.WaitFor.NetworkIdle0();

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

renderer.RenderingOptions.MarginTop = 15;

renderer.RenderingOptions.MarginBottom = 15;

var pdf = renderer.RenderHtmlAsPdf(dashboardHtml);
using IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.EnableJavaScript = true;

renderer.RenderingOptions.WaitFor.NetworkIdle0();

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

renderer.RenderingOptions.MarginTop = 15;

renderer.RenderingOptions.MarginBottom = 15;

var pdf = renderer.RenderHtmlAsPdf(dashboardHtml);
Imports IronPdf
Imports IronPdf.Rendering

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.EnableJavaScript = True

renderer.RenderingOptions.WaitFor.NetworkIdle0()

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

renderer.RenderingOptions.MarginTop = 15

renderer.RenderingOptions.MarginBottom = 15

Dim pdf = renderer.RenderHtmlAsPdf(dashboardHtml)
$vbLabelText   $csharpLabel

W przypadku pulpitów nawigacyjnych, w których wykresy inicjalizują się na podstawie czasu, a nie na podstawie żądania sieciowego, zamień NetworkIdle0() na WaitFor.JavaScript() i zasygnalizuj gotowość z poziomu callback onComplete swojego wykresu. Każda z tych strategii zapewnia, że biblioteka PDF w języku C# uchwyci wykres po jego narysowaniu, a nie przed.

PoradySet CssMediaType to Print to apply your @media print stylesheet rules. To pozwala ukryć paski boczne, paski nawigacyjne i przyciski akcji z wyeksportowanego PDF bez zmiany HTML żywego pulpitu nawigacyjnego.

4. Kontroler zwraca dokument PDF jako pobranie pliku

Punkt końcowy API owija zawartość PDF w FileContentResult. Niezależnie od tego, czy jesteś członkiem stowarzyszenia PDF, czy użytkownikiem sieci partnerskiej AWS, dostarczenie jest bezproblemowe:

[HttpGet("api/reports/export")]

public IActionResult ExportDashboard([FromQuery] ReportFilters filters)

{

    var dashboardHtml = _reportService.BuildDashboardHtml(filters);

    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.EnableJavaScript = true;

    renderer.RenderingOptions.WaitFor.NetworkIdle0();

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;

    PdfDocument report = renderer.RenderHtmlAsPdf(dashboardHtml);

    return File(

        report.BinaryData,

        "application/pdf",

        $"KPI-Report-{filters.From:yyyyMMdd}.pdf"

    );

}
[HttpGet("api/reports/export")]

public IActionResult ExportDashboard([FromQuery] ReportFilters filters)

{

    var dashboardHtml = _reportService.BuildDashboardHtml(filters);

    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.EnableJavaScript = true;

    renderer.RenderingOptions.WaitFor.NetworkIdle0();

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;

    PdfDocument report = renderer.RenderHtmlAsPdf(dashboardHtml);

    return File(

        report.BinaryData,

        "application/pdf",

        $"KPI-Report-{filters.From:yyyyMMdd}.pdf"

    );

}
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf

<HttpGet("api/reports/export")>
Public Function ExportDashboard(<FromQuery> filters As ReportFilters) As IActionResult

    Dim dashboardHtml = _reportService.BuildDashboardHtml(filters)

    Dim renderer = New ChromePdfRenderer()

    renderer.RenderingOptions.EnableJavaScript = True

    renderer.RenderingOptions.WaitFor.NetworkIdle0()

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print

    Dim report As PdfDocument = renderer.RenderHtmlAsPdf(dashboardHtml)

    Return File(report.BinaryData, "application/pdf", $"KPI-Report-{filters.From:yyyyMMdd}.pdf")

End Function
$vbLabelText   $csharpLabel

Content-Disposition: attachment jest ustawiane automatycznie przez File() z nazwą pliku, dzięki czemu przeglądarka wyzwala pobranie zamiast otwierania PDF w nowej karcie.

Pobrany plik PDF

Wygenerowany raport PDF z przykładowym kodem IronPDF

5. Opcjonalnie: Dystrybucja raportów planowanych

Ta sama metoda renderowania może działać wewnątrz zadania w tle, powtarzającego się zadania Hangfire lub hostowanej usługi IHostedService, która co poniedziałek rano generuje cotygodniowy PDF KPI i wysyła go na listę dystrybucyjną kadry kierowniczej. Nie wymaga interakcji użytkownika.

Korzystne efekty w prawdziwym świecie

Samoobsługa dla użytkowników biznesowych. Gdy przycisk eksportu jest gotowy, wiadomości na Slack w stylu "czy możesz pobrać dla mnie raport?" przestają przychodzić. Każdy użytkownik z dostępem do pulpitu nawigacyjnego może pobrać swój własny PDF bez składania prośby.

Fidelity wykresów. Ponieważ Chromium wykonuje JavaScript wewnątrz IronPDF, wykresy Chart.js, ApexCharts i Highcharts renderują się w PDF dokładnie tak, jak wyglądają na ekranie — w tym kolory, podpowiedzi renderowane jako statyczne etykiety i responsywne rozmiary.

Spójność marki. Każdy wyeksportowany raport ma logo firmy, paletę kolorów i typografię zdefiniowaną w arkuszu stylów pulpitu nawigacyjnego. Nie ma potrzeby ponownego formatowania między eksportem a dystrybucją.

Generowanie planowane. Połącz metodę renderowania z zadaniem w tle, aby automatycznie wysyłać co tydzień lub co miesiąc raporty PDF do interesariuszy. Kadra kierownicza otrzymuje dopracowany raport bez ręcznego generowania go przez kogokolwiek.

Brak zewnętrznych zależności. IronPDF działa w procesie. Nie ma potrzeby utrzymywania procesu Node.js Puppeteer, nie trzeba dołączać binarium wkhtmltopdf dla każdej platformy, ani korzystać z SaaS API eksportu z limitami szybkości lub ceną za dokument.

Optymalizacja układu do druku. CssMediaType.Print stosuje zasady @media print w czasie renderowania, pozwalając zdefiniować czysty, specyficzny dla eksportu układ w CSS bez konieczności utrzymywania oddzielnego szablonu HTML.

Zakończenie

Dodanie przycisku "Eksportuj do PDF" do pulpitu nawigacyjnego administratora wydaje się małą funkcją. W praktyce eliminuje to powtarzające się zadanie ręczne, daje użytkownikom nietechnicznym możliwość, z której korzystali przez lata, i tworzy dokument, który odzwierciedla rzeczywisty wygląd danych, a nie uszkodzoną wersję dialogowego dialogu druku.

IronPDF radzi sobie z złożonością renderowania — wykonywaniem JavaScript, typami mediów CSS, uchwytywaniem wykresów — więc implementacja po twojej stronie to działanie kontrolera i szablon HTML. Jeśli chcesz przetestować to na swoim własnym pulpicie nawigacyjnym, dostępne są 30-dniowe darmowe testy z pełnymi funkcjami i bez znaków wodnych na ironpdf.com.

Curtis Chau
Autor tekstów technicznych

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ę...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie