IRONSOFTWAREHOME
FILMY

Jak przekonwertować CSHTML na PDF przy użyciu Razor Headlessly w C#

Curtis Chau
Curtis Chau
Updated: 18 maja 2026

Fluid to biblioteka .NET (dostępna na NuGet jako Fluid.Core, autorem jest Sebastien Ros, licencjonowana na zasadach MIT), która implementuje język szablonów Liquid, oferując programistom elastyczny sposób renderowania dynamicznych szablonów i oddzielenie treści od logiki prezentacji. Fluid skutecznie generuje dynamiczne wyjścia tekstowe, ale nie obsługuje bezpośrednio generowania PDF — deweloperzy muszą zintegrować dodatkową bibliotekę PDF, aby przekształcić wyjście HTML do dokumentów PDF. Takie podejście oparte na dwóch bibliotekach wprowadza złożoność, którą wiele zespołów programistycznych stara się wyeliminować.

Niniejszy przewodnik zawiera kompletną ścieżkę migracji z Fluid (szablony) z zewnętrznymi bibliotekami PDF do IronPDF, wraz z instrukcjami krok po kroku, porównaniami kodu i praktycznymi przykładami dla profesjonalnych programistów .NET rozważających tę zmianę.

Dlaczego warto przejść z Fluid (Templating) na IronPDF

Fluid to solidny silnik szablonów oparty na Liquid, ale użycie go do generowania plików PDF wiąże się ze znacznym stopniem złożoności:

Zależność od dwóch bibliotek: Fluid generuje wyłącznie kod HTML — do tworzenia plików PDF potrzebna jest osobna biblioteka do obsługi formatu PDF (wkhtmltopdf, PuppeteerSharp itp.), co podwaja liczbę zależności i obciążenie związane z utrzymaniem.

Złożoność integracji: Koordynacja dwóch bibliotek oznacza zarządzanie dwoma zestawami konfiguracji, obsługą błędów i aktualizacjami. Kiedy coś się psuje, debugowanie staje się trudniejsze.

Krzywa uczenia się składni Liquid: Programiści muszą nauczyć się składni szablonów Liquid ({{ }}, {% %}), mimo że C# ma już wbudowane potężne możliwości obsługi ciągów znaków.

Ograniczona kontrola nad plikami PDF: Jakość wyjściowego pliku PDF zależy od biblioteki PDF, którą wybierzesz do połączenia z Fluid, a nie od dedykowanego silnika renderującego.

Wyzwania związane z debugowaniem: Błędy mogą wystąpić zarówno na etapie tworzenia szablonów, jak i generowania plików PDF, co sprawia, że rozwiązywanie problemów jest trudniejsze niż w przypadku pojedynczego, zintegrowanego rozwiązania.

Problemy z bezpieczeństwem wątków: TemplateContext nie jest bezpieczne w wątkach i wymaga ostrożnego zarządzania w aplikacjach równoczesnych.

##IronPDF vs Fluid (szablony): Porównanie funkcji

Zrozumienie różnic architektonicznych pomaga decydentom technicznym w ocenie inwestycji w migrację:

AspektFluid + Biblioteka PDFIronPDF
Zależności2+ pakiety (Fluid + biblioteka PDF)Pojedynczy pakiet
SzablonySkładnia Liquid ({{ }})Interpolacja ciągów znaków w języku C# lub Razor
Generowanie plików PDFWymagana biblioteka zewnętrznaWbudowany silnik Chromium
Obsługa CSSZależy od biblioteki PDFPełna obsługa CSS3 z Flexbox/Grid
JavaScriptZależy od biblioteki PDFPełna obsługa JavaScript
Bezpieczeństwo wątkówTemplateContext nie jest bezpieczny dla wątkówChromePdfRenderer jest bezpieczny dla wątków
Krzywa uczenia sięLiquid + biblioteka API PDFHTML/CSS (standardy internetowe)
Obsługa błędówDwa źródła błędówPojedyncze źródło błędu

Szybki start: Migracja z Fluid do IronPDF

Migrację można rozpocząć natychmiast, wykonując te podstawowe kroki.

