IRONSOFTWAREHOME
FILMY

Jak przekonwertować plik RTF na PDF przy użyciu języka C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Dlaczego warto przejść zNReco PDF Generatorna IronPDF

Krytyczne problemy związane z bezpieczeństwem w programie NReco PDF Generator

NReco PDF Generator opakowuje binary wkhtmltopdf, dziedzicząc jego znane luki bezpieczeństwa. Ostatnia stabilna wersja projektu wkhtmltopdf to 0.12.6 (czerwiec 2020), a repozytorium upstream zostało zarchiwizowane 2 stycznia 2023, więc nie pojawią się żadne patche:

  • CVE-2020-21365: Traversal katalogu / odczyt lokalnego pliku przez spreparowany HTML (słabość polityki tego samego pochodzenia)
  • CVE-2022-35583: Podstawiona serwerowa prośba (SSRF) za pomocą wstrzykniętego <iframe> w wersji 0.12.6 (CVSS 9.8)

Dodatkowe ograniczenia generatora PDF NReco

  1. Frykcyjne licencjonowanie na dużą skalę: Darmowe dla wdrożeń produkcyjnych jednoserwerowych poza SaaS; SaaS, multi-serwer lub scenariusze redystrybucyjne wymagają pakietu Enterprise z kodem źródłowym za 199 USD od nrecosite.com.

  2. Zdeprecjonowany silnik renderujący: WebKit Qt (około 2012) z ograniczoną obsługą CSS3/JS:

    • Bez CSS Grid ani Flexbox
    • Brak obsługi nowoczesnegoJavaScript(ES6+)
    • Słaba obsługa czcionek internetowych
    • Brak zmiennych CSS ani właściwości niestandardowych
  3. Zewnętrzna zależność binarna: Wymaga zarządzania plikami binarnymi wkhtmltopdf dla każdej platformy (wkhtmltopdf.exe, wkhtmltox.dll).

  4. Wstrzymane utrzymanie: NReco.PdfGenerator 1.2.1 został opublikowany 8 stycznia 2023 i nie było dalszych wydań na nuget.org; podstawowy silnik wkhtmltopdf nie jest już aktualizowany.

  5. Ograniczona obsługa asynchroniczności: Synchroniczne API blokuje wątki w aplikacjach internetowych.

PorównanieNReco PDF Generatori IronPDF

AspektNReco PDF GeneratorIronPDF
Silnik renderującyWebKit Qt (2012)Chromium (aktualne)
BezpieczeństwoWiele niezałatanych CVE (np. CVE-2020-21365, CVE-2022-35583); silnik zarchiwizowany 2 stycznia 2023Aktywne aktualizacje zabezpieczeń
Obsługa CSSCSS2.1, ograniczone CSS3Pełna obsługa CSS3, Grid, Flexbox
JavaScriptPodstawowy ES5Pełna obsługa ES6+, async/await
ZależnościZewnętrzny plik binarny wkhtmltopdfSamodzielny
Obsługa asynchronicznaTylko synchronicznePełna obsługa async/await
Czcionki internetoweOgraniczonePełna obsługa czcionek Google Fonts, @font-face
LicencjonowanieDarmowy dla jednoserwerowego non-SaaS; 199 USD za pakiet Enterprise dla SaaS / multi-serwerPrzejrzyste komercyjne wyceny
Poziom bezpłatnyDarmowy pod licencją non-SaaS jednoserwerowaPróbne bez znaku wodnego

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 NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator

# Install IronPDF
dotnet add package IronPdf
SHELL

Należy również usunąć pliki binarne wkhtmltopdf z wdrożenia:

  • Usuń wkhtmltopdf.exe, wkhtmltox.dll z projektu
  • Usuń wszelkie skrypty instalacyjne wkhtmltopdf
  • Usuń foldery plików binarnych specyficzne dla platformy

Konfiguracja licencji

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

Zidentyfikuj zastosowanie generatora PDF NReco

# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
SHELL

Kompletna dokumentacija API

Mapowania klas podstawowych

NReco PDF GeneratorIronPDF
HtmlToPdfConverterChromePdfRenderer
PageMarginsWłaściwości poszczególnych marginesów
PageOrientationPdfPaperOrientation
PageSizePdfPaperSize

Mapowanie metod renderowania

NReco PDF GeneratorIronPDF
GeneratePdf(html)RenderHtmlAsPdf(html)
GeneratePdfFromFile(url, output)RenderUrlAsPdf(url)
GeneratePdfFromFile(htmlPath, output)RenderHtmlFileAsPdf(path)
(async nie jest obsługiwane)RenderHtmlAsPdfAsync(html)
(async nie jest obsługiwane)RenderUrlAsPdfAsync(url)

