UżYWANIE IRON SUITE

Przewodnik 2025: Najlepsze biblioteki PDF dla C# (najpierw darmowe, płatne w razie potrzeby)

Kiedy większość ludzi myśli o PDF (Portable Document Format), myślą o pliku pełnym informacji. I mają rację, ponieważ obecnie PDFy są najczęściej używanym formatem plików do udostępniania informacji i stały się standardem. Ale kiedy programiści patrzą na PDFy, nie widzą tylko informacji; analizują format, typ zawartości i inne techniczne aspekty tego dokumentu.

Podczas tworzenia plików PDF programowo utrzymanie struktury treści jest najważniejszym zadaniem. I nie jest to tak proste zadanie, jak się wydaje, ponieważ kiedy mówimy o zawartości, nie chodzi tylko o tekst, zawiera on również obrazy, wykresy, dźwięki, a nawet filmy. Także edytowanie PDFów programowo jest teraz powszechnym wymaganiem.

W erze AI chcemy mieć pełną kontrolę nad PDFami. Czasami musimy zredagować tekst z powodu jakiejkolwiek polityki, chronić PDFy, aby zabezpieczyć wrażliwe pliki, wyodrębnić dane do przetwarzania czy dynamicznie generować raporty. Istnieje wiele przypadków użycia tych procesów. Są to powszechnie napotykane problemy przez programistów podczas programowego przetwarzania plików PDF:

  1. Jak utrzymać sformatowany układ dokumentu PDF radząc sobie ze wszystkimi typami mediów jako zawartością.

  2. Wyodrębnianie tekstu w poprawnej kolejności, zwłaszcza jeśli tekst znajduje się w kolumnach.

  3. Ograniczenia pamięci podczas przetwarzania dokumentów PDF z wieloma stronami.

  4. Obsługa formularzy jest głównym problemem napotykanym przez programistów.

  5. Konwersja plików PDF na inne odpowiednie typy dokumentów.

Aby ułatwić to zadanie, pojawiają się biblioteki PDF. W tym artykułe omówimy kilka bibliotek PDF dla C# takich jak IronPDF i Aspose.PDF oraz ich modele cenowe. Zagłębimy się w praktyczne przypadki użycia i zrozumiemy, jak te biblioteki ułatwiają programowe tworzenie i manipulację PDFami, gotowe do użycia produkcyjnego w kilku krokach.

1. IronPDF: C# PDF Library

IronPDF to kompletna biblioteka PDF dla .NET, którą programiści mogą używać do tworzenia, edycji plików PDF, konwersji dokumentów PDF do dowolnego innego formatu i wykonywania wielu innych operacji na PDFach. Używa bardzo mało pamięci, przetwarzając duże pliki PDF. Działa całkowicie na lokalnej maszynie, więc nie jesteś zależny od przetwarzania na poziomie serwera podczas pracy z nią.

Ta biblioteka jest również kompatybilna z najnowszym .NET Framework, a jej integracja z projektami .NET jest bardzo płynna. Wystarczy uruchomić następujące polecenie w Menedżerze Pakietów NuGet, a IronPDF będzie gotowy do użycia w projekcie:

Install-Package IronPdf

Nie musisz instalować żadnej innej biblioteki, ponieważ jest w pełni niezależna od zewnętrznych zależności. Po zainstalowaniu tej biblioteki automatycznie instaluje wszystkie wymagańe zależności jednocześnie.

Najważniejszą cechą IronPDF jest jego zdolność do konwersji HTML na PDF z perfekcyjną dokładnością pikselową. IronPDF oferuje wiele metod tworzenia dokumentów PDF z zawartości HTML. Możesz przekonwertować ciąg HTML, plik HTML lub URL bezpośrednio na PDF. Obsługuje także CSS i JavaScript, aby upewnić się, że generowane dokumenty PDF dokładnie odzwierciedlają oryginalne renderowanie HTML.

Poza podstawowymi operacjami, IronPDF wspiera formularze PDF, szyfrowanie na wszystkich poziomach i dodawanie podpisów cyfrowych. Możesz wyodrębniać obrazy i tekst z plików PDF. Możesz także dodawać tekst lub HTML nagłówki i stopki, łączyć i dzielić PDFy, modyfikować wiele segmentów tekstu oraz znajdować i zamieniać tekst. IronPDF wspiera nie tylko tworzenie PDFów z HTML, ale także konwersję na PDF z DOCX, RTF, MD i plików obrazów. Ta biblioteka jest bardzo lekka i bardzo wydajna w zarządzaniu pamięcią (Mniej niż 10MB pamięci wymagańe do podstawowych operacji). IronPDF śledzi swoje kamieńie milowe dotyczące stabilności i wydajności, do których masz dostęp tutaj.

IronPDF oferuje wiele poziomów wsparcia. Możesz skontaktować się z inżynierami przez czat na żywo, tworzenie zgłoszeń lub e-mail. Zespół wsparcia jest dostępny 24/7. IronPDF ma również szczegółowe samouczki i dokumentację, które obejmują niemal wszystkie tematy, które możesz potrzebować zrozumieć lub o które masz pytania.

IronPDF to biblioteka gotowa do użycia produkcyjnego, która została przetestowana, zoptymalizowana i zaufana przez wiele popularnych firm dla ich działających produktów. Sprawia to, że jest jedną z najlepszych bibliotek PDF do użycia w twoich projektach dla operacji na PDFach. Spójrzmy na przykłady kodu biblioteki IronPDF.

