IRONSOFTWAREHOME
FILMY

Jak rasteryzować plik PDF do obrazu w języku C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Przejście z jsreport na IronPDF przekształca przepływ pracy z plikami PDF w środowisku .NET z systemu zależnego od Node.js, z zewnętrznym zarządzaniem plikami binarnymi i oddzielnymi procesami serwerowymi, w czystą bibliotekę .NET, która działa całkowicie w ramach procesu. Niniejszy przewodnik zawiera kompleksową, szczegółową ścieżkę migracji, która eliminuje złożoność infrastruktury i wymagania dotyczące szablonów JavaScript dla profesjonalnych programistów .NET.

Dlaczego warto przejść z jsreport na IronPDF

Wyzwania związane z jsreport

jsreport wprowadza złożoność, która nie pasuje do czystego środowiska .NET:

  1. Zależność od Node.js: Wymaga środowiska uruchomieniowego Node.js i plików binarnych, co zwiększa złożoność infrastruktury w przypadku aplikacji, która powinna być prostą aplikacją .NET.

  2. Zarzadzanie zewnetrznymi plikami binarnymi: Konieczne jest pobranie i zarzadzanie binariami specyficznymi dla platformy Windows, Linux i OSX poprzez oddzielne pakiety NuGet (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. Oddzielny proces serwera: Dziala jako narzedzie lub serwer WWW—wymagane jest dodatkowe zarzadzanie procesami przy uzyciu StartAsync() i KillAsync() metod zycia.

  4. Szablony JavaScript: Wymusza naukę Handlebars, JsRender lub innych systemów szablonów JavaScript zamiast korzystania z natywnych możliwości C#.

  5. Zlozona struktura zadan: Wymaga rozbudowanych obiektow RenderRequest z zagniezdzonymi konfiguracjami Template nawet dla prostego generowania PDF.

  6. Ograniczenia licencyjne: Darmowa wersja jest ograniczona do 5 szablonów na instancję; komercyjne użycie ponad to wymaga licencji Enterprise ($395/rok na instancję) lub Enterprise Scale ($1,295/rok, bez opłat licencyjnych pomiędzy instancjami). See jsreport.net/buy.

  7. Wyjście oparte na strumieniach: Zwraca strumienie wymagające ręcznych operacji na plikach i zarządzania strumieniami pamięci.

Porównanie jsreport i IronPDF

FunkcjajsreportIronPDF
Środowisko uruchomienioweNode.js + .NETCzysty .NET
Zarządzanie plikami binarnymiPodręcznik (pakiety jsreport.Binary)Automatyczne
Proces serwerowyWymagane (narzędzie lub serwer internetowy)W trakcie realizacji
SzablonyJavaScript (Handlebars itp.)C# (Razor, interpolacja ciągów znaków)
Styl APIRozbudowane obiekty żądaniaPrzejrzyste i płynne metody
WynikStrumieńObiekt PdfDocument
Manipulacja plikami PDFOgraniczoneRozbudowane (łączenie, dzielenie, edycja)
Obsługa asynchronicznaTylko asynchroniczneZarówno synchroniczne, jak i asynchroniczne

Dla zespołów planujących przyjęcie .NET 10 i C# 14,IronPDF dostarcza natywne .NET bez zewnętrznych zależności czasu wykonywania.


Ocena złożoności migracji

Szacowany nakład pracy według funkcji

FunkcjaZłożoność migracji
HTML do PDFBardzo niski
URL do pliku PDFBardzo niski
Nagłówki/stopkiNiski
Ustawienia stronyNiski
Cykl życia serweraNiski
Zarządzanie plikami binarnymiNiski

Zmiana paradygmatu

Podstawową zmianą w tej migracji jsreport jest przejście od rozbudowanych obiektów żądań z zarządzaniem serwerem do prostych wywołań metod w ramach procesu:

jsreport:  LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) →Strumień→ File
IronPDF:   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Text

Zanim zaczniesz

Wymagania wstępne

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com

Zmiany w pakiecie NuGet

# Remove jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client

# Install IronPDF
dotnet add package IronPdf
SHELL

Konfiguracja licencji

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Zidentyfikuj zastosowanie jsreport

# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
SHELL

Kompletna dokumentacija API

Mapowania klas

Klasa jsreportOdpowiednik IronPDF
LocalReportingChromePdfRenderer
ReportingServiceChromePdfRenderer
RenderRequestParametry metody
TemplateParametry metody
ChromeRenderingOptions
ReportPdfDocument
Engine(niepotrzebne)

Mapowanie metod

