KARşıLAşTıRMA

.NET 8 için Belge Üretim Kütüphanesi Seçimi

.NET 8, birçok geleneksel PDF kütüphanesiyle uyumluluğu bozan çalışma zamanı değişiklikleri sundu. System.Drawing.Common, Windows dışı platformlarda kullanımdan kaldırılmaktadır. Native AOT, yansıma ağırlıkta kütüphaneler üzerinde yeni sınırlamalar getirir ve kapsayıcı öncelikli dağıtım modeli, Windows geliştirme makinelerinde ortaya çıkmayan bağımlılık sorunlarını açığa çıkarır. Kütüphaneler, .NET Framework veya hatta .NET 6'da çalışırken .NET 8'de NU1202, DllNotFoundException veya PlatformNotSupportedException hataları ile başarısız olabilir.

Bu makale, hangi PDF kütüphanelerinin .NET 8 ile çalıştığını belgelemekte, uyumsuz kütüphanelerle karşılaşılan specific hataları göstermekte ve Docker ve Azure Functions için dağıtım yapılandırmaları sağlamaktadır.

Hızlı Başlangıç: .NET 8'de HTML'den PDF Oluşturma

using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>");

pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>");

pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

Dim pdf = renderer.RenderHtmlAsPdf("
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>")

pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

NuGet üzerinden yükleyin: Install-Package IronPdf. Ek yapılandırma olmadan net8.0 hedefler. Platforma özgü ayarlama gerektirmeden Windows, Linux, macOS, Docker ve Azure'a dağıtımlar.

.NET 8'de Eski PDF Kütüphaneleri Neden Başarısız Oluyor?

iText— .NET 8 ile Uyumsuz

iText (iText'in orijinal .NET portu) 2018'den beri güncellenmemiştir. Sadece .NET Framework'ü hedefler:

hata NU1202: Paket iTextSharp 5.5.13 net8.0 ile uyumlu değil

Geçiş yolu, farklı bir API'ye sahip olan ve ya AGPL uyumluluğu (tüm uygulamanızı açık kaynağa dönüştürün) ya da ticari lisanslama gerektiren iText'tir. Fiyatlandırma yayınlanmamış — üçüncü taraf verileri $15,000–$210,000/yıl öneriyor.

wkhtmltopdf Çevreleyicileri — .NET 8'de DLL Yükleme Hataları

Wkhtmltopdf etrafında C# çevreleyicileri (DinkToPdf, Rotativa, NReco.PdfGenerator) .NET 8'deki dağıtım modeliyle yalnızca platforma özgü hatalar ile başarısız oluyor:

DinkToPdf — yerel kütüphane bulunamadı:

System.DllNotFoundException: 'libwkhtmltox' DLL'i yüklenemedi

Rotativa.AspNetCore — .NET 8'in kapsayıcı öncelikli dağıtımıyla çelişen manuel ikili yol yapılandırması gerektiriyor:

// This pattern requires deploying wkhtmltopdf binaries alongside your app
// and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf");
// This pattern requires deploying wkhtmltopdf binaries alongside your app
// and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf");
' This pattern requires deploying wkhtmltopdf binaries alongside your app
' and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf")
$vbLabelText   $csharpLabel

TuesPechkin / NReco — mimari uyumsuzluk:

System.BadImageFormatException: Dosya veya derlemeyi yükleyemedi

Bu hatalar daha derin bir sorunu yansıtıyor: wkhtmltopdf, Temmuz 2024'te arşivlendi yamalanmamış CVE'lerle. Yerel binary mimarisi .NET 8'in platform algılama iyileştirmelerinin öncesinde geldi. Hiçbir düzeltme yok — sadece farklı bir kütüphaneye geçiş var.

PDFSharp— Linux'ta System.Drawing.Common Başarısızlıkları

PDFSharp, Microsoft'un .NET 6'da Windows dışı platformlar için kullanımdan kaldırdığı System.Drawing.Common'a bağlıdır. .NET 8'de, Linux veya Docker'a dağıtıldığında çalışma zamanı hatalarına neden olur:

using PdfSharp.Pdf;
using PdfSharp.Drawing;

var document = new PdfDocument();
// PlatformNotSupportedException on Linux:
// System.Drawing.Common is not supported on this platform
using PdfSharp.Pdf;
using PdfSharp.Drawing;

var document = new PdfDocument();
// PlatformNotSupportedException on Linux:
// System.Drawing.Common is not supported on this platform
Imports PdfSharp.Pdf
Imports PdfSharp.Drawing

Dim document As New PdfDocument()
' PlatformNotSupportedException on Linux:
' System.Drawing.Common is not supported on this platform
$vbLabelText   $csharpLabel

PDFSharp 6.x, bu bağımlılığı kaldırmak için çalışmıştır, ancak 2026 başı itibariyle platformlar arası destek hala tamamlanmamıştır. Sadece Windows dağıtımları için PDFSharp, .NET 8 ile çalışır. Linux, Docker veya bulut dağıtımları için güvenilir değildir.

.NET 8 ile Hangi PDF Kütüphaneleri Çalışır?

IronPDF— Tam .NET 8 Desteği, Çapraz Platform

IronPDF, gömülü Chromium render ile yerel olarak net8.0 hedefler. System.Drawing.Common bağımlılığı yok, yerel binary yönetimi yok, platforma özel yapılandırma yok.

Minimal API entegrasyonu (ana .NET 8 modeli):

using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/invoice/{id}/pdf", async (int id, InvoiceService service) =>
{
    var invoice = await service.GetInvoiceAsync(id);
    var renderer = new ChromePdfRenderer();

    var pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml());

    return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf");
});