Przykłady kodu

Konwersja HTML do PDF

using IronPdf;
var renderer = new ChromePdfRenderer();

// 1. HTML String to PDF
var pdf1 = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf1.SaveAs("html-string.pdf");

// 2. HTML String with Assets (Images, CSS, JS)
var pdf2 = renderer.RenderHtmlAsPdf(
    "<img src='logo.png'><link rel='stylesheet' href='style.css'>",
    @"C:\assets\"
);
pdf2.SaveAs("html-with-assets.pdf");

// 3. HTML File to PDF
var pdf3 = renderer.RenderHtmlFileAsPdf("example.html");
pdf3.SaveAs("html-file.pdf");

// 4. URL to PDF
var pdf4 = renderer.RenderUrlAsPdf("https://ironpdf.com");
pdf4.SaveAs("url.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();

// 1. HTML String to PDF
var pdf1 = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf1.SaveAs("html-string.pdf");

// 2. HTML String with Assets (Images, CSS, JS)
var pdf2 = renderer.RenderHtmlAsPdf(
    "<img src='logo.png'><link rel='stylesheet' href='style.css'>",
    @"C:\assets\"
);
pdf2.SaveAs("html-with-assets.pdf");

// 3. HTML File to PDF
var pdf3 = renderer.RenderHtmlFileAsPdf("example.html");
pdf3.SaveAs("html-file.pdf");

// 4. URL to PDF
var pdf4 = renderer.RenderUrlAsPdf("https://ironpdf.com");
pdf4.SaveAs("url.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' 1. HTML String to PDF
Dim pdf1 = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf1.SaveAs("html-string.pdf")

' 2. HTML String with Assets (Images, CSS, JS)
Dim pdf2 = renderer.RenderHtmlAsPdf("<img src='logo.png'><link rel='stylesheet' href='style.css'>", "C:\assets\")
pdf2.SaveAs("html-with-assets.pdf")

' 3. HTML File to PDF
Dim pdf3 = renderer.RenderHtmlFileAsPdf("example.html")
pdf3.SaveAs("html-file.pdf")

' 4. URL to PDF
Dim pdf4 = renderer.RenderUrlAsPdf("https://ironpdf.com")
pdf4.SaveAs("url.pdf")
$vbLabelText   $csharpLabel

Wyodrębniaj tekst i obrazy z PDFów

using IronPdf;
using IronSoftware.Drawing;
using System.Collections.Generic;

// Load PDF document
var pdf = PdfDocument.FromFile("sample.pdf");

// 1. Extract All Text
string allText = pdf.ExtractAllText();

// 2. Extract Text from Specific Page
string pageText = pdf.ExtractTextFromPage(0); 

// 3. Extract Text from Multiple Pages
for (int i = 0; i < pdf.PageCount; i++)
{
    string text = pdf.ExtractTextFromPage(i);
    Console.WriteLine($"Page {i + 1}: {text}");
}

// 4. Extract All Images
var allImages = pdf.ExtractAllImages();
foreach (var image in allImages)
{
    image.SaveAs($"image_{allImages.IndexOf(image)}.png");
}

// 5. Extract Images from Specific Page
List<AnyBitmap> pageImages = pdf.ExtractBitmapsFromPage(0);

// 6. Extract Raw Images (as byte arrays)
var rawImages = pdf.ExtractAllRawImages();
for (int i = 0; i < rawImages.Count; i++)
{
    System.IO.File.WriteAllBytes($"raw_image_{i}.png", rawImages[i]);
}

// 7. Extract Both Text & Images from Each Page
for (int i = 0; i < pdf.PageCount; i++)
{
    string text = pdf.ExtractTextFromPage(i);
    List<AnyBitmap> images = pdf.ExtractBitmapsFromPage(i);

    Console.WriteLine($"Page {i + 1}: {text}");
    Console.WriteLine($"Found {images.Count} images");
}
using IronPdf;
using IronSoftware.Drawing;
using System.Collections.Generic;

// Load PDF document
var pdf = PdfDocument.FromFile("sample.pdf");

// 1. Extract All Text
string allText = pdf.ExtractAllText();

// 2. Extract Text from Specific Page
string pageText = pdf.ExtractTextFromPage(0); 

// 3. Extract Text from Multiple Pages
for (int i = 0; i < pdf.PageCount; i++)
{
    string text = pdf.ExtractTextFromPage(i);
    Console.WriteLine($"Page {i + 1}: {text}");
}

// 4. Extract All Images
var allImages = pdf.ExtractAllImages();
foreach (var image in allImages)
{
    image.SaveAs($"image_{allImages.IndexOf(image)}.png");
}

// 5. Extract Images from Specific Page
List<AnyBitmap> pageImages = pdf.ExtractBitmapsFromPage(0);

// 6. Extract Raw Images (as byte arrays)
var rawImages = pdf.ExtractAllRawImages();
for (int i = 0; i < rawImages.Count; i++)
{
    System.IO.File.WriteAllBytes($"raw_image_{i}.png", rawImages[i]);
}

// 7. Extract Both Text & Images from Each Page
for (int i = 0; i < pdf.PageCount; i++)
{
    string text = pdf.ExtractTextFromPage(i);
    List<AnyBitmap> images = pdf.ExtractBitmapsFromPage(i);

    Console.WriteLine($"Page {i + 1}: {text}");
    Console.WriteLine($"Found {images.Count} images");
}
Imports IronPdf
Imports IronSoftware.Drawing
Imports System.Collections.Generic
Imports System.IO

' Load PDF document
Dim pdf = PdfDocument.FromFile("sample.pdf")

' 1. Extract All Text
Dim allText As String = pdf.ExtractAllText()

' 2. Extract Text from Specific Page
Dim pageText As String = pdf.ExtractTextFromPage(0)

' 3. Extract Text from Multiple Pages
For i As Integer = 0 To pdf.PageCount - 1
    Dim text As String = pdf.ExtractTextFromPage(i)
    Console.WriteLine($"Page {i + 1}: {text}")
Next

' 4. Extract All Images
Dim allImages = pdf.ExtractAllImages()
For Each image In allImages
    image.SaveAs($"image_{allImages.IndexOf(image)}.png")
Next

' 5. Extract Images from Specific Page
Dim pageImages As List(Of AnyBitmap) = pdf.ExtractBitmapsFromPage(0)

' 6. Extract Raw Images (as byte arrays)
Dim rawImages = pdf.ExtractAllRawImages()
For i As Integer = 0 To rawImages.Count - 1
    File.WriteAllBytes($"raw_image_{i}.png", rawImages(i))
Next

' 7. Extract Both Text & Images from Each Page
For i As Integer = 0 To pdf.PageCount - 1
    Dim text As String = pdf.ExtractTextFromPage(i)
    Dim images As List(Of AnyBitmap) = pdf.ExtractBitmapsFromPage(i)

    Console.WriteLine($"Page {i + 1}: {text}")
    Console.WriteLine($"Found {images.Count} images")
Next
$vbLabelText   $csharpLabel

Edytuj dokumenty PDF: Nagłówki i Stopki

using IronPdf;
using System;
var renderer = new ChromePdfRenderer();

// 1. Add Footer with Page Numbers
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
    MaxHeight = 15, // mm
    DrawDividerLine = true
};
renderer.RenderingOptions.MarginBottom = 25;

// 2. Add Header with Logo
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<img src='logo.png'>",
    MaxHeight = 20, // mm
    BaseUrl = new Uri(@"C:\assets\images\").AbsoluteUri
};
renderer.RenderingOptions.MarginTop = 25;

// 3. Render HTML to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Title</h1><p>Content...</p>");
pdf.SaveAs("output.pdf");
using IronPdf;
using System;
var renderer = new ChromePdfRenderer();

// 1. Add Footer with Page Numbers
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
    MaxHeight = 15, // mm
    DrawDividerLine = true
};
renderer.RenderingOptions.MarginBottom = 25;

// 2. Add Header with Logo
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<img src='logo.png'>",
    MaxHeight = 20, // mm
    BaseUrl = new Uri(@"C:\assets\images\").AbsoluteUri
};
renderer.RenderingOptions.MarginTop = 25;

// 3. Render HTML to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Title</h1><p>Content...</p>");
pdf.SaveAs("output.pdf");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

' 1. Add Footer with Page Numbers
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
    .HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
    .MaxHeight = 15, ' mm
    .DrawDividerLine = True
}
renderer.RenderingOptions.MarginBottom = 25