Metoda jsreportOdpowiednik IronPDF
LocalReporting().UseBinary().AsUtility().Create()new ChromePdfRenderer()
rs.RenderAsync(request)renderer.RenderHtmlAsPdf(html)
rs.StartAsync()(niepotrzebne)
rs.KillAsync()(niepotrzebne)
report.Content.CopyTo(stream)pdf.SaveAs(path) lub pdf.BinaryData

Mapowania właściwości RenderRequest

Właściwość szablonu jsreportOdpowiednik IronPDF
Template.ContentPierwszy parametr dla RenderHtmlAsPdf()
Template.Recipe = Recipe.ChromePdf(niepotrzebne)
Template.Engine = Engine.None(niepotrzebne)
Chrome.HeaderTemplateRenderingOptions.TextHeader lub HtmlHeader
Chrome.FooterTemplateRenderingOptions.TextFooter lub HtmlFooter
Chrome.DisplayHeaderFooter(automatyczne)
Chrome.MarginTopRenderingOptions.MarginTop

Mapowanie symboli zastępczych (nagłówki/stopki)

jsreport PlaceholderIronPDF Placeholder
<span class='pageNumber'></span>{page}
<span class='totalPages'></span>{total-pages}
{#pageNum}{page}
{#numPages}{total-pages}
{#timestamp}{date}

Przykłady migracji kodu

Przykład 1: Podstawowy HTML do PDF

Przed (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
            }
        });

        using (var fileStream = File.Create("output.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF created successfully!");
    }
}

Po (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}

Podejście jsreport wymaga trzech pakietów NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), trzech importow przestrzeni nazw, tylko asynchronicznego wykonania, lancucha fluent buildera (LocalReporting().UseBinary().AsUtility().Create()), rozbudowanego RenderRequest z zagniezdzonym Template obiektem wyznaczajacym Recipe i Engine, oraz recznego kopiowania strumienia do pliku za pomoca bloku using.

IronPDF sprowadza to do jednego pakietu NuGet, jednej przestrzeni nazw, trzech wierszy kodu i synchronicznego wykonywania. Metoda ChromePdfRenderer.RenderHtmlAsPdf() akceptuje HTML bezposrednio i zwraca PdfDocument z prosta metoda SaveAs(). Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: URL do PDF

Przed (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
            }
        });

        using (var fileStream = File.Create("webpage.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("Webpage PDF created successfully!");
    }
}

Po (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("Webpage PDF created successfully!");
    }
}

jsreport moze renderowac URL poprzez ustawienie Chrome.Url na zadanie, ale nie ma wygodnej metody najwyzszego poziomu — i powszechnym wzorcem w istniejacym kodzie jest obejscie w postaci przekierowania JavaScript (window.location='https://example.com') pokazane powyzej, ktore moze zawodzic na stronach blokujacych skryptowane nawiagacje.

IronPDF zapewnia dedykowana metode RenderUrlAsPdf(), ktora przyjmuje URL jako bezposredni argument, z pelnym wykonaniem JavaScript i wsparciem dla nowoczesnego CSS. Dowiedz się więcej o konwersji adresów URL do formatu PDF.

Przykład 3: Plik PDF z nagłówkami i stopkami

Przed (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
                Chrome = new Chrome()
                {
                    DisplayHeaderFooter = true,
                    HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
                    FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
                }
            }
        });

        using (var fileStream = File.Create("document_with_headers.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

Po (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Custom Header",
            FontSize = 10
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}",
            FontSize = 10
        };
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>");
        pdf.SaveAs("document_with_headers.pdf");
        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

Podejście jsreport wymaga dodania obiektu Chrome do Template, ustawienia DisplayHeaderFooter = true i uzywania szablonow HTML ze specjalnymi miejscami na klasy CSS (<span class='pageNumber'></span>, <span class='totalPages'></span>). Szablony nagłówków i stopek muszą zawierać pełne style wbudowane.

IronPDF zapewnia czystsza konfiguracje TextHeaderFooter z dedykowanymi wlasciwosciami dla CenterText, LeftText, RightText i FontSize. Miejsca na liczenie stron uzywaja prostszej skladni {page} i {total-pages}. Opcje nagłówków HTML można znaleźć w dokumentacji dotyczącej nagłówków i stopek.


Ważne uwagi dotyczące migracji

Wyeliminuj zarządzanie cyklem życia serwerów

jsreport wymaga wyraźnego zarządzania cyklem życia serwera:

// jsreport (DELETE THIS):
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsUtility()
    .Create();

// Or for web server mode:
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsWebServer()
    .Create();

await rs.StartAsync();
// ... use rs ...
await rs.KillAsync();

IronPDF działa całkowicie w ramach procesu — bez uruchamiania serwera, bez zarządzania procesami, bez czyszczenia:

// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed

Usuń pakiety binarne specyficzne dla platformy

jsreport wymaga oddzielnych pakietów NuGet dla każdej platformy docelowej:

# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
SHELL

IronPDF automatycznie obsługuje wszystkie wymagania platformowe za pośrednictwem jednego pakietu NuGet.

Zaktualizuj składnię symboli zastępczych

jsreport wykorzystuje symbole zastępcze oparte na klasach CSS lub nawiasach klamrowych.IronPDF używa innej składni:

// jsreport placeholders:
"<span class='pageNumber'></span>"  // or {#pageNum}
"<span class='totalPages'></span>"  // or {#numPages}

//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"

Zamień Handlebars na interpolację ciągów C#

jsreport czesto uzywa szablonow Handlebars z Engine.Handlebars:

// jsreport Handlebars (DELETE THIS):
Template = new Template
{
    Content = "<h1>Hello, {{name}}</h1>",
    Engine = Engine.Handlebars
},
Data = new { name = "World" }

//IronPDF with C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
C#

Uprość obsługę strumieni

jsreport zwraca strumień, który wymaga ręcznego skopiowania:

// jsreport stream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
    report.Content.CopyTo(fileStream);
}