app.Run();
using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/invoice/{id}/pdf", async (int id, InvoiceService service) =>
{
    var invoice = await service.GetInvoiceAsync(id);
    var renderer = new ChromePdfRenderer();

    var pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml());

    return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf");
});

app.Run();
Imports IronPdf

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapGet("/invoice/{id}/pdf", Async Function(id As Integer, service As InvoiceService) 
    Dim invoice = Await service.GetInvoiceAsync(id)
    Dim renderer = New ChromePdfRenderer()

    Dim pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml())

    Return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf")
End Function)

app.Run()
$vbLabelText   $csharpLabel

Controller pattern kullanan ekipler için, aynı kod bir controller işleminde çalışır — RenderHtmlAsPdf, .BinaryData ile baytlara dönüştürebileceğiniz bir PdfDocument döndürür.

Lisanslama: Süresiz lisans, $2,998'dan başlar (Lite — 1 geliştirici, 1 proje). Professional: $1,499 (10 geliştirici). Enterprise: $2,999 (sınırsız). ironpdf.com adresinde yayınlanmıştır.

QuestPDF— .NET 8 Uyumlu, HTML Yok

QuestPDF, platform bağımlılıkları olmadan .NET 8 ile çalışır. Akıcı C# API'si belgeleri programatik olarak oluşturur — HTML ayrıştırıcı, CSS motoru, tarayıcı motoru yok:

using QuestPDF.Fluent;
using QuestPDF.Infrastructure;

QuestPDF.Settings.License = LicenseType.Community; // Free under $1M revenue

Document.Create(container =>
{
    container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);
        page.Content().Column(col =>
        {
            col.Item().Text("Q4 Report").FontSize(24).Bold();
            col.Item().Table(table =>
            {
                table.ColumnsDefinition(c => { c.RelativeColumn(2); c.RelativeColumn(1); c.RelativeColumn(1); });
                table.Header(h =>
                {
                    h.Cell().Text("Metric").Bold();
                    h.Cell().Text("Value").Bold();
                    h.Cell().Text("Change").Bold();
                });
                table.Cell().Text("Revenue"); table.Cell().Text("$1.2M"); table.Cell().Text("+12%");
                table.Cell().Text("Users"); table.Cell().Text("45,230"); table.Cell().Text("+23%");
            });
        });
    });
}).GeneratePdf("report.pdf");
using QuestPDF.Fluent;
using QuestPDF.Infrastructure;

QuestPDF.Settings.License = LicenseType.Community; // Free under $1M revenue

Document.Create(container =>
{
    container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);
        page.Content().Column(col =>
        {
            col.Item().Text("Q4 Report").FontSize(24).Bold();
            col.Item().Table(table =>
            {
                table.ColumnsDefinition(c => { c.RelativeColumn(2); c.RelativeColumn(1); c.RelativeColumn(1); });
                table.Header(h =>
                {
                    h.Cell().Text("Metric").Bold();
                    h.Cell().Text("Value").Bold();
                    h.Cell().Text("Change").Bold();
                });
                table.Cell().Text("Revenue"); table.Cell().Text("$1.2M"); table.Cell().Text("+12%");
                table.Cell().Text("Users"); table.Cell().Text("45,230"); table.Cell().Text("+23%");
            });
        });
    });
}).GeneratePdf("report.pdf");
Imports QuestPDF.Fluent
Imports QuestPDF.Infrastructure