' 2. Add Header with Logo
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .HtmlFragment = "<img src='logo.png'>",
    .MaxHeight = 20, ' mm
    .BaseUrl = New Uri("C:\assets\images\").AbsoluteUri
}
renderer.RenderingOptions.MarginTop = 25

' 3. Render HTML to PDF
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document Title</h1><p>Content...</p>")
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Obsługa formularzy

using IronPdf;

// Load existing PDF with form fields
var pdf = PdfDocument.FromFile("EditableForm.pdf");

// Fill text fields
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
pdf.Form.FindFormField("email").Value = "john.smith@example.com";

// Fill radio button
pdf.Form.FindFormField("gender").Value = "Male";

// Fill dropdown/combobox
pdf.Form.FindFormField("country").Value = "USA";

// Fill checkbox ("Yes" to check, "No" to uncheck)
pdf.Form.FindFormField("subscribe").Value = "Yes";

// Fill textarea (use \r\n for line breaks)
pdf.Form.FindFormField("comments").Value = "This is a comment.\r\nSecond line here.";

// Save filled form
pdf.SaveAs("FilledForm.pdf");
using IronPdf;

// Load existing PDF with form fields
var pdf = PdfDocument.FromFile("EditableForm.pdf");

// Fill text fields
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
pdf.Form.FindFormField("email").Value = "john.smith@example.com";

// Fill radio button
pdf.Form.FindFormField("gender").Value = "Male";

// Fill dropdown/combobox
pdf.Form.FindFormField("country").Value = "USA";

// Fill checkbox ("Yes" to check, "No" to uncheck)
pdf.Form.FindFormField("subscribe").Value = "Yes";

// Fill textarea (use \r\n for line breaks)
pdf.Form.FindFormField("comments").Value = "This is a comment.\r\nSecond line here.";

// Save filled form
pdf.SaveAs("FilledForm.pdf");
Imports IronPdf

' Load existing PDF with form fields
Dim pdf = PdfDocument.FromFile("EditableForm.pdf")

' Fill text fields
pdf.Form.FindFormField("firstname").Value = "John"
pdf.Form.FindFormField("lastname").Value = "Smith"
pdf.Form.FindFormField("email").Value = "john.smith@example.com"