Krok 1: Zastąp pakiety NuGet

Usuń Fluid i wszelkie zewnętrzne biblioteki PDF:

# Remove Fluid and external PDF library
dotnet remove package Fluid.Core
dotnet remove package WkHtmlToPdf-DotNet  # or whatever PDF library you used
dotnet remove package PuppeteerSharp       # if used
SHELL

Zainstaluj IronPDF:

# Install IronPDF(all-in-one solution)
dotnet add package IronPdf
SHELL

Krok 2: Aktualizacja przestrzeni nazw

Zamień przestrzenie nazw Fluid na IronPDF:

// Before (Fluid + external PDF library)
using Fluid;
using Fluid.Values;
using SomeExternalPdfLibrary;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions

Krok 3: Inicjalizacja licencji

Dodaj inicjalizację licencji podczas uruchamiania aplikacji:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Przykłady migracji kodu

Podstawowy HTML do PDF

Najbardziej podstawowa operacja ujawnia kluczową różnicę między tymi podejściami.

Płynne podejście:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse("<html><body><h1>Hello {{name}}!</h1></body></html>");
        var context = new TemplateContext();
        context.SetValue("name", "World");
        var html = await template.RenderAsync(context);
        
        // Fluid only generates HTML - you'd need another library to convert to PDF
        File.WriteAllText("output.html", html);
    }
}

Podejście IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World!</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}

Fluid wymaga utworzenia FluidParser, parsowania ciągu szablonu, utworzenia TemplateContext, wywołania SetValue() dla każdej zmiennej, renderowania asynchronicznego w celu uzyskania HTML-a, a następnie zapisania do pliku — co nadal nie jest PDF-em. Komentarz w kodzie wyraźnie stwierdza: "Fluid generuje wyłącznie HTML — do konwersji do formatu PDF potrzebna jest inna biblioteka".

IronPDF eliminuje tę złożoność: stwórz renderer, wywołaj RenderHtmlAsPdf() i zapisz bezpośrednio do PDF. Bez pośrednich plików HTML, bez dodatkowych bibliotek.

W przypadku zaawansowanych scenariuszy konwersji HTML do PDF zapoznaj się z przewodnikiem po konwersji HTML do PDF.

Szablon faktury z danymi dynamicznymi

Szablony dokumentów z wieloma zmiennymi wyraźnie pokazują różnice w wzorcach szablonów.

Płynne podejście:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>Invoice #{{invoiceNumber}}</h1>
                <p>Date: {{date}}</p>
                <p>Customer: {{customer}}</p>
                <p>Total: ${{total}}</p>
            </body></html>");
        
        var context = new TemplateContext();
        context.SetValue("invoiceNumber", "12345");
        context.SetValue("date", DateTime.Now.ToShortDateString());
        context.SetValue("customer", "John Doe");
        context.SetValue("total", 599.99);
        
        var html = await template.RenderAsync(context);
        // Fluid outputs HTML - requires additional PDF library
        File.WriteAllText("invoice.html", html);
    }
}

Podejście IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var invoiceNumber = "12345";
        var date = DateTime.Now.ToShortDateString();
        var customer = "John Doe";
        var total = 599.99;
        
        var html = $@"
            <html><body>
                <h1>Invoice #{invoiceNumber}</h1>
                <p>Date: {date}</p>
                <p>Customer: {customer}</p>
                <p>Total: ${total}</p>
            </body></html>";
        
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("invoice.pdf");
    }
}

Fluid używa składni {{variable}} Liquid z context.SetValue() dla każdej zmiennej. Komentarz wyraźnie stwierdza "Fluid generuje HTML - wymagana dodatkowa biblioteka PDF."IronPDF używa standardowej interpolacji ciągów w C# ($"{variable}") — składni, którą programiści już znają — i generuje bezpośrednio do PDF.

Zapoznaj się z samouczkami IronPDF, aby poznać więcej wzorców generowania dokumentów.

Dane dynamiczne z pętlami

Szablony z kolekcjami i pętlami pokazują różnice w przebiegu programu.