QuestPDF.Settings.License = LicenseType.Community ' Free under $1M revenue

Document.Create(Sub(container)
    container.Page(Sub(page)
        page.Size(PageSizes.A4)
        page.Margin(2, Unit.Centimetre)
        page.Content().Column(Sub(col)
            col.Item().Text("Q4 Report").FontSize(24).Bold()
            col.Item().Table(Sub(table)
                table.ColumnsDefinition(Sub(c)
                    c.RelativeColumn(2)
                    c.RelativeColumn(1)
                    c.RelativeColumn(1)
                End Sub)
                table.Header(Sub(h)
                    h.Cell().Text("Metric").Bold()
                    h.Cell().Text("Value").Bold()
                    h.Cell().Text("Change").Bold()
                End Sub)
                table.Cell().Text("Revenue")
                table.Cell().Text("$1.2M")
                table.Cell().Text("+12%")
                table.Cell().Text("Users")
                table.Cell().Text("45,230")
                table.Cell().Text("+23%")
            End Sub)
        End Sub)
    End Sub)
End Sub).GeneratePdf("report.pdf")
$vbLabelText   $csharpLabel

QuestPDF HTML dönüştürmez. İş akışınız HTML şablonları kullanıyorsa (Razor görünümleri, pano dışa aktarımları, web içerik arşivi), farklı bir kütüphaneye ihtiyacınız var. Topluluk Lisansı, yıllık $1M brüt gelir altındaki işletmeleri kapsar; bu eşiği geçerseniz, ticari lisans gereklidir.

iText— .NET 8 Uyumlu, AGPL Lisanslı

iText (iText'in ardılı) .NET 8'i destekler. pdfHTML eklentisi, özel bir ayrıştırıcı ile HTML-to-PDF dönüşümü sağlar — bir tarayıcı motoru değildir, bu nedenle modern CSS özellikleri (Flexbox, Grid) doğru şekilde rendere edilmez.

Lisanslama: AGPL açık kaynak kullanımı için, ticarî uygulamalar için ticarî lisanslama (abonelik, fiyat açıklanmadı).iText2024'te abonelik bazlı ticarî lisansa geçiş yaptı.

Docker Dağıtımı

Standart Debian Görüntüsü (Önerilen)

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app

#IronPDFworks without additional apt-get installs
# Chromium dependencies are handled internally

COPY --from=build /app/publish .

ENV DOTNET_RUNNING_IN_CONTAINER=true
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

Alpine Görüntüsü (Daha Küçük Bir Kapasite)

FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
WORKDIR /app

# Alpine requires explicit Chromium dependencies
RUN apk add --no-cache chromium nss freetype harfbuzz ca-certificates ttf-freefont

COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

Debian görüntüsü hiçbir ek paket gerektirmez. Alpine görüntüsü daha küçüktür ama açıkça Chromium kütüphane kurulumu gerektirir. Çoğu dağıtım için, standart Debian görüntüsü daha basit ve daha güvenilir.

Azure Functions (İzole İşçi)

.NET 8 Azure Functions izole işçi modelini kullanır. IronPDF, isteğe bağlı PDF üretimi için bu modelle çalışır:

using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

namespace MyApp.Functions;

public class PdfFunctions
{
    [Function("GenerateInvoice")]
    public async Task<HttpResponseData> GenerateInvoice(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var invoice = await req.ReadFromJsonAsync<InvoiceRequest>();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice));

        var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition",
            $"attachment; filename=invoice-{invoice.Id}.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);

        return response;
    }

    private string BuildInvoiceHtml(InvoiceRequest invoice)
    {
        return $@"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>";
    }
}

public record InvoiceRequest(string Id, decimal Amount);
using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

namespace MyApp.Functions;

public class PdfFunctions
{
    [Function("GenerateInvoice")]
    public async Task<HttpResponseData> GenerateInvoice(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var invoice = await req.ReadFromJsonAsync<InvoiceRequest>();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice));

        var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition",
            $"attachment; filename=invoice-{invoice.Id}.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);

        return response;
    }

    private string BuildInvoiceHtml(InvoiceRequest invoice)
    {
        return $@"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>";
    }
}