' Fill radio button
pdf.Form.FindFormField("gender").Value = "Male"

' Fill dropdown/combobox
pdf.Form.FindFormField("country").Value = "USA"

' Fill checkbox ("Yes" to check, "No" to uncheck)
pdf.Form.FindFormField("subscribe").Value = "Yes"

' Fill textarea (use vbCrLf for line breaks)
pdf.Form.FindFormField("comments").Value = "This is a comment." & vbCrLf & "Second line here."

' Save filled form
pdf.SaveAs("FilledForm.pdf")
$vbLabelText   $csharpLabel

Jak widać z powyższych przykładów, możesz wykonać każdą operację na pliku PDF przy użyciu zaledwie kilku linii z IronPDF. Jest to bardzo proste i bezpośrednie. Nazwy metod są łatwe do zrozumieniuiuiuiuia i implementacji.

Licencja

IronPDF jest darmowy w użyciu do celów deweloperskich, a także możesz pobrać bezpłatną wersję próbną. Ale do produkcji będziesz musiał kupić licencję na IronPDF. Model licencjonowania IronPDF jest elastyczny, ponieważ oferuje dwa rodzaje licencji:

  1. Licencja abonamentowa

  2. Licencja wieczysta

Licencja abonamentowa będzie kosztować $59/miesiąc (rozliczane rocznie), co obejmuje 1 dewelopera, 1 projekt i 15 000 wywołań API rocznie. Dodatkowe wywołania API kosztują $0,03 każde po przekroczeniu limitu.

Licencja wieczysta zaczyna się od $1,999 i ma wiele opcji, które możesz wybrać zgodnie ze swoimi potrzebami. Najlepsza część tej licencji to jednorazowa płatność. Nie musisz płacić ponownie za użycie IronPDF.

Csharp Pdf Libraries Tool 1 related to Licencja

2. Aspose.PDF for .NET

Aspose.PDF to także biblioteka PDF dla C# stworzona przez Aspose jako część ich zestawu bibliotek .NET, powszechnie używana komercyjnie do zadań związanych z PDF, takich jak tworzenie skomplikówanych raportów, dokumentów wrażliwych, dostosowywanie dokumentów PDF i wiele innych. Jest to jedna z najczęściej używanych bibliotek PDF dla C#. Również obsługuje najnowszy .NET Framework.

Aspose.PDF może tworzyć dokumenty PDF nie tylko z zawartości HTML, ale wspiera także wyodrębnianie danych z plików XML, aby zrealizować prawdziwe dane zamiast tworzenia statycznych plików. Ta funkcja jest bardzo pomocna w tworzeniu skomplikówanych raportów. Podobnie jak IronPDF, możesz dodawać tekst, obrazy, wykresy i wiele innych typów zawartości w plikach PDF. Aspose.PDF oferuje także osadzanie podpisów cyfrowych, obsługę adnotacji, nagłówków i stopek oraz wyodrębnianie tekstu z plików PDF. Możesz wyodrębnić dane strukturalne z PDF. Ta biblioteka bardzo dobrze obsługuje edytowanie PDF, wykorzystując wymienione funkcje.

Poza tymi zaletami biblioteki Aspose.PDF, są także liczne wady. Główną wadą tej biblioteki jest bardzo wysoką cena (Rozpoczynając od $1679), a jej model cenowy jest bardzo skomplikówany do zrozumieniuiuiuiuia. W przeciwieństwie do IronPDF, musisz kupić model dla każdego procesu osobno, jak rozwój i wdrożenie. Dodatkowo, ta biblioteka zużywa wiele zasobów (przekraczając 2GB przy generowaniu PDFów z ponad 400 obrazami). Wymaga wiele pamięci do obsługi operacji na PDFach i jest to naprawdę frustrujące. Nie ma wątpliwości, że ta biblioteka jest dobra w tym, co robi, ale ma bardzo stromą krzywą uczenia się. Jej kod nie jest łatwy do zrozumieniuiuiuiuia i wymaga bardzo szczegółowego szkolenia, aby zrozumieć.

Przykład kodu

Generuj dokumenty PDF z Tekstem, Obrazami i Tabelami

using Aspose.Pdf;
using Aspose.Pdf.Text;

using (var document = new Document())
{
    // Add page objects
    var page = document.Pages.Add();

    // Add image - requires Rectangle positioning (You can add tiff images as well)
    page.AddImage("logo.png", new Rectangle(20, 730, 120, 830));

    // Add text - requires manual positioning
    var header = new TextFragment("Company Report");
    header.TextState.Font = FontRepository.FindFont("Arial");
    header.TextState.FontSize = 24;
    header.HorizontalAlignment = HorizontalAlignment.Center;
    header.Position = new Position(130, 720);
    page.Paragraphs.Add(header);

    // Add table - extensive configuration required
    var table = new Table
    {
        ColumnWidths = "100 100 100",
        Border = new BorderInfo(BorderSide.Box, 1f, Color.Black),
        DefaultCellBorder = new BorderInfo(BorderSide.Box, 0.5f, Color.Gray),
        DefaultCellPadding = new MarginInfo(4.5, 4.5, 4.5, 4.5)
    };

    // Add header row
    var headerRow = table.Rows.Add();
    headerRow.Cells.Add("Name");
    headerRow.Cells.Add("Age");
    headerRow.Cells.Add("City");

    // Style each header cell individually
    foreach (Cell cell in headerRow.Cells)
    {
        cell.BackgroundColor = Color.LightGray;
        cell.DefaultCellTextState.FontSize = 12;
    }

    // Add data row
    var dataRow = table.Rows.Add();
    dataRow.Cells.Add("John Doe");
    dataRow.Cells.Add("30");
    dataRow.Cells.Add("New York");

    page.Paragraphs.Add(table);

    // Save document
    document.Save("Report.pdf");
}
using Aspose.Pdf;
using Aspose.Pdf.Text;