// Or for byte array:
using (var memoryStream = new MemoryStream())
{
    await report.Content.CopyToAsync(memoryStream);
    return memoryStream.ToArray();
}

//IronPDF direct access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;

Rozwiązywanie problemów

Problem 1: Nie znaleziono LocalReporting

Problem: Odniesienia do klasy LocalReporting, ktora nie istnieje w IronPDF.

Rozwiazanie: Zastapic ChromePdfRenderer:

// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();

// IronPDF
var renderer = new ChromePdfRenderer();

Problem 2: Nie znaleziono RenderRequest

Problem: Kod uzywa obiektow opakowujacych RenderRequest i Template.

Rozwiązanie: Przekazuj kod HTML bezpośrednio do metod renderowania:

// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);

Problem 3: Brak wyświetlania numerów stron

Problem: Uzywanie skladni miejsc docelowych jsreport <span class='pageNumber'></span>.

Rozwiązanie: Zaktualizuj do składni symboli zastępczych IronPDF:

// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

//IronPDF syntax
"Page {page} of {total-pages}"

Problem 4: Nie znaleziono pliku JsReportBinary

Problem: Kod odnosi sie do JsReportBinary.GetBinary().

Rozwiązanie: Usunąć w całości —IronPDF nie wymaga zewnętrznych plików binarnych:

// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())

//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj wszystkie polecenia jsreport using
  • Szablony listy przy użyciu Handlebars/JsRender (przekonwertuj na interpolację ciągów znaków w C#)
  • Odzwierciedl aktualne ustawienia przeglądarki Chrome (marginesy, rozmiar papieru)
  • Sprawdź tryb serwera WWW w porównaniu z trybem narzędziowym (oba stają się trybem wbudowanym)
  • Uwaga: pakiety binarne specyficzne dla platformy (usunąć wszystkie)
  • Uzyskaj klucz licencyjny IronPDF

Zmiany w pakiecie

  • Usun pakiet jsreport.Binary
  • Usun pakiet jsreport.Binary.Linux
  • Usun pakiet jsreport.Binary.OSX
  • Usun pakiet jsreport.Local
  • Usun pakiet jsreport.Types
  • Usun pakiet jsreport.Client
  • Zainstaluj pakiet IronPdf

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zastap LocalReporting z ChromePdfRenderer
  • Usun opakowanie RenderRequest
  • Usun opakowanie Template
  • Aktualizuj składnie miejsc docelowych (<span class='pageNumber'>{page})
  • Zastąp Handlebars interpolacją ciągów znaków w języku C#
  • Usun wywolania StartAsync() / KillAsync()
  • Zastap kopiowanie strumienia z BinaryData lub SaveAs()

Testowanie

  • Przetestuj wszystkie ścieżki generowania plików PDF
  • Sprawdź renderowanie nagłówków/stopek
  • Sprawdź numerację stron
  • Sprawdź odstępy marginesów
  • Testowanie na złożonych stronach CSS/JavaScript
  • Porównanie wydajności

Po migracji

  • Usuń pliki binarne jsreport
  • Usuń zależności Node.js, jeśli nie są już potrzebne
  • Aktualizacja skryptów wdrażania
  • Aktualizacja dokumentacji

Zwróć uwagę: jsreport jest zarejestrowanym znakiem towarowym swojego właściciela. Ta witryna nie jest powiązana, zatwierdzona ani sponsorowana przez jsreport. 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