public record InvoiceRequest(string Id, decimal Amount);
Imports IronPdf
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http

Namespace MyApp.Functions

    Public Class PdfFunctions

        <Function("GenerateInvoice")>
        Public Async Function GenerateInvoice(
            <HttpTrigger(AuthorizationLevel.Function, "post")> req As HttpRequestData) As Task(Of HttpResponseData)

            Dim invoice = Await req.ReadFromJsonAsync(Of InvoiceRequest)()

            Dim renderer = New ChromePdfRenderer()
            Dim pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice))

            Dim response = req.CreateResponse(System.Net.HttpStatusCode.OK)
            response.Headers.Add("Content-Type", "application/pdf")
            response.Headers.Add("Content-Disposition", $"attachment; filename=invoice-{invoice.Id}.pdf")
            Await response.Body.WriteAsync(pdf.BinaryData)

            Return response
        End Function

        Private Function BuildInvoiceHtml(invoice As InvoiceRequest) As String
            Return $"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>"
        End Function

    End Class

    Public Class InvoiceRequest
        Public Property Id As String
        Public Property Amount As Decimal

        Public Sub New(id As String, amount As Decimal)
            Me.Id = id
            Me.Amount = amount
        End Sub
    End Class

End Namespace
$vbLabelText   $csharpLabel

Dağıtım düşüncesi: IronPDF'in Chromium binary'si konuşlanma paketine ~200MB ekler. Azure Functions tüketim planının 1.5GB dağıtım boyutu sınırı vardır — toplam paket boyutunuzu doğrulayın. Premium veya Adanmış planlar için, bu sınır geçerli değil. İlk PDF üretimi için soğuk başlatma gecikmesi, Chromium başlatılırken 2–5 saniyedir.

Yerel AOT Uyumluluğu

.NET 8, Native AOT desteğini genişletti, ancak PDF kütüphaneleri temel sınırlamalarla karşı karşıya. Chromium tabanlı kütüphaneler (IronPDF, Puppeteer Sharp) AOT derlenemez çünkü tarayıcı süreçlerini gömüyor veya çalıştırıyorlar. iText, kırpma ile çelişen kapsamlı bir yansıma kullanır.

Mevcut durum <PublishAot>true</PublishAot> ile:

KütüphaneAOT DurumuSebep
IronPDFUyumsuzChromium çalışma zamanı gömüyor
iTextUyumsuzAğır yansıma, dinamik kod üretimi
QuestPDFKısmi (TrimMode=partial ile)Bazı yansıma kullanımı
PDFSharpUyumsuzSystem.Drawing.Common bağımlılığı

Eğer Native AOT kesin bir gereklilikse,QuestPDFve TrimMode=partial en yakın seçenek olup, sadece programatik belge üretimi için geçerlidir, HTML dönüşümü için değil. HTML-PDF senaryoları için, AOT şu anda hiçbir kütüphane ile uygulanabilir değil.

Lisans Karşılaştırması

KütüphaneModelMaliyet.NET 8 Desteği
IronPDFSüresiz$2,998 (Lite) / 1.499 $ (Pro) / 2.999 $ (Enterprise)Tam
iTextAGPL veya AbonelikYayınlanmamış ($15K–$210K/yıl tahmini)Tam
QuestPDFTopluluk / TicariÜcretsiz <$1M gelir, sonra ticariTam
PDFSharpMIT (ücretsiz)$0Yalnızca Windows (Linux tamamlanmamış)
Aspose.PDFGeliştirici başına~$999+Tam (Linux bellek sorunları)

.NET 9 İleri Uyumluluk

.NET 9 (Kasım 2025'te yayına çıktı), .NET 8'de belirtilmiş olan desenleri devam ettiriyor. .NET 8 ile çalışan kütüphaneler genel olarak değişiklik yapmadan .NET 9 ile çalışır. .NET 9'un PDF üretimi için ilgili başlıca eklemeleri ARM64 performansı iyileştirmeleri (Apple Silicon ve AWS Graviton üzerinde Chromium tabanlı renderden faydalanır) ve devam eden Yerel AOT geliştirmeleri (ancak PDF kütüphaneleri için temel sınırlamalar devam ediyor).

.NET 9'u hedefliyorsanız veya yükseltmeyi planlıyorsanız, .NET 8 çapraz platform dağıtımını tam olarak destekleyen bir kütüphane seçmek en güvenli yoldur. Platforma özel sorunları olan kütüphaneler (Linux'ta PDFSharp, libgdiplus ile Aspose), .NET 9'da bu sorunları çözmeleri pek olası değildir çünkü altta yatan bağımlılık kullanımdan kaldırma kalıcıdır.