using (var document = new Document())
{
    // Add page objects
    var page = document.Pages.Add();

    // Add image - requires Rectangle positioning (You can add tiff images as well)
    page.AddImage("logo.png", new Rectangle(20, 730, 120, 830));

    // Add text - requires manual positioning
    var header = new TextFragment("Company Report");
    header.TextState.Font = FontRepository.FindFont("Arial");
    header.TextState.FontSize = 24;
    header.HorizontalAlignment = HorizontalAlignment.Center;
    header.Position = new Position(130, 720);
    page.Paragraphs.Add(header);

    // Add table - extensive configuration required
    var table = new Table
    {
        ColumnWidths = "100 100 100",
        Border = new BorderInfo(BorderSide.Box, 1f, Color.Black),
        DefaultCellBorder = new BorderInfo(BorderSide.Box, 0.5f, Color.Gray),
        DefaultCellPadding = new MarginInfo(4.5, 4.5, 4.5, 4.5)
    };

    // Add header row
    var headerRow = table.Rows.Add();
    headerRow.Cells.Add("Name");
    headerRow.Cells.Add("Age");
    headerRow.Cells.Add("City");

    // Style each header cell individually
    foreach (Cell cell in headerRow.Cells)
    {
        cell.BackgroundColor = Color.LightGray;
        cell.DefaultCellTextState.FontSize = 12;
    }

    // Add data row
    var dataRow = table.Rows.Add();
    dataRow.Cells.Add("John Doe");
    dataRow.Cells.Add("30");
    dataRow.Cells.Add("New York");

    page.Paragraphs.Add(table);

    // Save document
    document.Save("Report.pdf");
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Text

Using document As New Document()
    ' Add page objects
    Dim page = document.Pages.Add()

    ' Add image - requires Rectangle positioning (You can add tiff images as well)
    page.AddImage("logo.png", New Rectangle(20, 730, 120, 830))

    ' Add text - requires manual positioning
    Dim header = New TextFragment("Company Report")
    header.TextState.Font = FontRepository.FindFont("Arial")
    header.TextState.FontSize = 24
    header.HorizontalAlignment = HorizontalAlignment.Center
    header.Position = New Position(130, 720)
    page.Paragraphs.Add(header)

    ' Add table - extensive configuration required
    Dim table = New Table With {
        .ColumnWidths = "100 100 100",
        .Border = New BorderInfo(BorderSide.Box, 1.0F, Color.Black),
        .DefaultCellBorder = New BorderInfo(BorderSide.Box, 0.5F, Color.Gray),
        .DefaultCellPadding = New MarginInfo(4.5, 4.5, 4.5, 4.5)
    }

    ' Add header row
    Dim headerRow = table.Rows.Add()
    headerRow.Cells.Add("Name")
    headerRow.Cells.Add("Age")
    headerRow.Cells.Add("City")

    ' Style each header cell individually
    For Each cell As Cell In headerRow.Cells
        cell.BackgroundColor = Color.LightGray
        cell.DefaultCellTextState.FontSize = 12
    Next

    ' Add data row
    Dim dataRow = table.Rows.Add()
    dataRow.Cells.Add("John Doe")
    dataRow.Cells.Add("30")
    dataRow.Cells.Add("New York")

    page.Paragraphs.Add(table)

    ' Save document
    document.Save("Report.pdf")
End Using
$vbLabelText   $csharpLabel

Możesz zauważyć, że kod wymagańy przez Aspose.PDF do tworzenia nowych dokumentów PDF jest bardzo skomplikówany. Musisz ręcznie ustawiać każdą współrzędną w samym kodzie. Musisz ręcznie stylizować każdy element obiektu PDF, co jest bardzo czasochłonne i niewydajne. Jednak zapewnia szczegółową kontrolę nad dokumentami PDF.

Licencja

Aspose.PDF ma wiele opcji licencyjnych, ale większość z nich to "pay-as-you-go". Cena licencji zaczyna się od $1679. Jest to bardzo kosztowne w porównaniu z opcjami licencji IronPDF (rozpoczynającymi się od $1,999).

Csharp Pdf Libraries Tool 2 related to Licencja

3. iTextSuite for .NET

iTextSuite (powszechnie znany jako iText7 & iTextSharp) to SDK do tworzenia PDF oferowany przez Apryse. Jest to kompleksowy zestaw, który zawiera wszystkie niezbędne narzędzia, których potrzebujemy do wykonywania operacji na PDFach w aplikacjach .NET. Podobnie do powyższych bibliotek, możesz tworzyć, edytować, redagować, szyfrować i wykonywać wiele innych operacji na dokumentach PDF.

iTextSuite radzi sobie ze wszystkimi zadaniami związanymi z tworzeniem i edycją PDFów bardzo dobrze, niezależnie czy chodzi o tworzenie prostych faktur, czy wymaga złożonych układów raportów dotyczących modułów finansowych. Nie jest również ciężki dla systemu i może działać bezproblemowo z ciężkimi dokumentami. Przetwarza dokumenty szybko i daje wyniki bez znaczących opóźnień.

Obok wszystkich tych dobrych funkcji, są także pewne wady iTextSuite, które powinieneś znać, zanim rozważysz tę bibliotekę. Koszt tej biblioteki jest podobno bardzo wysoki w porównaniu do innych alternatyw obecnych na rynku. Jej oryginalna cena nie jest dostępna na stronie z cennikiem. Musisz skontaktować się z działem obsługi klienta, aby uzyskać wycenę. Oferuje również licencję AGPL, ale wymaga, aby twój produkt był open source, jeśli używasz iTextSuite na licencji AGPL. Podobnie jak Aspose, ma także stromą krzywą uczenia się i nie jest przyjazna dla początkującego użytkownika. Zaawansowana manipulacja PDF wymaga szczegółowego zrozumieniuiuiuiuia struktur PDF i samej biblioteki.

Przykład kodu

Tworzenie Tabeli w dokumencie PDF ze Stylizacją i Kolorami

using iText.Kernel.Colors;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public void CreateStyledTable(string dest)
{
    using var writer = new PdfWriter(dest);
    using var pdf = new PdfDocument(writer);
    var document = new Document(pdf);

    // Create a 2-column table
    Table table = new Table(2, false);

    // Header cells with gray background
    Cell cell11 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("State"));

    Cell cell12 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Capital"));

    // Data cells
    Cell cell21 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("New York"));

    Cell cell22 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Albany"));

    Cell cell31 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("New Jersey"));

    Cell cell32 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Trenton"));

    // Add all cells to table
    table.AddCell(cell11);
    table.AddCell(cell12);
    table.AddCell(cell21);
    table.AddCell(cell22);
    table.AddCell(cell31);
    table.AddCell(cell32);

    document.Add(table);
    document.Close();
}
using iText.Kernel.Colors;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public void CreateStyledTable(string dest)
{
    using var writer = new PdfWriter(dest);
    using var pdf = new PdfDocument(writer);
    var document = new Document(pdf);

    // Create a 2-column table
    Table table = new Table(2, false);

    // Header cells with gray background
    Cell cell11 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("State"));

    Cell cell12 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Capital"));

    // Data cells
    Cell cell21 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("New York"));

    Cell cell22 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Albany"));

    Cell cell31 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("New Jersey"));

    Cell cell32 = new Cell(1, 1)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Trenton"));

    // Add all cells to table
    table.AddCell(cell11);
    table.AddCell(cell12);
    table.AddCell(cell21);
    table.AddCell(cell22);
    table.AddCell(cell31);
    table.AddCell(cell32);

    document.Add(table);
    document.Close();
}
Imports iText.Kernel.Colors
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Layout.Properties

