KARşıLAşTıRMA

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

.NET 8, birçok geleneksel PDF kütüphanesi ile uyumluluğu bozan çalışma zamanı değişiklikleri getirdi. System.Drawing.Common, Windows dışı platformlarda kullanım dışı bırakılmıştır, Native AOT, yansıma ağırlıklı kütüphanelere yeni kısıtlamalar getirir ve konteyner öncelikli dağıtım modeli, Windows geliştirme makinelerinde ortaya çıkmayan bağımlılık sorunlarını açığa çıkarır. Kutuphanaler .NET Framework veya hatta .NET 6'da calistiysa, .NET 8'de NU1202, DllNotFoundException veya PlatformNotSupportedException hatalariyla basarisiz olabilir.

Bu makale, hangi PDF kütüphanelerinin .NET 8 ile çalıştığını, uyumsuz kütüphanelerle karşılaşacağınız belirli hataları ve Docker ve Azure Functions için dağıtım yapılandırmalarını belgeler.

Başlangıç Kılavuzu: .NET 8'de HTML'den PDF Üretin

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 ile yukleyin: Install-Package IronPdf. Ek bir konfigurasyon olmadan net8.0 hedefler. Windows, Linux, macOS, Docker ve Azure'a platforma özgü ayar olmadan dağıtır.

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

iTextSharp — .NET 8 ile Uyumlu Değil