Geçiş Rehberi

iText'ten IronPDF'e

// Before (iTextSharp — doesn't compile against net8.0)
using iTextSharp.text;
using iTextSharp.text.pdf;

var doc = new Document();
PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create));
doc.Open();
doc.Add(new Paragraph("Hello World"));
doc.Close();

// After (IronPDF — targets net8.0)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>");
pdf.SaveAs("output.pdf");
// Before (iTextSharp — doesn't compile against net8.0)
using iTextSharp.text;
using iTextSharp.text.pdf;

var doc = new Document();
PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create));
doc.Open();
doc.Add(new Paragraph("Hello World"));
doc.Close();

// After (IronPDF — targets net8.0)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>");
pdf.SaveAs("output.pdf");
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports IronPdf
Imports System.IO

' Before (iTextSharp — doesn't compile against net8.0)
Dim doc As New Document()
PdfWriter.GetInstance(doc, New FileStream("output.pdf", FileMode.Create))
doc.Open()
doc.Add(New Paragraph("Hello World"))
doc.Close()

' After (IronPDF — targets net8.0)
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>")
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

wkhtmltopdf Çevreleyicilerinden IronPDF'e Geçiş

// Before (DinkToPdf — DllNotFoundException on .NET 8)
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument
{
    Objects = { new ObjectSettings { HtmlContent = html } }
};
var bytes = converter.Convert(doc);

// After (IronPDF — native .NET 8 support)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
var bytes = pdf.BinaryData;
// Before (DinkToPdf — DllNotFoundException on .NET 8)
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument
{
    Objects = { new ObjectSettings { HtmlContent = html } }
};
var bytes = converter.Convert(doc);

// After (IronPDF — native .NET 8 support)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
var bytes = pdf.BinaryData;
Imports IronPdf

' Before (DinkToPdf — DllNotFoundException on .NET 8)
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument With {
    .Objects = {New ObjectSettings With {.HtmlContent = html}}
}
Dim bytes = converter.Convert(doc)

' After (IronPDF — native .NET 8 support)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
bytes = pdf.BinaryData
$vbLabelText   $csharpLabel

Her iki durumda da API yüzeyi daha basittir. Ana geçiş maliyeti, çıktının beklentilere uygun olduğunu doğrulamak için mevcut HTML şablonlarınızı yeni render motoruna karşı test etmenizdir.

Tavsiye

.NET 8 projeleri için HTML-PDF dönüşümü gerekmektedir: IronPDF, yerleşik Chromium render işlemiyle yapılandırma olmaksızın çapraz platform olarak çalışır. Docker dağıtımını, Azure Functions'ını ve Linux kapsayıcılarını kutudan çıktığı gibi kullanır.

.NET 8 projeleri için verilerden programatik olarak belge oluşturuluyorsa: QuestPDF'nin akıcı API'si iyi tasarlanmış ve .NET 8 uyumlu, Topluluk Lisansı çoğu girişim ve küçük ekipleri kapsar.

Windows'ta PDF işlemleri (birleştirme, ayırma, formlar) için: Dağıtım hedefiniz sadece Windows ise,PDFSharpgeçerli kalır.

iText'ten (uyumlu değildir), wkhtmltopdf sarmalayıcılardan (arşivlenmiş, CVE'ler) ve çapraz platform dağıtım için System.Drawing.Common'a bağlı herhangi bir kütüphaneden kaçının.

Lütfen dikkate alınAspose, DinkToPdf, NReco, PDFSharp, PuppeteerSharp, QuestPDF, Rotativa, TuesPechkin, iText, ve wkhtmltopdf kendi sahiplerinin tescilli markalarıdır. Bu site, Aspose Pty Ltd, CodeFlint, DinkToPdf, NReco, PuppeteerSharp, Rotativa, TuesPechkin, empira Software GmbH,iTextGroup veya wkhtmltopdf ile bağlantılı, onaylanan veya sponsor olunan bir site değildir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.