Public Sub CreateStyledTable(dest As String)
    Using writer As New PdfWriter(dest)
        Using pdf As New PdfDocument(writer)
            Dim document As New Document(pdf)

            ' Create a 2-column table
            Dim table As New Table(2, False)

            ' Header cells with gray background
            Dim cell11 As New Cell(1, 1)
            cell11.SetBackgroundColor(ColorConstants.GRAY) _
                  .SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("State"))

            Dim cell12 As New Cell(1, 1)
            cell12.SetBackgroundColor(ColorConstants.GRAY) _
                  .SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("Capital"))

            ' Data cells
            Dim cell21 As New Cell(1, 1)
            cell21.SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("New York"))

            Dim cell22 As New Cell(1, 1)
            cell22.SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("Albany"))

            Dim cell31 As New Cell(1, 1)
            cell31.SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("New Jersey"))

            Dim cell32 As New Cell(1, 1)
            cell32.SetTextAlignment(TextAlignment.CENTER) _
                  .Add(New Paragraph("Trenton"))

            ' Add all cells to table
            table.AddCell(cell11)
            table.AddCell(cell12)
            table.AddCell(cell21)
            table.AddCell(cell22)
            table.AddCell(cell31)
            table.AddCell(cell32)

            document.Add(table)
            document.Close()
        End Using
    End Using
End Sub
$vbLabelText   $csharpLabel

Z powyższego przykładu możesz zrozumieć złożoność kodu dla iTextSuite. Zwiększa to czas na rozwój i złożoność dla budowania dużych aplikacji.

Licencja

iTextSuite oferuje dwa modele licencji. Jeden to komercyjna, a drugi to licencja AGPL. Możesz używać iTextSuite w produkcji za darmo na podstawie licencji AGPL, ale będziesz musiał także otworzyć kod źródłowy swojego produktu. W odniesieniu do licencji komercyjnej, na stronie licencyjnej nie ma podanej ceny. Będziesz musiał poprosić o wycenę lub skontaktować się z obsługą klienta.

Csharp Pdf Libraries Tool 3 related to Licencja

4. PDFSharp

PDFSharp to C# open-source rozwiązanie dla problemów z PDF, z którymi programiści stykają się podczas programowego przetwarzania dokumentów PDF. Obsługuje najnowsze frameworki .NET, w tym także .NET Core. To lekkie rozwiązanie, które pokrywa wszystkie podstawowe potrzeby programisty odnośnie PDFów.

PDFSharp potrafi radzić sobie z większością typowych operacji na PDFach z łatwością. Możesz tworzyć dokumenty, wstawiać obrazy, rysować kształty i edytować czcionki oraz rozmiary tekstu. Możesz umieścić cokolwiek na dowolnej pozycji, ponieważ PDFSharp daje ci pełną kontrolę nad PDFem.

Jednak PDFSharp ma pewne ograniczenia, które powinieneś znać. Nie obsługuje konwersji HTML na PDF natywnie, co jest dużą wadą dla programistów, ponieważ HTML ułatwia stylizację i pozycjonowanie w PDFach. Jego wydajność jest ograniczona, gdy musi przetworzyć wiele dużych plików. Nie możesz wykonywać skomplikówanych operacji jak szyfrowanie i wypełnianie formularzy. I brakuje mu oficjalnych kanałów wsparcia. Polegasz tylko na społeczności lub swoich własnych umiejętnościach rozwiązywania problemów, jeśli napotkasz jakieś trudności pracując z tą biblioteką.

Przykład kodu

Tworzenie PDF z wieloma stylami tekstu

using PdfSharp.Pdf;
using PdfSharp.Drawing;

// Create document
PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);

// Example of different font styles
XFont regularFont = new XFont("Arial", 12, XFontStyleEx.Regular);
XFont boldFont = new XFont("Arial", 12, XFontStyleEx.Bold);
XFont italicFont = new XFont("Arial", 12, XFontStyleEx.Italic);
XFont boldItalicFont = new XFont("Arial", 12, XFontStyleEx.BoldItalic);

// Position for the first text
double y = 50;
double x = 50;
double lineHeight = 20;

// Draw text in different styles - REQUIRES manual positioning
gfx.DrawString("Regular text in Arial", regularFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Bold text in Arial", boldFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Italic text in Arial", italicFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Bold and Italic text in Arial", boldItalicFont, XBrushes.Black, x, y);

// Save document
document.Save("FormattedText.pdf");
using PdfSharp.Pdf;
using PdfSharp.Drawing;

// Create document
PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);

// Example of different font styles
XFont regularFont = new XFont("Arial", 12, XFontStyleEx.Regular);
XFont boldFont = new XFont("Arial", 12, XFontStyleEx.Bold);
XFont italicFont = new XFont("Arial", 12, XFontStyleEx.Italic);
XFont boldItalicFont = new XFont("Arial", 12, XFontStyleEx.BoldItalic);

// Position for the first text
double y = 50;
double x = 50;
double lineHeight = 20;

// Draw text in different styles - REQUIRES manual positioning
gfx.DrawString("Regular text in Arial", regularFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Bold text in Arial", boldFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Italic text in Arial", italicFont, XBrushes.Black, x, y);
y += lineHeight;
gfx.DrawString("Bold and Italic text in Arial", boldItalicFont, XBrushes.Black, x, y);

// Save document
document.Save("FormattedText.pdf");
Imports PdfSharp.Pdf
Imports PdfSharp.Drawing

' Create document
Dim document As New PdfDocument()
Dim page As PdfPage = document.AddPage()
Dim gfx As XGraphics = XGraphics.FromPdfPage(page)

' Example of different font styles
Dim regularFont As New XFont("Arial", 12, XFontStyleEx.Regular)
Dim boldFont As New XFont("Arial", 12, XFontStyleEx.Bold)
Dim italicFont As New XFont("Arial", 12, XFontStyleEx.Italic)
Dim boldItalicFont As New XFont("Arial", 12, XFontStyleEx.BoldItalic)

' Position for the first text
Dim y As Double = 50
Dim x As Double = 50
Dim lineHeight As Double = 20

' Draw text in different styles - REQUIRES manual positioning
gfx.DrawString("Regular text in Arial", regularFont, XBrushes.Black, x, y)
y += lineHeight
gfx.DrawString("Bold text in Arial", boldFont, XBrushes.Black, x, y)
y += lineHeight
gfx.DrawString("Italic text in Arial", italicFont, XBrushes.Black, x, y)
y += lineHeight
gfx.DrawString("Bold and Italic text in Arial", boldItalicFont, XBrushes.Black, x, y)

' Save document
document.Save("FormattedText.pdf")
$vbLabelText   $csharpLabel

PDFSharp pozostaje solidnym wyborem dla programistów, którzy potrzebują lekkiego, darmowego rozwiązania do podstawowego generowania PDFów z precyzyjną kontrolą pozycjonowania. Bądź tylko przygotowany na obejście jego ograniczeń lub połączenie go z innymi narzędziami do bardziej zaawansowanych wymagań.

Licencja

PDFSharp jest dystrybuowany na licencji MIT i jest całkowicie darmowy do użycia. Po prostu musisz dołączyć oryginalne zawiadomienie o prawach autorskich i wspomnieć licencję w swojej dystrybucji.

5. PDFPig

PDFPig to kolejna biblioteka open source zbudowana dla deweloperów .NET, która pozwala na odczytywanie i wyodrębnianie zawartości z plików PDF. Ta biblioteka wyodrębnia pozycję i rozmiar pojedynczych liter z dokumentów PDF. Odzyskuje obrazy, odczytuje adnotacje PDF i formularze, uzyskuje dostęp do hiperłączy i ujawnia osadzone dokumenty. Możesz także uzyskać dostęp do metadanych dokumentu i przeglądać wewnętrzną strukturę PDF.

Biblioteka wypada dobrze w benchmarkach w porównaniu do podobnych narzędzi dla .NET i efektywnie wykorzystuje pamięć. Oferuje bezpłatną alternatywę dla opcji komercyjnych. Otrzymuje regularne aktualizacje i posiada aktywną dokumentację na GitHubie.

Biblioteka ma wyraźne ograniczenia, które powinieneś znać. Nie konwertuje HTML ani innych formatów na PDF. Nie może generować obrazów z stron PDF, chociaż oddzielne narzędzia, takie jak docnet lub PDFtoImage, mogą wypełnić tę lukę. Formularze PDF są tylko do odczytu; nie możesz modyfikować ani dodawać wartości formularzy. Dla wyodrębniania tabel potrzebujesz zewnętrznych narzędzi, takich jak Tabula Sharp lub Camelot Sharp. Nie możesz dodawać ani edytować hiperłączy podczas tworzenia dokumentów. W porównaniu do bardziej kompleksowych bibliotek, takich jak IronPDF, PDFPig oferuje mniej funkcji i mniej obszerną dokumentację.

Przykład kodu

Podstawowe wyodrębnianie tekstu

using System;
using System.Collections.Generic;
using System.Linq;
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;

public static class Program
{
    public static void Main()
    {
        using (PdfDocument document = PdfDocument.Open(@"C:\path\to\file.pdf"))
        {
            foreach (Page page in document.GetPages())
            {
                // Extract all letters
                IReadOnlyList<Letter> letters = page.Letters;
                string text = string.Join(string.Empty, letters.Select(x => x.Value));

                // Extract words
                IEnumerable<Word> words = page.GetWords();

                // Extract images
                IEnumerable<IPdfImage> images = page.GetImages();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;

public static class Program
{
    public static void Main()
    {
        using (PdfDocument document = PdfDocument.Open(@"C:\path\to\file.pdf"))
        {
            foreach (Page page in document.GetPages())
            {
                // Extract all letters
                IReadOnlyList<Letter> letters = page.Letters;
                string text = string.Join(string.Empty, letters.Select(x => x.Value));

                // Extract words
                IEnumerable<Word> words = page.GetWords();

                // Extract images
                IEnumerable<IPdfImage> images = page.GetImages();
            }
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports UglyToad.PdfPig
Imports UglyToad.PdfPig.Content

Public Module Program
    Public Sub Main()
        Using document As PdfDocument = PdfDocument.Open("C:\path\to\file.pdf")
            For Each page As Page In document.GetPages()
                ' Extract all letters
                Dim letters As IReadOnlyList(Of Letter) = page.Letters
                Dim text As String = String.Join(String.Empty, letters.Select(Function(x) x.Value))

                ' Extract words
                Dim words As IEnumerable(Of Word) = page.GetWords()

                ' Extract images
                Dim images As IEnumerable(Of IPdfImage) = page.GetImages()
            Next
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

Licencja

PDFPig jest dystrybuowany na licencji Apache 2.0, która wymaga jedynie dołączenia oryginalnego zawiadomienia o prawach autorskich i tekstu licencji w swoich dystrybucjach. Poza tym wymaganiem, jesteś całkowicie wolny używać tej biblioteki w dowolny sposób.

Wnioski

Podsumowując, porównajmy modele cenowe i licencyjne tych bibliotek PDF dla C#.

IronPDF oferuje elastyczne plany cenowe odpowiednie zarówno dla osób indywidualnych, jak i firm. Jest darmowy do celów deweloperskich i zawiera bezpłatną wersję próbną. Cena jest bardzo rozsądna, zaczynając się od tylko $1,999. Dzięki swojemu kompleksowemu zestawowi funkcji, doskonałemu wsparciu i stabilności gotowej do produkcji, IronPDF zapewnia najlepszą wartość za pieniądze.

Aspose.PDF podąża za modelem "pay-as-you-go" z licencjami rozpoczynającymi się od $1679, i jest znacznie droższy niż alternatywy. Chociaż oferuje szczegółową kontrolę, stroma krzywa uczenia się i wysokie koszty mogą nie odpowiadać wszystkim budżetom.

iTextSuite nie publikuje przejrzystych cen na swojej stronie internetowej. Musisz skontaktować się z ich zespołem wsparcia, aby uzyskać wycenę, co oznacza, że ceny różnią się w zależności od przypadku. Oferują bezpłatną licencję AGPL, ale wymaga to otwarcia kodu źródłowego całego produktu.

PDFSharp i PDFPig są całkowicie darmowe na licencjach MIT i Apache 2.0, odpowiednio. Jednak ich funkcjonalność jest ograniczona w porównaniu z opcjami komercyjnymi. PDFSharp brakuje konwersji HTML na PDF i ma trudności z dużymi plikami, podczas gdy PDFPig jest głównie biblioteką tylko do odczytu.

Wybór odpowiedniej biblioteki PDF zależy od twoich specyficznych potrzeb i budżetu. Jeśli potrzebujesz podstawowych operacji i posiadasz doświadczenie techniczne, opcje open source sprawdzają się dobrze. Jednakże, dla zaawansowanych funkcji, aplikacji bogatych w funkcje wymagających zaawansowanych funkcji, niezawodnego wsparcia i obszernej dokumentacji, IronPDF wyróżnia się jako najbardziej opłacalne i pełne funkcji rozwiązanie.