Płynne podejście:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>{{title}}</h1>
                <ul>
                {% for item in items %}
                    <li>{{item}}</li>
                {% endfor %}
                </ul>
            </body></html>");
        
        var context = new TemplateContext();
        context.SetValue("title", "My List");
        context.SetValue("items", new[] { "Item 1", "Item 2", "Item 3" });
        
        var html = await template.RenderAsync(context);
        // Fluid generates HTML only - separate PDF conversion needed
        File.WriteAllText("template-output.html", html);
    }
}

Podejście IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var title = "My List";
        var items = new[] { "Item 1", "Item 2", "Item 3" };
        
        var html = $@"
            <html><body>
                <h1>{title}</h1>
                <ul>";
        
        foreach (var item in items)
        {
            html += $"<li>{item}</li>";
        }
        
        html += "</ul></body></html>";
        
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("template-output.pdf");
    }
}

Fluid używa składni {% for item in items %}...{% endfor %} Liquid — języka szablonów, którego programiści muszą się nauczyć. Komentarz wskazuje "Fluid generuje tylko HTML - potrzebna oddzielna konwersja do PDF."IronPDF używa standardowych pętli C# foreach — bez potrzeby nauki nowej składni — i generuje bezpośrednio do PDF.

Przewodnik po mapowaniu Fluid API do IronPDF

To mapowanie przyspiesza migrację, pokazując bezpośrednie odpowiedniki API:

Mapowanie klas podstawowych

Klasa FluidOdpowiednik IronPDF
FluidParserNie dotyczy
FluidTemplateNie dotyczy
TemplateContextObiekty/ciągi znaków w języku C#
TemplateOptionsRenderingOptions
FluidValueNatywne typy C#
Zewnętrzna klasa PDFChromePdfRenderer

Mapowanie metod

Metoda płynnaOdpowiednik IronPDF
new FluidParser()new ChromePdfRenderer()
parser.Parse(source)Nie dotyczy
template.RenderAsync(context)renderer.RenderHtmlAsPdf(html)
context.SetValue("key", value)var key = value;

Mapowanie składni Liquid do C#

Liquid SyntaxOdpowiednik w języku C#
{{variable}}$"{variable}"
{% for item in items %}foreach (var item in items)
{% if condition %}if (condition)
{{x |upcase}}x.ToUpper()
{{x |date: '%Y-%m-%d'}}x.ToString("yyyy-MM-dd")
{{x | number_with_precision: 2}}x.ToString("F2")

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Konwersja składni Liquid

Fluid: Używa składni {{variable}} i {% control %}.

Rozwiązanie: Zastąp interpolacją ciągów znaków w języku C# i kontrolą przepływu:

// Liquid: {{name | upcase}}
// C#: $"{name.ToUpper()}"

// Liquid: {% for item in items %}{{item}}{% endfor %}
// C#: foreach (var item in items) { html += $"{item}"; }
C#

Problem 2: Zmienne TemplateContext

Fluid: Używa context.SetValue("key", value) do przesyłania danych.

Rozwiązanie: Użyj standardowych zmiennych języka C#:

// Before (Fluid)
var context = new TemplateContext();
context.SetValue("customer", customerName);

// After (IronPDF)
var customer = customerName;
var html = $"<p>Customer: {customer}</p>";

Problem 3: Bezpieczeństwo wątków

Fluid: TemplateContext nie jest bezpieczne w wątkach i wymaga ostrożnego zarządzania w aplikacjach równoczesnych.

Rozwiązanie: ChromePdfRenderer jest bezpieczne w wątkach i może być współdzielone między wątkami:

// Thread-safe usage
private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] GeneratePdf(string html)
{
    var pdf = _renderer.RenderHtmlAsPdf(html);
    return pdf.BinaryData;
}

Problem 4: Dwustopniowa obsługa błędów

Płynność: Błędy mogą wystąpić na etapie tworzenia szablonów LUB generowania plików PDF.

**Rozwiązanie:**IronPDF ma jedno źródło błędu:

try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    // Single point of failure—easier debugging
    Console.WriteLine($"PDF generation failed: {ex.Message}");
}