iTextSharp (iText'in orijinal .NET portu) 2018'den beri güncellenmemiştir. Yalnızca .NET Framework hedeflenmiştir:

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

Geçiş yolu iText 7'dir, ki bu farklı bir API'ye sahiptir ve ya AGPL uyumluluğu (tüm uygulamanızı açık kaynak yapın) ya da ticari lisanslama gerektirir. Fiyatlandırma yayınlanmamıştır — üçüncü taraf veriler $15,000–$210,000/yıl öneriyor.

wkhtmltopdf Sarmalayıcılar — .NET 8'de DLL Yükleme Hataları

Wkhtmltopdf etrafındaki C# sarmalayıcılar (DinkToPdf, Rotativa, NReco.PdfGenerator), .NET 8'in dağıtım modeline özgü platform hatalarıyla başarısız oluyor:

DinkToPdf — yerel kütüphane bulunamadı:

System.DllNotFoundException: DLL 'libwkhtmltox' yuklenemedi

Rotativa.AspNetCore — .NET 8'in konteyner öncelikli dağıtımıyla çakışan el ile ikili yol yapılandırması gerektirir:

// 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 bütünlük yüklenemedi

Bu hatalar daha derin bir sorunu yansıtıyor: wkhtmltopdf Temmuz 2024'te arşivlendi ve yamanmamış CVE'ler içeriyordu. Yerel ikili mimari, .NET 8'in platform algılama iyileştirmelerinden önce gelmektedir. Bir çözüm yok — sadece başka bir kütüphaneye geçmelisiniz.

PdfSharp — Linux'ta System.Drawing.Common Hataları

PdfSharp, .NET 6'da Microsoft tarafından Windows dışı platformlarda kullanım dışı bırakılan System.Drawing.Common'a bağımlıdır. .NET 8'de bu, Linux veya Docker'a dağıtılırken ç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ırma üzerinde çalışıyor, ancak 2026 yılının başı itibarıyla çapraz platform desteği hala eksik. Yalnızca Windows dağıtımları için PdfSharp, .NET 8 ile çalışır. Linux, Docker veya bulut dağıtımları için güvenilmezdir.

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

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

IronPDF, gomulu Chromium rendering ile dogal olarak net8.0 hedef alir. System.Drawing.Common bağımlılığı yok, yerel ikili yönetimi yok, platforma özgü yapılandırma yok.

Minimal API entegrasyonu (birincil .NET 8 deseni):

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

Kontrolor paternini kullanan takimlar icin, ayni kod bir kontrolor aksiyonu icinde calisir — RenderHtmlAsPdf bir PdfDocument dondurur ve bunu .BinaryData ile byte'lara dönüştürebilirsiniz.

Lisanslama: $749'dan başlayan süresiz lisans (Lite — 1 geliştirici, 1 proje). Profesyonel: $1,499 (10 geliştirici). Kurumsal: $2,999 (sınırsız). ironpdf.com adresinde yayınlandı.

QuestPDF — .NET 8 ile Uyumlu, HTML Yok

QuestPDF, platforma bağımlılıklar olmadan .NET 8 ile çalışır. Fluent C# API'si belgeleri programlı olarak oluşturur — HTML ayrıştırıcısı yok, CSS motoru yok, 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. Eğer iş akışınız HTML şablonları kullanıyorsa (Razor görünümleri, pano dışa aktarımları, web içeriği arşivleme), farklı bir kütüphaneye ihtiyaç duyarsınız. Toplum Lisansı, yıllık geliri 1 milyon doların altında olan işletmeleri kapsar; bu sınırın üzerinde, ticari lisanslama gereklidir.

iText 7 — .NET 8 ile Uyumlu, AGPL Lisanslı

iText 7 (iTextSharp'ın halefi) .NET 8'i destekler. PdfHTML eklentisi, özel bir ayrıştırıcı ile HTML-to-PDF dönüşümü sağlar — tarayıcı motoru değil, bu nedenle modern CSS özellikleri (Flexbox, Grid) doğru şekilde çalışmaz.

Lisanslama: AGPL açık kaynak kullanımı için, tescilli uygulamalar için ticari lisanslama (abonelik, fiyat bilgisi yayımlanmamıştır) için. iText, 2024 yılında abonelik tabanlı ticari lisanslamaya geçiş yaptı.

Docker Dağıtımı

Standard Debian Image (Ö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

# IronPDF works 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 Image (Daha Küçük Ayak İzi)

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 imajı, sıfır ek paket gerektirir. Alpine imajı daha küçüktür ama açıkça Chromium kütüphane yüklemesi gerektirir. Çoğu dağıtım için, standart Debian imajı daha basit ve daha güvenilirdir.

Azure İşlevleri (İzole Çalışan)

.NET 8 Azure İşlevleri izole çalışan modelini kullanır. IronPDF, talep üzerine PDF oluşturmak 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 dikkat edilmesi gerekenler: IronPDF'in Chromium ikili dosyası dağıtım paketine ~200MB ekler. Azure İşlevleri tüketim planının 1,5GB dağıtım boyutu sınırı vardır — toplam paket boyutunuzu doğrulayın. Premium veya Ayrılmış planlar için bu sınır geçerli değildir. İlk PDF oluşturma için soğuk başlangıç gecikmesi, Chromium başlatıldığında 2-5 saniyedir.

Native AOT Uyumlu

.NET 8, Native AOT desteğini genişletti, ancak PDF kütüphaneleri temel kısıtlamalarla karşı karşıya. Chromium tabanlı kütüphaneler (IronPDF, Puppeteer Sharp), tarayıcı işlemleri yerleştirdikleri veya çalıştırdıkları için AOT derleyemezler. iText 7, kesme ile çelişen yoğun yansıma kullanıyor.

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

KütüphaneAOT DurumuSebep
IronPDFUyumlu değilChromium çalışma zamanını gömer
iText 7Uyumlu değilAğır yansıma, dinamik kod üretimi
QuestPDFKısmi (TrimMode=partial ile)Bazı yansıma kullanımları
PdfSharpUyumlu değilSystem.Drawing.Common bağımlılığı

Native AOT sert bir gereksinimse, TrimMode=partial ileQuestPDFen yakin seçenek — ancak sadece programatik belge oluşturma icin, HTML donusumu icin değil. HTML'den PDF'e senaryolar için, AOT şu anda hiçbir kütüphaneyle mümkün değildir.

Lisans Karşılaştırması

KütüphaneModelMaliyet.NET 8 Desteği
IronPDFSürekli$749 (Lite) / $1,499 (Pro) / $2,999 (Enterprise)Tam
iText 7AGPL veya AbonelikYayınlanmadı ($15K–$210K/yıl tahmin)Tam
QuestPDFTopluluk / TicariÜcretsiz <$1M gelir, ardından ticariTam
PdfSharpMIT (ücretsiz)$0Sadece Windows (Linux eksik)
Aspose.PDFGeliştirici başına~$999+Tam (Linux bellek sorunları)

.NET 9 İleri Uyum Yeteneği

.NET 9 (Kasım 2025'te piyasaya sürüldü), .NET 8'de kurulan kalıpları sürdürür. .NET 8 ile çalışan kütüphaneler genellikle .NET 9 ile değişiklik yapmadan çalışır. .NET 9'un PDF oluşturma ile ilgili başlıca eklemeleri, ARM64 performansındaki iyileştirmeler (Apple Silicon ve AWS Graviton üzerindeki Chromium tabanlı rendere fayda sağlar) ve devam eden Native AOT iyileştirmeleridir (ancak PDF kütüphaneleri için temel kısıtlamalar devam eder).

.NET 9'a yönelik olunuyor 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 özgü sorunları olan kütüphaneler (Linux üzerinde PdfSharp, libgdiplus ile Aspose gibi) .NET 9'da bu sorunları çözmesi olası değildir çünkü temel bağımlılık tasfiyesi kalıcıdır.

Geçiş Rehberi

iTextSharp'tan 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 Wrapperlerinden IronPDF'e

// 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

API yüzeyi her iki durumda da daha basittir. Ana geçiş maliyeti, mevcut HTML şablonlarınızı yeni render ile test ederek çıktının beklentilerle uyumlu olduğunu doğrulamaktır.

Oneri

.NET 8 projeleri için HTML'den PDF'e dönüşüm gerektiren: IronPDF, yapılandırma gerekmeden çapraz platform üzerinde çalışan gömülü Chromium render sağlar. Docker dağıtımını, Azure Functions'ı ve Linux konteynerlerini kutudan çıktığı gibi ele alır.

.NET 8 projeleri için verilerden programatik olarak belgeler oluşturan: QuestPDF'nin akıcı API'si iyi tasarlanmış ve .NET 8 uyumlu, Topluluk Lisansı, çoğu başlangıç ve küçük takımları kapsar.

Windows'ta PDF işleme (birleştirme, bölme, formlar) için: Dağıtım hedefiniz yalnızca Windows isePdfSharphala geçerli.

iTextSharp'tan kaçının (uyumsuz), wkhtmltopdf wrapperlerini (arşivlenmiş, CVE'ler) ve çapraz platform dağıtımı için System.Drawing.Common'e bağımlı olan herhangi bir kütüphaneden kaçının.