Mapowania konfiguracji stron

NReco PDF GeneratorIronPDF
PageWidth = 210RenderingOptions.PaperSize = PdfPaperSize.A4
PageHeight = 297RenderingOptions.SetCustomPaperSizeinMilimeters(w, h)
Orientation = PageOrientation.LandscapeRenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Size = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4

Mapowanie marginesów

NReco PDF GeneratorIronPDF
Margins.Top = 10RenderingOptions.MarginTop = 10
Margins.Bottom = 10RenderingOptions.MarginBottom = 10
Margins.Left = 10RenderingOptions.MarginLeft = 10
Margins.Right = 10RenderingOptions.MarginRight = 10
new PageMargins { ... }Poszczególne właściwości

Mapowanie symboli zastępczych nagłówków/stopek

NReco PDF Generator(wkhtmltopdf)IronPDF
[page]{page}
[topage]{total-pages}
[date]{date}
[time]{time}
[title]{html-title}

Mapowania obsługi danych wyjściowych

NReco PDF GeneratorIronPDF
byte[] pdfBytes = GeneratePdf(html)PdfDocument pdf = RenderHtmlAsPdf(html)
File.WriteAllBytes(path, bytes)pdf.SaveAs(path)
return pdfBytesreturn pdf.BinaryData
new MemoryStream(pdfBytes)new MemoryStream(pdf.BinaryData)

Przykłady migracji kodu

Przykład 1: Podstawowy HTML do PDF

Przed (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}

Po (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}

Podstawowa różnica polega na typie zwracanej wartości i schemacie zapisywania. HtmlToPdfConverter.GeneratePdf()NReco PDF Generatorzwraca byte[], który należy ręcznie zapisać na dysku za pomocą File.WriteAllBytes(). ChromePdfRenderer.RenderHtmlAsPdf()IronPDF zwraca obiekt PdfDocument z wbudowaną metodą SaveAs().

To podejście obiektowe zapewnia dodatkowe korzyści: przed zapisaniem można modyfikować plik PDF (dodawać znaki wodne, łączyć dokumenty, dodawać zabezpieczenia). Jeśli potrzebujesz surowych bajtów do zgodności z istniejącym kodem, użyj pdf.BinaryData. Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: Niestandardowy rozmiar strony z marginesami

Przed (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        htmlToPdf.PageWidth = 210;
        htmlToPdf.PageHeight = 297;
        htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
        File.WriteAllBytes("custom-size.pdf", pdfBytes);
    }
}

Po (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("custom-size.pdf");
    }
}

NReco PDF Generator używa numerycznych wymiarów (PageWidth = 210, PageHeight = 297) oraz obiektu PageMargins.IronPDF używa wyliczenia PdfPaperSize (które obejmuje standardowe rozmiary, takie jak A4, Letter, Legal) oraz indywidualnych właściwości marginesu na obiekcie RenderingOptions.

Najważniejsze zmiany związane z migracją:

  • PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • new PageMargins { Top = 10, ... }→ Individual properties: RenderingOptions.MarginTop = 10

Dla niestandardowych rozmiarów papieru, które nie są obsługiwane przez wyliczenie, użyj RenderingOptions.SetCustomPaperSizeinMilimeters(width, height). Dowiedz się więcej o opcjach konfiguracji strony.

Przykład 3: Konwersja adresów URL do formatu PDF

Przed (NReco PDF Generator):

// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;

class Program
{
    static void Main()
    {
        var htmlToPdf = new HtmlToPdfConverter();
        var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

NReco PDF Generator używa myląco nazwanego GeneratePdfFromFile() do obsługi zarówno lokalnych plików, jak i URL-i, z opcjonalnym drugim parametrem.IronPDF oferuje dedykowane metody: RenderUrlAsPdf() dla URL-i i RenderHtmlFileAsPdf() dla lokalnych plików HTML.

Podejście IronPDF jest czystsze i bardziej intuicyjne. Dla asynchronicznych aplikacji webowych użyj await renderer.RenderUrlAsPdfAsync(url), aby uniknąć blokowania wątków - coś, czegoNReco PDF Generatornie potrafi.


Ważne uwagi dotyczące migracji

Konwersja wartości powiększenia

NReco PDF Generator używa wartości zmiennoprzecinkowych (0,0–2,0), podczas gdy IronPDF używa liczb całkowitych wyrażonych w procentach:

// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90

// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);

Aktualizacja składni symboli zastępczych

Należy zaktualizować wszystkie symbole zastępcze w nagłówkach i stopkach:

NReco PDF GeneratorIronPDF
[page]{page}
[topage]{total-pages}
[date]{date}
[title]{html-title}
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};

Zmiana typu zwracanej wartości

NReco PDF Generator zwraca bezpośrednio byte[];IronPDF zwraca PdfDocument:

//NReco PDF Generatorpattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
C#

Bezpieczeństwo wątków i możliwość ponownego wykorzystania

NReco PDF Generator zazwyczaj tworzy nowy konwerter przy każdym wywołaniu. ChromePdfRendererIronPDF jest bezpieczny dla wątków i można go ponownie użyć:

//NReco PDF Generatorpattern (creates new each time):
public byte[] Generate(string html)
{
    var converter = new HtmlToPdfConverter();
    return converter.GeneratePdf(html);
}

//IronPDF pattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] Generate(string html)
{
    return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
C#

Obsługa asynchroniczna (nowa funkcja)

IronPDF obsługuje wzorce async/await, których nie zapewnia NReco PDF Generator:

// NReco PDF Generator: No async support available

// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
    var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

Rozwiązywanie problemów

Problem 1: Nie znaleziono HtmlToPdfConverter

Problem: Klasa HtmlToPdfConverter nie istnieje w IronPDF.

Rozwiązanie: Użyj ChromePdfRenderer:

// NReco PDF Generator
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();

Problem 2: GeneratePdf zwraca niewłaściwy typ

Problem: Kod oczekuje byte[], ale otrzymuje PdfDocument.

Rozwiązanie: Uzyskaj dostęp do właściwości .BinaryData:

// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);

// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;

Problem 3: Nie znaleziono obiektu PageMargins

Problem: Klasa PageMargins nie istnieje w IronPDF.

Rozwiązanie: Użyj indywidualnych właściwości marginesów:

// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };

// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;

Problem 4: Brak numerów stron

Problem: Nie działają zastępcze miejsca [page] i [topage].

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

// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";

// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>",
    MaxHeight = 20
};

Lista kontrolna migracji

Przed migracją

  • Inwentaryzuj wszystkie użycia NReco.PdfGenerator w kodzie
  • Dokumentuj wszystkie wartości CustomWkHtmlArgs i CustomWkHtmlPageArgs
  • Wymień wszystkie szablony HTML nagłówków/stopek z symbolami zastępczymi
  • Zidentyfikuj wymagania dotyczące asynchroniczności (kontrolery internetowe, usługi)
  • Sprawdź ustawienia Zoom i marginesów
  • Utwórz kopię zapasową istniejących plików PDF w celu porównania
  • Uzyskaj klucz licencyjny IronPDF

Zmiany w pakiecie

  • Usuń pakiet NuGet NReco.PdfGenerator
  • Zainstaluj pakiet NuGet IronPdf: dotnet add package IronPdf
  • Zaktualizuj importy przestrzeni nazw z using NReco.PdfGenerator; na using IronPdf;

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zamień HtmlToPdfConverter na ChromePdfRenderer
  • Zamień GeneratePdf(html) na RenderHtmlAsPdf(html)
  • Zamień GeneratePdfFromFile(url, null) na RenderUrlAsPdf(url)
  • Przekształć obiekt PageMargins na indywidualne właściwości marginesu
  • Zaktualizuj wartości Zoom z typu float na procent
  • Zaktualizuj składnię zastępczych miejsc: [page]{page}, [topage]{total-pages}
  • Zamień File.WriteAllBytes() na pdf.SaveAs()
  • Zamień wywołania synchroniczne na asynchroniczne tam, gdzie jest to korzystne

Po migracji

  • Usuń pliki binarne wkhtmltopdf z projektu/wdrożenia
  • Zaktualizuj pliki Docker, aby usunąć instalację wkhtmltopdf
  • Przeprowadź testy regresji porównujące wynik w formacie PDF
  • Sprawdź, czy symbole zastępcze nagłówków/stopek wyświetlają się poprawnie
  • Przetestuj na wszystkich platformach docelowych (Windows, Linux, macOS)
  • Zaktualizuj potok CI/CD, aby usunąć etapy wkhtmltopdf
  • Zaktualizuj skanowanie bezpieczeństwa, aby potwierdzić usunięcie CVE

Zwróć uwagę: NReco i wkhtmltopdf sa zarejestrowanymi znakami towarowymi swoich odpowiednich wlascicieli. Ta strona nie jest powiazana, zatwierdzona ani sponsorowana przez NReco ani wkhtmltopdf. 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