Lista kontrolna płynnej migracji

Zadania przed migracją

Przeprowadź audyt kodu źródłowego, aby zidentyfikować wszystkie przypadki użycia Fluid:

# Find all Fluid references
grep -r "FluidParser\|FluidTemplate\|TemplateContext\|using Fluid" --include="*.cs" --include="*.csproj" .

# Find Liquid template files
find . -name "*.liquid" -o -name "*.html" | xargs grep -l "{{"
SHELL

Należy udokumentować wszystkie szablony: lokalizacje plików, użyte zmienne, pętle i warunki oraz konfigurację zewnętrznej biblioteki PDF.

Zadania związane z aktualizacją kodu

  1. Usuń pakiet Fluid.Core NuGet
  2. Usuń zewnętrzny pakiet biblioteki PDF
  3. Zainstaluj pakiet NuGet IronPDF
  4. Zaktualizuj importy przestrzeni nazw z Fluid do IronPdf
  5. Konwertuj {{variable}} do $"{variable}"
  6. Konwertuj {% for item in collection %} do C# foreach
  7. Konwertuj {% if condition %} do C# if deklaracji
  8. Przekształć filtry Liquid na metody C# (np. | upcase.ToUpper())
  9. Zamień FluidParser na ChromePdfRenderer
  10. Zamień TemplateContext.SetValue() na bezpośrednie zmienne C#
  11. Usuń wywołania zewnętrznych bibliotek PDF
  12. Dodaj inicjalizację licencji IronPDF podczas uruchamiania

Testy po migracji

Po migracji należy zweryfikować następujące aspekty:

  • Sprawdź, czy wynik w formacie PDF jest zgodny z oczekiwaniami
  • Sprawdź, czy wszystkie warianty szablonów wyświetlają się poprawnie
  • Sprawdź, czy obrazy i stylizacja wyświetlają się poprawnie
  • Sprawdź, czy podziały stron występują poprawnie
  • Testowanie z różnymi rozmiarami danych
  • Testy wydajnościowe vs Fluid + biblioteka zewnętrzna
  • Sprawdź bezpieczeństwo wątków w scenariuszach współbieżności

Zadania porządkowe

  • Usuń pliki szablonów .liquid (jeśli są już niepotrzebne)
  • Usuń kod pomocniczy związany z Fluid
  • Aktualizacja dokumentacji
  • Usuń nieużywane zależności

Kluczowe korzyści z migracji do IronPDF

Przejście z Fluid (szablonowanie) z zewnętrznymi bibliotekami PDF na IronPDF zapewnia kilka kluczowych korzyści:

Rozwiązanie w jednym pakiecie: Wyeliminuj zależność od dwóch bibliotek.IronPDF obsługuje zarówno tworzenie szablonów (za pomocą HTML/CSS), jak i generowanie plików PDF w jednym pakiecie.

Nie trzeba uczyć się nowej składni: zamiast uczyć się składni szablonów Liquid, używaj standardowej interpolacji ciągów znaków i sterowania przepływem w języku C#.

Renderowanie wątkowo-bezpieczne: ChromePdfRenderer jest bezpieczne w wątkach, w przeciwieństwie do TemplateContext, co upraszcza jednoczesne generowanie PDF.

Silnik renderowania Chromium: renderowanie oparte na Chromium obsługuje nowoczesny CSS (w tym Flexbox i Grid) oraz wykonywanie JavaScript.

Jedno źródło błędów: Debugowanie staje się prostsze, ponieważ wystarczy zająć się tylko jedną biblioteką, zamiast koordynować działania na etapie tworzenia szablonów i generowania plików PDF.

**Szerokie pokrycie .NET:**IronPDF obsługuje .NET Framework 4.6.2+, .NET Core 2.0+, .NET Standard 2.0 oraz .NET 5 do .NET 10.

Zwróć uwagę: Fluid, PuppeteerSharp i wkhtmltopdf są znakami towarowymi odpowiednich właścicieli. Ta strona nie jest powiązana, wspierana ani sponsorowana przez żadne z tych projektów lub ich opiekunów. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta