Przejdź do treści stopki
PORóWNANIA PRODUKTóW

Biblioteka PDFA w języku C# (lista porównawcza dla programistów .NET)

Jako programista C# często napotykałem trudności podczas generowania i edycji plików PDF w moich projektach. Potrzeba wydajnych, niezawodnych i łatwych do zintegrowania rozwiązań do obsługi plików PDF jest powszechnym problemem w naszej branży. Dlatego postanowiłem przyjrzeć się APITemplate i IronPDF, dwóm popularnym narzędziom, które obiecują uproszczenie zadań związanych z plikami PDF w aplikacjach napisanych w języku C#.

W tym artykułe podzielę się moimi praktycznymi doświadczeniami z APITemplate i IronPDF, porównując ich funkcje, wydajność i możliwości integracji. Moim celem jest dostarczenie Państwu jasnej, obiektywnej analizy, która pomoże Państwu podjąć świadomą decyzję dotyczącą kolejnego projektu. Kiedy po raz pierwszy zetknąłem się z APITemplate i IronPDF, zaintrygował mnie ich potencjał w zakresie rozwiązywania problemów związanych z plikami PDF w programowaniu w języku C#. Przyjrzyjmy się, co oferuje każde z tych narzędzi.

APITemplate

Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 1

APITemplate to usługa oparta na chmurze, która koncentruje się na generowaniu plików PDF i obrazów na podstawie szablonów. Zapewnia interfejs API, który pozwala programistom tworzyć dokumenty i grafiki poprzez wysyłanie danych JSON do predefiniowanych szablonów. Podczas wstępnych testów stwierdziłem, że APITemplate jest prosty w użyciu. Mogłem utworzyć szablon za pomocą ich interfejsu internetowego, a następnie użyć ich API, aby wypełnić go danymi z mojej aplikacji C#.

Kluczowe cechy APITemplate

Generowanie oparte na szablonach

Główną zaletą APITemplate jest podejście oparte na szablonach. Potrafię tworzyć szablony dokumentów i obrazów, które można ponownie wykorzystać, co pozwala mi zaoszczędzić mnóstwo czasu przy powtarzalnych zadaniach. Oferuje również edytor szablonów Markdown do generowania plików PDF. Możesz generować pliki PDF z gotowych szablonów zintegrowanych z Zapier i innymi narzędziami zewnętrznymi.

Integracja danych JSON

Integracja danych JSON to jedna z funkcji, z której często korzystam. Daje to możliwość wypełniania szablonów danymi JSON. Dzięki temu integracja z moimi aplikacjami C# jest niezwykle łatwa, ponieważ mogę serializować moje obiekty do formatu JSON i wysyłać je do API.

Konsola API

Funkcja konsoli API pozwoliła mi zaoszczędzić sporo czasu. Dzięki temu mogę przeglądać i testować wywołania API bezpośrednio z ich strony internetowej, co pomaga mi debugować i dopracowywać moje żądania przed wdrożeniem ich w moim kodzie C#.

Konfigurowalne nagłówki i stopki

Możliwość dodawania niestandardowych nagłówków i stopek do moich plików PDF okazała się bardzo przydatna, zwłaszcza podczas tworzenia profesjonalnych raportów lub faktur. Mogę z łatwością uwzględnić numery stron, daty lub logo firm.

IronPDF

Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 2

Z kolei IronPDF to biblioteka .NET zaprojektowana specjalnie do manipulacji plikami PDF w aplikacjach napisanych w języku C#. Oferuje szeroki zakres funkcji, w tym tworzenie, edycję i konwersję plików PDF. Jedną z jego wyróżniających się funkcji jest możliwość generowania plików PDF z HTML, co może być niezwykle przydatne w przypadku aplikacji internetowych.

Moje pierwsze doświadczenie z IronPDF polegało na zainstalowaniu go za pośrednictwem NuGet i zintegrowaniu bezpośrednio z moim projektem C#. Proces integracji API przebiega bardzo płynnie, co oznacza, że mogłem błyskawicznie uruchomić to narzędzie w moich projektach. Byłem pod wrażeniem tego, jak łatwo mogłem tworzyć pliki PDF programowo, bez konieczności korzystania z usług zewnętrznych.

Kluczową różnicą, jaką zauważyłem, jest to, że APITemplate doskonale sprawdza się w tworzeniu dokumentów na podstawie predefiniowanych szablonów, podczas gdy IronPDF oferuje większą elastyczność w zakresie niestandardowej manipulacji plikami PDF w kodzie C#. Dzięki temu, że APITemplate działa w chmurze, nie musisz martwić się o zasoby serwera do generowania plików PDF, ale potrzebujesz połączenia z internetem. IronPDF, jako biblioteka lokalna, może działać w trybie offline, ale wykorzystuje zasoby serwera.

Najważniejsze cechy IronPDF

Tworzenie plików PDF z HTML

IronPDF doskonale sprawdza się w generowaniu plików PDF z treści HTML. Korzystałem z tej funkcji na szeroką skalę do dynamicznego tworzenia raportów i dokumentów. Wystarczy po prostu przekazać do biblioteki ciągi HTML lub nawet adresy URL. Szerokie wsparcie IronPDF dla nowoczesnych standardów internetowych sprawiło, że każdy plik PDF wygenerowany przeze mnie z treści HTML był dokumentem wysokiej jakości.

Manipulacja plikami PDF

Ta funkcja pozwala mi edytować istniejące pliki PDF programowo. Mogę dodawać tekst, obrazy, a nawet nowe strony do dokumentów PDF, co jest niezwykle przydatne przy aktualizowaniu raportów lub formularzy.

Łączenie i dzielenie plików PDF

Ta funkcja okazała się dla mnie szczególnie przydatna podczas pracy z dużymi dokumentami. IronPDF ułatwia łączenie wielu plików PDF w jeden lub dzielenie pojedynczego pliku PDF na kilka plików.

Wyodrębnianie tekstu

Kiedy potrzebuję wyodrębnić treść tekstową z plików PDF w celu analizy lub indeksowania, przydają się funkcje ekstrakcji tekstu programu IronPDF. Dobrze radzi sobie z różnymi układami plików PDF, dzięki czemu wyciąganie danych jest dziecinnie proste.

Wypełnianie formularzy

W przypadku projektów związanych z automatycznym wypełnianiem formularzy bardzo przydatna jest funkcja wypełniania formularzy IronPDF. Mogę wypełniać formularze PDF programowo i zaoszczędzić czas na ręcznym wprowadzaniu danych.

Podpisy cyfrowe

W wielu moich projektach bezpieczeństwo ma kluczowe znaczenie. IronPDF pozwala mi dodawać podpisy cyfrowe do plików PDF, zwiększając autentyczność i bezpieczeństwo dokumentów.

Ochrona hasłem

W przypadku dokumentów wrażliwych używam IronPDF do dodawania ochrony hasłem do plików PDF. Jest to niezwykle pomocne w zapewnieniu bezpieczeństwa moich poufnych informacji.

Konwersja plików PDF na obrazy

Czasami muszę konwertować strony PDF na obrazy w celu wyświetlenia podglądu lub miniatur. IronPDF sprawia, że proces ten jest prosty, wymaga ode mnie tylko kilku linii kodu i obsługuje różne formaty obrazów.

Kompatybilność międzyplatformowa

Jako programista .NET pracujący nad projektami wielopłatformowymi doceniam to, że IronPDF działa płynnie na różnych systemach operacyjnych dzięki obsłudze .NET Standard.

Konfiguracja IronPDF i APITemplate dla Twojego projektu C

Konfiguracja tych narzędzi w projekcie C# jest dość prosta. Opiszę proces zarówno dla IronPDF, jak i APITemplate w oparciu o moje doświadczenie.

IronPDF

Aby skonfigurować IronPDF w moich projektach C#, wykonuję następujące kroki:

  1. Otwórz mój projekt w Visual Studio.

  2. Użyj menedżera pakietów NuGet, aby zainstalować IronPDF. Korzystam albo z menedżera pakietów NuGet, albo z konsoli menedżera pakietów.

    1. W menedżerze pakietów NuGet wyszukaj IronPDF i zainstaluj go.

    Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 3

    1. Alternatywnie, w konsoli menedżera pakietów uruchamiam:
    Install-Package IronPdf

    Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 4

  3. Po instalacji dodaję niezbędną instrukcję using na początku pliku C#:

    using IronPdf;
    using IronPdf;
    Imports IronPdf
    $vbLabelText   $csharpLabel
  4. Aby aktywować licencję, dodaję ten wiersz na początku uruchamiania mojej aplikacji:

    IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
    IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
    IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
    $vbLabelText   $csharpLabel

To wszystko! Teraz mogę zacząć używać IronPDF w moim kodzie.

APITemplate

W przypadku APITemplate proces konfiguracji jest nieco inny, ponieważ jest to API oparte na sieci WWW:

  1. Najpierw zakładam konto APITemplate na ich stronie internetowej.
  2. Po zarejestrowaniu się przechodzę do sekcji API, aby uzyskać swój klucz API.
  3. W moim projekcie C# nie muszę instalować żadnego konkretnego pakietu. Zazwyczaj używam wbudowanego HttpClient do wykonywania wywołań API.

  4. Przechowuję klucz API w bezpieczny sposób. Podczas pracy mogę używać tajnych danych użytkownika:

    dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
    dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
    SHELL
  5. W moim kodzie skonfigurowałem HttpClient przy użyciu klucza API:

    using System.Net.Http;
    using System.Net.Http.Headers;
    
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);
    Imports System.Net.Http
    Imports System.Net.Http.Headers
    
    Private client = New HttpClient()
    client.DefaultRequestHeaders.Add("X-API-KEY", Configuration("APITemplate:ApiKey"))
    $vbLabelText   $csharpLabel
  6. Teraz jestem gotowy do wysyłania wywołań API do APITemplate.

W tym projekcie wykorzystam oficjalny przykładowy projekt APITemplate z serwisu GitHub, który jest już skonfigurowany i wystarczy tylko dodać klucz szablonu. Po zakończeniu tych przygotowań mogę zacząć używać zarówno IronPDF, jak i APITemplate w moich projektach C#. IronPDF działa lokalnie w mojej aplikacji, natomiast APITemplate wymaga połączenia z Internetem w celu komunikacji ze swoimi serwerami.

Zaawansowane funkcje w IronPDF w porównaniu z APITemplate

Jako programista C# miałem okazję zapoznać się zarówno z IronPDF, jak i APITemplate. Przyjrzyjmy się niektórym z ich zaawansowanych funkcji, które zrobiły na mnie wrażenie.

Zaawansowane funkcje IronPDF

Konwersja HTML do PDF z obsługą JavaScript

Konwersja HTML na PDF w IronPDF robi wrażenie. Nie tylko renderuje statyczny HTML — obsługuje również JavaScript. Było to dla mnie znaczącą zaletą podczas pracy z dynamiczną treścią internetową.

Oto krótki przykład, jak z tego korzystam:

var Renderer = new ChromePdfRenderer();
string htmlContent = @"
    <html>
    <body>
        <h1>Dynamic Chart</h1>
        <canvas id='myChart'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
        <script>
            var ctx = document.getElementById('myChart').getContext('2d');
            new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                    datasets: [{
                        label: '# of Votes',
                        data: [12, 19, 3, 5, 2, 3],
                        backgroundColor: [
                            'rgba(255, 99, 132, 0.2)',
                            'rgba(54, 162, 235, 0.2)',
                            'rgba(255, 206, 86, 0.2)',
                            'rgba(75, 192, 192, 0.2)',
                            'rgba(153, 102, 255, 0.2)',
                            'rgba(255, 159, 64, 0.2)'
                        ],
                        borderColor: [
                            'rgba(255, 99, 132, 1)',
                            'rgba(54, 162, 235, 1)',
                            'rgba(255, 206, 86, 1)',
                            'rgba(75, 192, 192, 1)',
                            'rgba(153, 102, 255, 1)',
                            'rgba(255, 159, 64, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true
                        }
                    }
                }
            });
        </script>
    </body>
    </html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
var Renderer = new ChromePdfRenderer();
string htmlContent = @"
    <html>
    <body>
        <h1>Dynamic Chart</h1>
        <canvas id='myChart'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
        <script>
            var ctx = document.getElementById('myChart').getContext('2d');
            new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                    datasets: [{
                        label: '# of Votes',
                        data: [12, 19, 3, 5, 2, 3],
                        backgroundColor: [
                            'rgba(255, 99, 132, 0.2)',
                            'rgba(54, 162, 235, 0.2)',
                            'rgba(255, 206, 86, 0.2)',
                            'rgba(75, 192, 192, 0.2)',
                            'rgba(153, 102, 255, 0.2)',
                            'rgba(255, 159, 64, 0.2)'
                        ],
                        borderColor: [
                            'rgba(255, 99, 132, 1)',
                            'rgba(54, 162, 235, 1)',
                            'rgba(255, 206, 86, 1)',
                            'rgba(75, 192, 192, 1)',
                            'rgba(153, 102, 255, 1)',
                            'rgba(255, 159, 64, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true
                        }
                    }
                }
            });
        </script>
    </body>
    </html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
Dim Renderer = New ChromePdfRenderer()
Dim htmlContent As String = "
    <html>
    <body>
        <h1>Dynamic Chart</h1>
        <canvas id='myChart'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
        <script>
            var ctx = document.getElementById('myChart').getContext('2d');
            new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                    datasets: [{
                        label: '# of Votes',
                        data: [12, 19, 3, 5, 2, 3],
                        backgroundColor: [
                            'rgba(255, 99, 132, 0.2)',
                            'rgba(54, 162, 235, 0.2)',
                            'rgba(255, 206, 86, 0.2)',
                            'rgba(75, 192, 192, 0.2)',
                            'rgba(153, 102, 255, 0.2)',
                            'rgba(255, 159, 64, 0.2)'
                        ],
                        borderColor: [
                            'rgba(255, 99, 132, 1)',
                            'rgba(54, 162, 235, 1)',
                            'rgba(255, 206, 86, 1)',
                            'rgba(75, 192, 192, 1)',
                            'rgba(153, 102, 255, 1)',
                            'rgba(255, 159, 64, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true
                        }
                    }
                }
            });
        </script>
    </body>
    </html>"
Dim PDF = Renderer.RenderHtmlAsPdf(htmlContent)
PDF.SaveAs("dynamic_chart.pdf")
$vbLabelText   $csharpLabel

Ten kod generuje plik PDF z dynamicznym wykresem przy użyciu Chart.js. Kod JavaScript jest wykonywany podczas procesu tworzenia pliku PDF, w wyniku czego powstaje plik PDF zawierający wyrenderowany wykres. Wykorzystałem to do tworzenia dynamicznych raportów, w których dane często się zmieniają, co oszczędza mi ręcznej aktualizacji wykresów i diagramów.

Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 5

Możliwość dołączania skryptów zewnętrznych, takich jak Chart.js w tym przykładzie, oznacza, że mogę korzystać z potężnych bibliotek JavaScript do tworzenia bogatych, dynamicznych treści w moich plikach PDF. Ponadto ta funkcja pozwala mi na użycie CSS i technik responsywnego projektowania w moim HTML, co gwarantuje, że wynikowy plik PDF będzie wyglądał świetnie na różnych urządzeniach i w różnych formatach PRINT. Wykorzystałem nawet zapytania o media, aby stworzyć pliki PDF zoptymalizowane do wyświetlania na ekranie i drukowania z tego samego źródła HTML.

Szyfrowanie i deszyfrowanie plików PDF

W wielu moich projektach bezpieczeństwo ma kluczowe znaczenie, zwłaszcza w przypadku pracy z poufnymi informacjami. Funkcje szyfrowania i deszyfrowania IronPDF okazały się nieocenione w tych sytuacjach.

var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
Dim pdf = PdfDocument.FromFile("input.pdf")
' Set user password (for opening the document)
pdf.Password = "user_password"
' Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password"
' Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit
pdf.SaveAs("highly_secured.pdf")
$vbLabelText   $csharpLabel

Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 6

Ten kod nie tylko szyfruje plik PDF za pomocą hasła użytkownika, ale także ustawia hasło właściciela z precyzyjną kontrolą uprawnień. Mogę dokładnie określić, co użytkownicy mogą, a czego nie mogą robić z plikiem PDF, np. drukować lub kopiować zawartość.

Do odszyfrowania często stosuję następujące podejście:

try
{
    var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
    pdf.SecuritySettings.RemovePasswordsAndEncryption();
    pdf.SaveAs("decrypted.pdf");
    Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
    Console.WriteLine($"Decryption failed: {ex.Message}");
}
try
{
    var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
    pdf.SecuritySettings.RemovePasswordsAndEncryption();
    pdf.SaveAs("decrypted.pdf");
    Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
    Console.WriteLine($"Decryption failed: {ex.Message}");
}
Try
	Dim pdf = PdfDocument.FromFile("encrypted.pdf", "user_password")
	pdf.SecuritySettings.RemovePasswordsAndEncryption()
	pdf.SaveAs("decrypted.pdf")
	Console.WriteLine("PDF decrypted successfully!")
Catch ex As Exception
	Console.WriteLine($"Decryption failed: {ex.Message}")
End Try
$vbLabelText   $csharpLabel

Ten kod próbuje otworzyć zaszyfrowany plik PDF za pomocą hasła użytkownika, usuwa wszystkie ograniczenia bezpieczeństwa i zapisuje go jako nowy, niezaszyfrowany plik. Blok try-catch pomaga obsłużyć przypadki, w których hasło może być nieprawidłowe.

Korzystałem z tych funkcji w różnych sytuacjach, takich jak tworzenie bezpiecznych systemów zarządzania dokumentami, w których różni użytkownicy mają różne poziomy dostępu do plików PDF. Na przykład w systemie dokumentacji medycznej zadbałem o to, aby poufne informacje o pacjentach były szyfrowane i dostępne wyłącznie dla upoważnionego personelu.

Kompresja plików PDF

W przypadku pracy z dużą liczbą plików PDF kluczowym czynnikiem staje się rozmiar pliku. Funkcja kompresji IronPDF okazała się nieoceniona w zarządzaniu ograniczeniami pamięci masowej i przepustowości.

Oto bardziej zaawansowany przykład tego, jak używam kompresji:

using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;

var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;

var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
Imports IronPdf
Imports System.IO
Imports PdfDocument = IronPdf.PdfDocument

Private PDF = PdfDocument.FromFile("F:/Test.pdf")
' Compress images
PDF.CompressImages(80) ' 80% quality
' Compress fonts
PDF.CompressStructTree()
' Save the compressed PDF
PDF.SaveAs("F:/highly_compressed.pdf")
' Compare file sizes
Dim originalSize = (New FileInfo("F:/Test.pdf")).Length
Dim compressedSize = (New FileInfo("F:/highly_compressed.pdf")).Length
Dim compressionRatio = (1 - CDbl(compressedSize) / originalSize) * 100
Console.WriteLine($"Original size: {originalSize \ 1024} KB")
Console.WriteLine($"Compressed size: {compressedSize \ 1024} KB")
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%")
$vbLabelText   $csharpLabel

Oto wynik:

Porównanie bibliotek PDF dla języka C#: APITemplate io i IronPDF: Rysunek 7

Uważam, że ta kombinacja technik jest bardzo skuteczna w zmniejszaniu rozmiarów plików bez znaczącego wpływu na jakość.

Korzystałem z tej funkcji w różnych sytuacjach:

  1. Załączniki do wiadomości e-mail: Wysyłając pliki PDF pocztą elektroniczną, kompresuję je, aby nie przekroczyły limitów rozmiaru załączników.
  2. Aplikacje internetowe: W przypadku plików PDF, które muszą być pobierane przez użytkowników, kompresja pomaga skrócić czas ładowania i zmniejszyć zużycie przepustowości.
  3. Archiwizacja: W przypadku przechowywania dużej liczby plików PDF w celu długoterminowego przechowywania kompresja znacznie obniża koszty przechowywania.

W ramach jednego z projektów pracowałem nad systemem zarządzania dokumentami dla kancelarii prawnej. Mieli tysiące akt spraw w formacie PDF, z których wiele stanowiły zeskanowane dokumenty o dużych rozmiarach. Wdrażając tę technikę kompresji, osiągnęliśmy znaczne zmniejszenie wymagań dotyczących przechowywania, co prowadzi do znaczących oszczędności kosztów na rachunkach za przechowywanie w chmurze.

Podpisy cyfrowe

Dodawanie podpisów cyfrowych do PDF-ów jest kluczową funkcją dla wielu procesów biznesowych, aby zapewnić autentyczność dokumentu i niezaprzeczalność. IronPDF sprawia, że to skomplikowane zadanie jest zaskakująco proste. Oto bardziej szczegółowy przykład, jak wdrażam podpisy cyfrowe:

using IronPdf;
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
    // Step 3. Optional signing options and a handwritten signature graphic
    SigningContact = "support@ironsoftware.com",
    SigningLocation = "New York, USA",
    SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
using IronPdf;
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
    // Step 3. Optional signing options and a handwritten signature graphic
    SigningContact = "support@ironsoftware.com",
    SigningLocation = "New York, USA",
    SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
Imports IronPdf
Imports IronPdf.Signing

Private renderer = New ChromePdfRenderer()
Private pdf = PdfDocument.FromFile("F:/Contract.pdf")
Private signature = New IronPdf.Signing.PdfSignature("F:/Iron.pfx", "123") With {
	.SigningContact = "support@ironsoftware.com",
	.SigningLocation = "New York, USA",
	.SigningReason = "Signing PDF"
}
pdf.Sign(signature)
pdf.SaveAs("F:/signed.pdf")
$vbLabelText   $csharpLabel

Użyłem tej funkcji w kilku rzeczywistych aplikacjach:

  1. System zarządzania umowami: Wprowadziliśmy to dla firmy, która potrzebowała wysyłać i otrzymywać elektronicznie podpisane umowy. Podpisy cyfrowe zapewniały prawomocność umów.
  2. System rejestracji medycznej: W aplikacji zdrowotnej użyliśmy podpisów cyfrowych, aby umożliwić lekarzom zatwierdzanie kart pacjentów i recept.
  3. Przetwarzanie dokumentów rządowych: Dla agencji rządowej wdrożyliśmy system, w którym oficjalne dokumenty mogły być podpisywane cyfrowo.

Dzielenie i Scalanie PDF

Możliwość dzielenia i scalania PDF-ów to podstawowa funkcjonalność, której często używam w systemach zarządzania dokumentami. Implementacja tych funkcji przez IronPDF jest zarówno potężna, jak i elastyczna. Oto bardziej zaawansowany przykład dzielenia i scalania PDF-ów:

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        // Create first PDF with three pages
        const string html_a = @"
            <h1>Document A</h1>
            <p>This is the first page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 2</h2>
            <p>This is the second page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 3</h2>
            <p>This is the third and final page of Document A.</p>";
        // Create second PDF with two pages
        const string html_b = @"
            <h1>Document B</h1>
            <p>Welcome to the first page of Document B.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document B - Page 2</h2>
            <p>This is the second and last page of Document B.</p>";
        // Render HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
        var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
        // Merge PDFs
        var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
        merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
        Console.WriteLine("Merged PDF created: MergedDocument.pdf");
        // Load the merged PDF
        var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
        // Extract the first page
        var firstPage = pdf.CopyPage(0);
        firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
        Console.WriteLine("First page extracted: FirstPageOnly.pdf");
        // Extract pages 2 to 4 (note: index starts at 0)
        var middlePages = pdf.CopyPages(1, 3);
        middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
        Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
        Console.WriteLine("Process completed. Press any key to exit.");
        Console.ReadKey();
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        // Create first PDF with three pages
        const string html_a = @"
            <h1>Document A</h1>
            <p>This is the first page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 2</h2>
            <p>This is the second page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 3</h2>
            <p>This is the third and final page of Document A.</p>";
        // Create second PDF with two pages
        const string html_b = @"
            <h1>Document B</h1>
            <p>Welcome to the first page of Document B.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document B - Page 2</h2>
            <p>This is the second and last page of Document B.</p>";
        // Render HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
        var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
        // Merge PDFs
        var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
        merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
        Console.WriteLine("Merged PDF created: MergedDocument.pdf");
        // Load the merged PDF
        var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
        // Extract the first page
        var firstPage = pdf.CopyPage(0);
        firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
        Console.WriteLine("First page extracted: FirstPageOnly.pdf");
        // Extract pages 2 to 4 (note: index starts at 0)
        var middlePages = pdf.CopyPages(1, 3);
        middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
        Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
        Console.WriteLine("Process completed. Press any key to exit.");
        Console.ReadKey();
    }
}
Imports IronPdf
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create first PDF with three pages
		Const html_a As String = "
            <h1>Document A</h1>
            <p>This is the first page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 2</h2>
            <p>This is the second page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 3</h2>
            <p>This is the third and final page of Document A.</p>"
		' Create second PDF with two pages
		Const html_b As String = "
            <h1>Document B</h1>
            <p>Welcome to the first page of Document B.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document B - Page 2</h2>
            <p>This is the second and last page of Document B.</p>"
		' Render HTML to PDF
		Dim renderer = New ChromePdfRenderer()
		Dim pdfdoc_a = renderer.RenderHtmlAsPdf(html_a)
		Dim pdfdoc_b = renderer.RenderHtmlAsPdf(html_b)
		' Merge PDFs
		Dim merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b)
		merged.SaveAs("F:/IronPdf/MergedDocument.pdf")
		Console.WriteLine("Merged PDF created: MergedDocument.pdf")
		' Load the merged PDF
		Dim pdf = PdfDocument.FromFile("F:/IronPdf/MergedDocument.pdf")
		' Extract the first page
		Dim firstPage = pdf.CopyPage(0)
		firstPage.SaveAs("F:/IronPdf/FirstPageOnly.pdf")
		Console.WriteLine("First page extracted: FirstPageOnly.pdf")
		' Extract pages 2 to 4 (note: index starts at 0)
		Dim middlePages = pdf.CopyPages(1, 3)
		middlePages.SaveAs("F:/IronPdf/Pages2to4.pdf")
		Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf")
		Console.WriteLine("Process completed. Press any key to exit.")
		Console.ReadKey()
	End Sub
End Class
$vbLabelText   $csharpLabel

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 8

Oto scalony dokument wygenerowany za pomocą kodu:

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 9

Wypełnianie formularzy

Automatyzacja wypełniania formularzy była ogromnym oszczędnością czasu w wielu moich projektach. IronPDF pozwala mi programowo wypełniać formularze PDF, co jest nieocenione w przypadku przetwarzania dużych ilości formularzy lub tworzenia spersonalizowanych dokumentów. Oto bardziej kompleksowy przykład wypełniania formularzy:

using IronPdf;
using System;

// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");

// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";

// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";

// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";

// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
    Console.WriteLine(choice);
}

// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";

// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";

// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
using IronPdf;
using System;

// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");

// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";

// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";

// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";

// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
    Console.WriteLine(choice);
}

// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";

// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";

// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
Imports Microsoft.VisualBasic
Imports IronPdf
Imports System

' Load the combined form
Private pdf As PdfDocument = PdfDocument.FromFile("F:/completeForm.pdf")

' Handle radio buttons
Private radioForm = pdf.Form.FindFormField("traveltype")
radioForm.Value = "Airplane"

' Handle checkbox
Dim checkboxForm = pdf.Form.FindFormField("taskCompleted")
checkboxForm.Value = "Yes"

' Handle combobox
Dim comboboxForm = pdf.Form.FindFormField("priority")
comboboxForm.Value = "Low"

' Print out all the available choices for combobox
For Each choice In comboboxForm.Choices
	Console.WriteLine(choice)
Next choice

' Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John"
pdf.Form.FindFormField("lastname").Value = "Smith"

' Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software" & vbCrLf & "205 N. Michigan Ave."

' Save the edited PDF
pdf.SaveAs("F:/completeFormEdited.pdf")
$vbLabelText   $csharpLabel

Użyłem tej funkcji w kilku rzeczywistych aplikacjach:

  1. System wdrażania pracowników HR: Stworzyliśmy system, który automatycznie wypełniał dokumentację nowego pracownika na podstawie informacji z bazy danych HR, oszczędzając godziny ręcznego wprowadzania danych.

  2. Przetwarzanie roszczeń ubezpieczeniowych: Dla firmy ubezpieczeniowej zbudowaliśmy system, który wstępnie wypełniał formularze roszczeń informacjami o ubezpieczonym, znacznie przyspieszając proces składania roszczeń.

  3. System aplikacji szkolnych: W projekcie edukacyjnym wdrożyliśmy system, który wypełniał formularze aplikacji szkolnych na podstawie danych uczniów, ułatwiając proces aplikacyjny zarówno uczniom, jak i personelowi administracyjnemu.

  4. Generowanie formularzy podatkowych: Dla firmy księgowej stworzyliśmy system, który automatycznie wypełniał formularze podatkowe na podstawie danych finansowych klienta, redukując błędy i oszczędzając czas podczas sezonu podatkowego.

Możliwość programowej zamiany wypełniania formularzy była kluczowym czynnikiem w automatyzacji wielu procesów biznesowych, prowadząc do znacznych oszczędności czasu i redukcji błędów związanych z ręcznym wprowadzaniem danych.

Znakowanie wodne

Dodawanie znaków wodnych do PDF-ów jest często konieczne dla brandingu, bezpieczeństwa lub wskazania statusu. IronPDF oferuje elastyczne możliwości znakowania wodnego, które okazały się przydatne w wielu projektach. Oto bardziej szczegółowy przykład, jak używam znakowania wodnego:

using IronPdf;
using IronSoftware.Drawing;

string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");

// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&amp;Rotation.pdf");
using IronPdf;
using IronSoftware.Drawing;

string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");

// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&amp;Rotation.pdf");
Imports IronPdf
Imports IronSoftware.Drawing

Private watermarkHtml As String = "
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>"

Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>")

' Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation:= 30, opacity:= 90)
pdf.SaveAs("watermarkOpacity&amp;Rotation.pdf")
$vbLabelText   $csharpLabel

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 10

Zaawansowane funkcje APITemplate

Dynamiczne generowanie szablonów

Dynamiczne generowanie szablonów przez APITemplate to potężna funkcja, która pozwala na tworzenie wysoce spersonalizowanych dokumentów przy użyciu niestandardowych danych JSON. Wsparcie API APITemplate dynamicznych komponentów. Możesz uzyskać zarówno wyjścia PDF, jak i obrazów z twojego kodu. W konsoli API mogłem swobodnie używać edytora WYSIWYG do generowania dokumentów PDF.

Odkryjmy, jak to wykorzystałem w moich projektach.

using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "bf077b23b4a407ae";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var data = new
            {
                date = "15/05/2022",
                invoice_no = "435568799",
                sender_address1 = "3244 Jurong Drive",
                sender_address2 = "Falmouth Maine 1703",
                sender_phone = "255-781-6789",
                sender_email = "dev@ironsoftware.com",
                rece_addess1 = "2354 Lakeside Drive",
                rece_addess2 = "New York 234562 ",
                rece_phone = "34333-84-223",
                rece_email = "info@ironsoftware.com",
                items = new[]
                {
                    new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
                    new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
                    new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
                },
                total = "total",
                footer_email = "info@ironsoftware.com"
            };
            var json_content = JsonSerializer.Serialize(data);
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/generated_document.pdf");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
                Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "bf077b23b4a407ae";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var data = new
            {
                date = "15/05/2022",
                invoice_no = "435568799",
                sender_address1 = "3244 Jurong Drive",
                sender_address2 = "Falmouth Maine 1703",
                sender_phone = "255-781-6789",
                sender_email = "dev@ironsoftware.com",
                rece_addess1 = "2354 Lakeside Drive",
                rece_addess2 = "New York 234562 ",
                rece_phone = "34333-84-223",
                rece_email = "info@ironsoftware.com",
                items = new[]
                {
                    new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
                    new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
                    new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
                },
                total = "total",
                footer_email = "info@ironsoftware.com"
            };
            var json_content = JsonSerializer.Serialize(data);
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/generated_document.pdf");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
                Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
            }
        }
    }
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks

Namespace csharp
	Friend Class ReturnContent
		Public Property download_url() As String
		Public Property status() As String
	End Class

	Friend Class Program
		Shared Async Function Main(ByVal args() As String) As Task
			Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
			Dim template_id = "bf077b23b4a407ae"
			Dim url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}"
			Dim data = New With {
				Key .date = "15/05/2022",
				Key .invoice_no = "435568799",
				Key .sender_address1 = "3244 Jurong Drive",
				Key .sender_address2 = "Falmouth Maine 1703",
				Key .sender_phone = "255-781-6789",
				Key .sender_email = "dev@ironsoftware.com",
				Key .rece_addess1 = "2354 Lakeside Drive",
				Key .rece_addess2 = "New York 234562 ",
				Key .rece_phone = "34333-84-223",
				Key .rece_email = "info@ironsoftware.com",
				Key .items = {
					New With {
						Key .item_name = "Oil",
						Key .unit = 1,
						Key .unit_price = 100,
						Key .total = 100
					},
					New With {
						Key .item_name = "Rice",
						Key .unit = 2,
						Key .unit_price = 200,
						Key .total = 400
					},
					New With {
						Key .item_name = "Orange",
						Key .unit = 7,
						Key .unit_price = 20,
						Key .total = 1400
					}
				},
				Key .total = "total",
				Key .footer_email = "info@ironsoftware.com"
			}
			Dim json_content = JsonSerializer.Serialize(data)
			Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
			Dim byteContent = New ByteArrayContent(buffer)
			Console.WriteLine(json_content)
			Dim client = New HttpClient()
			client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
			Dim response = Await client.PostAsync(url, byteContent)
			Dim ret = Await response.Content.ReadAsStringAsync()
			Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
			If returnContent.status = "success" Then
				Console.WriteLine($"Downloading {returnContent.download_url}...")
				Dim download_response = Await client.GetAsync(returnContent.download_url)
				Using stream = Await download_response.Content.ReadAsStreamAsync()
					Dim fileInfo As New FileInfo("F:/generated_document.pdf")
					Using fileStream = fileInfo.OpenWrite()
						Await stream.CopyToAsync(fileStream)
					End Using
				End Using
				Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'")
			End If
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 11

To jest wygenerowany dokument PDF:

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 12

Generowanie PDF w partii

Funkcja masowego generowania PDF w APITemplate to istotna zaleta, gdy chodzi o tworzenie wielu dokumentów w jednej wywołania API. Oto bardziej szczegółowy przykład, jak to wykorzystałem:

using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "d4f77b23b4ab09fa";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var membershipCards = new List<object>
            {
                new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
                new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
                new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
            };
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            for (int i = 0; i < membershipCards.Count; i++)
            {
                var json_content = JsonSerializer.Serialize(membershipCards[i]);
                var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
                var byteContent = new ByteArrayContent(buffer);
                Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
                var response = await client.PostAsync(url, byteContent);
                var ret = await response.Content.ReadAsStringAsync();
                var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
                if (returnContent.status == "success")
                {
                    Console.WriteLine($"Downloading {returnContent.download_url}...");
                    var download_response = await client.GetAsync(returnContent.download_url);
                    using (var stream = await download_response.Content.ReadAsStreamAsync())
                    {
                        var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
                        using (var fileStream = fileInfo.OpenWrite())
                        {
                            await stream.CopyToAsync(fileStream);
                        }
                    }
                    Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
                }
                else
                {
                    Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "d4f77b23b4ab09fa";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var membershipCards = new List<object>
            {
                new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
                new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
                new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
            };
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            for (int i = 0; i < membershipCards.Count; i++)
            {
                var json_content = JsonSerializer.Serialize(membershipCards[i]);
                var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
                var byteContent = new ByteArrayContent(buffer);
                Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
                var response = await client.PostAsync(url, byteContent);
                var ret = await response.Content.ReadAsStringAsync();
                var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
                if (returnContent.status == "success")
                {
                    Console.WriteLine($"Downloading {returnContent.download_url}...");
                    var download_response = await client.GetAsync(returnContent.download_url);
                    using (var stream = await download_response.Content.ReadAsStreamAsync())
                    {
                        var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
                        using (var fileStream = fileInfo.OpenWrite())
                        {
                            await stream.CopyToAsync(fileStream);
                        }
                    }
                    Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
                }
                else
                {
                    Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
                }
            }
        }
    }
}
'INSTANT VB NOTE: 'Option Strict Off' is used here since dynamic typing is used:
Option Strict Off

Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks
Imports System.Collections.Generic

Namespace csharp
	Friend Class ReturnContent
		Public Property download_url() As String
		Public Property status() As String
	End Class

	Friend Class Program
		Shared Async Function Main(ByVal args() As String) As Task
			Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
			Dim template_id = "d4f77b23b4ab09fa"
			Dim url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}"
			Dim membershipCards = New List(Of Object) From {
				New With {
					Key .name = "Iron Dev 1",
					Key .email = "dev1@ironsoftware.com",
					Key .membership_id = "M001",
					Key .expiry_date = "2024-12-31"
				},
				New With {
					Key .name = "Iron Dev 2",
					Key .email = "dev2@ironsoftware.com",
					Key .membership_id = "M002",
					Key .expiry_date = "2025-06-30"
				},
				New With {
					Key .name = "Iron Dev 3",
					Key .email = "dev3@ironsoftware.com",
					Key .membership_id = "M003",
					Key .expiry_date = "2024-09-15"
				}
			}
			Dim client = New HttpClient()
			client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
			For i As Integer = 0 To membershipCards.Count - 1
				Dim json_content = JsonSerializer.Serialize(membershipCards(i))
				Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
				Dim byteContent = New ByteArrayContent(buffer)
'INSTANT VB NOTE: In the following line, Instant VB substituted 'Object' for 'dynamic' - this will work in VB with Option Strict Off:
				Console.WriteLine($"Creating PDF for {CType(membershipCards(i), Object).name}...")
				Dim response = Await client.PostAsync(url, byteContent)
				Dim ret = Await response.Content.ReadAsStringAsync()
				Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
				If returnContent.status = "success" Then
					Console.WriteLine($"Downloading {returnContent.download_url}...")
					Dim download_response = Await client.GetAsync(returnContent.download_url)
					Using stream = Await download_response.Content.ReadAsStreamAsync()
						Dim fileInfo As New FileInfo($"F:/membership_card_{i + 1}.pdf")
						Using fileStream = fileInfo.OpenWrite()
							Await stream.CopyToAsync(fileStream)
						End Using
					End Using
					Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'")
				Else
'INSTANT VB NOTE: In the following line, Instant VB substituted 'Object' for 'dynamic' - this will work in VB with Option Strict Off:
					Console.WriteLine($"Failed to create PDF for {CType(membershipCards(i), Object).name}. Status: {returnContent.status}")
				End If
			Next i
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Ten kod generuje wiele kart członkowskich w jednym wywołaniu API. Każda karta jest spersonalizowana z indywidualnymi informacjami o członku. Oto jedna karta wygenerowana przez ten kod:

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 13

Generowanie obrazów

Choć głównym celem APITemplate jest generowanie PDF, jego możliwości generowania obrazów są równie imponujące. Możesz generować obrazy na potrzeby mediów społecznościowych, korzystając z szablonów obrazów w konsoli. Oferuje także inteligentne przycinanie responsywne obrazu. API generacji banerów jest takie samo jak API obrazów. Oto bardziej złożony przykład, jak to wykorzystałem:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "f4377b23b4aeeed0";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""rect_image_bg"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""rect_container"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
        },
        {
            ""name"": ""text_quote"",
            ""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest!  #DesertAdventures #SaharaSkies"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#414141""
        },
        {
            ""name"": ""text_footer"",
            ""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#666666""
        },
        {
            ""name"": ""circle_profile"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""text_name"",
            ""text"": ""Sarah Wanderlust"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        },
        {
            ""name"": ""text_twitter"",
            ""text"": ""@sarahexplores"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo("image.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "f4377b23b4aeeed0";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""rect_image_bg"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""rect_container"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
        },
        {
            ""name"": ""text_quote"",
            ""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest!  #DesertAdventures #SaharaSkies"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#414141""
        },
        {
            ""name"": ""text_footer"",
            ""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#666666""
        },
        {
            ""name"": ""circle_profile"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""text_name"",
            ""text"": ""Sarah Wanderlust"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        },
        {
            ""name"": ""text_twitter"",
            ""text"": ""@sarahexplores"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo("image.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Namespace csharp
	Friend Class ReturnContent
		Public Property download_url() As String
		Public Property status() As String
	End Class

	Friend Class Program
		Shared Async Function Main(ByVal args() As String) As Task
			Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
			Dim template_id = "f4377b23b4aeeed0"
			Dim url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}"
			Dim json_content = "{
    ""overrides"": [
        {
            ""name"": ""rect_image_bg"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""rect_container"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
        },
        {
            ""name"": ""text_quote"",
            ""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest!  #DesertAdventures #SaharaSkies"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#414141""
        },
        {
            ""name"": ""text_footer"",
            ""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#666666""
        },
        {
            ""name"": ""circle_profile"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""text_name"",
            ""text"": ""Sarah Wanderlust"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        },
        {
            ""name"": ""text_twitter"",
            ""text"": ""@sarahexplores"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        }
    ]
}"
			Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
			Dim byteContent = New ByteArrayContent(buffer)
			Console.WriteLine(json_content)
			Dim client = New HttpClient()
			client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
			Dim response = Await client.PostAsync(url, byteContent)
			Dim ret = Await response.Content.ReadAsStringAsync()
			Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
			If returnContent.status = "success" Then
				Console.WriteLine($"Downloading {returnContent.download_url}...")
				Dim download_response = Await client.GetAsync(returnContent.download_url)
				Using stream = Await download_response.Content.ReadAsStreamAsync()
					Dim fileInfo As New FileInfo("image.jpeg")
					Using fileStream = fileInfo.OpenWrite()
						Await stream.CopyToAsync(fileStream)
					End Using
				End Using
			End If
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Figura 14

Ten przykład generuje promocyjny obraz produktu z dynamiczną treścią, niestandardowym kolorem tła i osadzonym obrazem produktu.

Generowanie kodów QR

Wbudowana funkcja generowania kodów QR przez APITemplate znacząco wzbogaciła wiele moich projektów. Można umieścić URL danych zamiast treści dla kodów QR. Oto bardziej złożony przykład, jak to wykorzystałem:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "API-Key";
            var template_id = "Template-Key";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""background-color"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""#FFFFFF""
        },
        {
            ""name"": ""qr_1"",
            ""content"": ""http://ironpdf.com/"",
            ""backgroundColor"": ""white"",
            ""color"": ""#000000""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            //Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            Console.WriteLine(returnContent.status);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "API-Key";
            var template_id = "Template-Key";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""background-color"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""#FFFFFF""
        },
        {
            ""name"": ""qr_1"",
            ""content"": ""http://ironpdf.com/"",
            ""backgroundColor"": ""white"",
            ""color"": ""#000000""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            //Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            Console.WriteLine(returnContent.status);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Namespace csharp
	Friend Class ReturnContent
		Public Property download_url() As String
		Public Property status() As String
	End Class

	Friend Class Program
		Shared Async Function Main(ByVal args() As String) As Task
			Dim api_key = "API-Key"
			Dim template_id = "Template-Key"
			Dim url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}"
			Dim json_content = "{
    ""overrides"": [
        {
            ""name"": ""background-color"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""#FFFFFF""
        },
        {
            ""name"": ""qr_1"",
            ""content"": ""http://ironpdf.com/"",
            ""backgroundColor"": ""white"",
            ""color"": ""#000000""
        }
    ]
}"
			Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
			Dim byteContent = New ByteArrayContent(buffer)
			'Console.WriteLine(json_content);
			Dim client = New HttpClient()
			client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
			Dim response = Await client.PostAsync(url, byteContent)
			Dim ret = Await response.Content.ReadAsStringAsync()
			Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
			Console.WriteLine(returnContent.status)
			If returnContent.status = "success" Then
				Console.WriteLine($"Downloading {returnContent.download_url}...")
				Dim download_response = Await client.GetAsync(returnContent.download_url)
				Using stream = Await download_response.Content.ReadAsStreamAsync()
					Dim fileInfo As New FileInfo("F:/QRimage.jpeg")
					Using fileStream = fileInfo.OpenWrite()
						Await stream.CopyToAsync(fileStream)
					End Using
				End Using
			End If
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Rysunek 15

Dokumentacja i wsparcie

Jako programista C#, który często pracuje z generowaniem i manipulacją plików PDF, odkryłem, że jakość dokumentacji i wsparcia może decydować o sukcesie projektu. Przeanalizujmy moje doświadczenia z dokumentacją i wsparciem zarówno dla IronPDF, jak i APITemplate.

IronPDF

Dokumentacja

Dokumentacja IronPDF jest kompleksowa i dobrze zorganizowana, co bardzo pomogło mi w moich projektach. Oto szczegółowy opis mojego doświadczenia: Dokumentacja IronPDF jest dostępna na stronie https://ironpdf.com/docs/, i jest dość obszerna. Oto kilka kluczowych aspektów, które doceniłem:

  1. Przewodnik startowy: Dokumentacja zaczyna się od jasnego, krok po kroku przewodnika, jak zainstalować IronPDF za pomocą NuGet i stworzyć swój pierwszy PDF. To pomogło mi szybko rozpocząć pracę nad pierwszymi projektami.

  2. Dokumentacja API: Dokumentacja API jest szczegółowa, obejmując wszystkie klasy i metody. Każdy wpis zawiera przykłady C#, które okazały się nieocenione przy implementacji specyficznych funkcji.

  3. Przykłady kodu: W całej dokumentacji znajdują się liczne fragmenty kodu i pełne przykłady. Były one szczególnie pomocne, gdy potrzebowałem wdrożyć bardziej złożone operacje na plikach PDF.

  4. Samouczki i przewodniki: IronPDF dostarcza szczegółowych samouczków dla typowych zadań, takich jak tworzenie PDF z HTML, dodawanie znaków wodnych czy praca z formularzami. Te pomogły mi w bardziej zaawansowanych przypadkach użycia.

  5. Sekcja rozwiązywania problemów: Dokumentacja zawiera sekcję rozwiązywania problemów, która rozwiązuje powszechne problemy. To oszczędziło mi czasu, kiedy napotkałem błędy lub nieoczekiwane zachowania.

Wsparcie

Kontakt IronPDF był responsywny, a kanały wsparcia były wyjątkowo pomocne w moim doświadczeniu:

  1. Wsparcie e-mail: Gdy miałem skomplikowane problemy, korzystałem z ich wsparcia e-mailowego. Czasy odpowiedzi były zazwyczaj w ciągu 24 godzin, a zespół wsparcia posiadał dużą wiedzę na temat produktu.

  2. Forum społeczności: IronPDF prowadzi forum społeczności, na którym deweloperzy mogą zadawać pytania i dzielić się rozwiązaniami. Zarówno znalazłem odpowiedzi na moje pytania, jak i przyczyniłem się do rozwiązań opartych na moich doświadczeniach.

  3. Stack Overflow: Zespół IronPDF aktywnie monitoruje tag [IronPDF] na Stack Overflow. Otrzymałem pomocne odpowiedzi na pytania, które tam zamieściłem.

  4. Regularne aktualizacje: IronPDF często wydaje aktualizacje z poprawkami błędów i nowymi funkcjami. Dziennik zmian jest szczegółowy, co pomaga mi zrozumieć, co nowego lub zmienionego pojawiło się w każdej wersji.

  5. Przewodniki migracyjne: Kiedy wystąpiły zmiany w kolejnych wersjach głównych, IronPDF dostarczał przewodniki migracyjne. Te były kluczowe przy aktualizowaniu moich projektów do nowszych wersji biblioteki.

APITemplate

Dokumentacja i struktura wsparcia APITemplate różni się od IronPDF, co odzwierciedla jego naturę jako usługi chmurowej. Oto moje doświadczenie:

Dokumentacja

Dokumentacja APITemplate jest dostępna na stronie https://docs.apitemplate.io/reference/api-reference.html, i koncentruje się na używaniu API. Oto kluczowe punkty:

  1. Dokumentacja API: Dokumentacja dostarcza jasne odniesienie do API, szczegółowo opisując wszystkie dostępne końcówki, wymagane parametry i formaty odpowiedzi. To było moje zasoby, kiedy integrowałem APITemplate z moimi aplikacjami C#.

  2. Autoryzacja: Jest dedykowana sekcja dotycząca autoryzacji, która jasno wyjaśnia, jak używać kluczy API. Było to kluczowe, gdy po raz pierwszy zacząłem korzystać z usługi.

Wsparcie

Struktura wsparcia APITemplate jest bardziej skoncentrowana na wsparciu e-mail:

  1. Wsparcie e-mail: Gdy miałem problemy lub pytania, korzystałem z ich wsparcia e-mailowego. Czasy odpowiedzi były zazwyczaj w ciągu 1-2 dni roboczych.

  2. Sekcja FAQ: Dokumentacja zawiera sekcję FAQ, która rozwiązuje powszechne pytania. Często była to moja pierwsza przystań, gdy napotkałem problemy.

Korzystanie z Bootstrap 5 z IronPDF do paneli analitycznych

Silnik renderujący Chrome V8 IronPDF doskonale radzi sobie z renderowaniem nowoczesnych układów Bootstrap 5, co czyni go idealnym do generowania raportów PDF z metrykami biznesowymi i wizualizacjami danych. W odróżnieniu od podejścia APITemplate opartego na API, IronPDF przetwarza HTML bezpośrednio z pełną obsługą CSS3, w tym flexbox, CSS Grid i właściwości niestandardowe.

using IronPdf;

var renderer = new ChromePdfRenderer();

string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .metric-card {
            transition: transform 0.2s;
            border-left: 4px solid #0d6efd;
        }
        .metric-card:hover { transform: translateY(-5px); }
        .trend-up { color: #198754; }
        .trend-down { color: #dc3545; }
        @media print {
            .metric-card { page-break-inside: avoid; }
        }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-5'>
        <div class='row mb-4'>
            <div class='col-12'>
                <div class='card shadow-sm'>
                    <div class='card-body'>
                        <h1 class='display-6 mb-0'>Performance Dashboard</h1>
                        <p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
                        <h2 class='display-6 mb-3'>$2.4M</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 85%'></div>
                        </div>
                        <small class='trend-up'>↑ 18% from last quarter</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
                        <h2 class='display-6 mb-3'>48,592</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-primary' style='width: 72%'></div>
                        </div>
                        <small class='trend-up'>↑ 12% growth rate</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
                        <h2 class='display-6 mb-3'>3.8%</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-warning' style='width: 38%'></div>
                        </div>
                        <small class='trend-down'>↓ 2% needs attention</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
                        <h2 class='display-6 mb-3'>4.7/5</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 94%'></div>
                        </div>
                        <small class='trend-up'>↑ Excellent rating</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-body'>
                <h5 class='card-title mb-3'>Top Performing Products</h5>
                <div class='table-responsive'>
                    <table class='table table-hover'>
                        <thead class='table-light'>
                            <tr>
                                <th>Product</th>
                                <th>Revenue</th>
                                <th>Units</th>
                                <th>Trend</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>Enterprise Suite</strong></td>
                                <td>$1,240,000</td>
                                <td>2,150</td>
                                <td><span class='badge bg-success'>+22%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Professional Plan</strong></td>
                                <td>$820,000</td>
                                <td>4,890</td>
                                <td><span class='badge bg-success'>+15%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Starter Package</strong></td>
                                <td>$340,000</td>
                                <td>8,240</td>
                                <td><span class='badge bg-warning'>+5%</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .metric-card {
            transition: transform 0.2s;
            border-left: 4px solid #0d6efd;
        }
        .metric-card:hover { transform: translateY(-5px); }
        .trend-up { color: #198754; }
        .trend-down { color: #dc3545; }
        @media print {
            .metric-card { page-break-inside: avoid; }
        }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-5'>
        <div class='row mb-4'>
            <div class='col-12'>
                <div class='card shadow-sm'>
                    <div class='card-body'>
                        <h1 class='display-6 mb-0'>Performance Dashboard</h1>
                        <p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
                        <h2 class='display-6 mb-3'>$2.4M</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 85%'></div>
                        </div>
                        <small class='trend-up'>↑ 18% from last quarter</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
                        <h2 class='display-6 mb-3'>48,592</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-primary' style='width: 72%'></div>
                        </div>
                        <small class='trend-up'>↑ 12% growth rate</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
                        <h2 class='display-6 mb-3'>3.8%</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-warning' style='width: 38%'></div>
                        </div>
                        <small class='trend-down'>↓ 2% needs attention</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
                        <h2 class='display-6 mb-3'>4.7/5</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 94%'></div>
                        </div>
                        <small class='trend-up'>↑ Excellent rating</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-body'>
                <h5 class='card-title mb-3'>Top Performing Products</h5>
                <div class='table-responsive'>
                    <table class='table table-hover'>
                        <thead class='table-light'>
                            <tr>
                                <th>Product</th>
                                <th>Revenue</th>
                                <th>Units</th>
                                <th>Trend</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>Enterprise Suite</strong></td>
                                <td>$1,240,000</td>
                                <td>2,150</td>
                                <td><span class='badge bg-success'>+22%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Professional Plan</strong></td>
                                <td>$820,000</td>
                                <td>4,890</td>
                                <td><span class='badge bg-success'>+15%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Starter Package</strong></td>
                                <td>$340,000</td>
                                <td>8,240</td>
                                <td><span class='badge bg-warning'>+5%</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim analyticsDashboard As String = "
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .metric-card {
            transition: transform 0.2s;
            border-left: 4px solid #0d6efd;
        }
        .metric-card:hover { transform: translateY(-5px); }
        .trend-up { color: #198754; }
        .trend-down { color: #dc3545; }
        @media print {
            .metric-card { page-break-inside: avoid; }
        }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-5'>
        <div class='row mb-4'>
            <div class='col-12'>
                <div class='card shadow-sm'>
                    <div class='card-body'>
                        <h1 class='display-6 mb-0'>Performance Dashboard</h1>
                        <p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
                        <h2 class='display-6 mb-3'>$2.4M</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 85%'></div>
                        </div>
                        <small class='trend-up'>↑ 18% from last quarter</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
                        <h2 class='display-6 mb-3'>48,592</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-primary' style='width: 72%'></div>
                        </div>
                        <small class='trend-up'>↑ 12% growth rate</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
                        <h2 class='display-6 mb-3'>3.8%</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-warning' style='width: 38%'></div>
                        </div>
                        <small class='trend-down'>↓ 2% needs attention</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
                        <h2 class='display-6 mb-3'>4.7/5</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 94%'></div>
                        </div>
                        <small class='trend-up'>↑ Excellent rating</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-body'>
                <h5 class='card-title mb-3'>Top Performing Products</h5>
                <div class='table-responsive'>
                    <table class='table table-hover'>
                        <thead class='table-light'>
                            <tr>
                                <th>Product</th>
                                <th>Revenue</th>
                                <th>Units</th>
                                <th>Trend</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>Enterprise Suite</strong></td>
                                <td>$1,240,000</td>
                                <td>2,150</td>
                                <td><span class='badge bg-success'>+22%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Professional Plan</strong></td>
                                <td>$820,000</td>
                                <td>4,890</td>
                                <td><span class='badge bg-success'>+15%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Starter Package</strong></td>
                                <td>$340,000</td>
                                <td>8,240</td>
                                <td><span class='badge bg-warning'>+5%</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(analyticsDashboard)
pdf.SaveAs("analytics-dashboard.pdf")
$vbLabelText   $csharpLabel

Ten kod generuje profesjonalny PDF z pulpitem nawigacyjnym analizy z kartami metryk, paskami postępu i responsywnymi tabelami. Silnik Chrome IronPDF doskonale renderuje układy flexbox Bootstrap, cienie i efekty hover - funkcje, które wymagają znacznej pracy niestandardowej z usługami opartymi na API, takimi jak APITemplate.

Kluczowe zalety w porównaniu z APITemplate:

  • Bezpośrednie renderowanie HTML z pełną obsługą Bootstrap
  • Brak potrzebnych wywołań API ani konfiguracji szablonów
  • Kompleksowa zgodność z CSS3, w tym animacje
  • Offline przetwarzanie bez zewnętrznych zależności

Aby uzyskać więcej informacji na temat generowania Bootstrap PDF, patrz Przewodnik PDF Bootstrap.

Licencjonowanie

Ceny i licencje IronPDF

Porównanie APITemplate io i IronPDF dla bibliotek PDF w C#: Rysunek 16

IronPDF oferuje różne poziomy cenowe, aby dostosować się do różnych potrzeb:

  1. Lite: W cenie $999, ten poziom jest odpowiedni dla jednego programisty pracującego nad jednym projektem. To jednorazowa opłata, co czyni go przystępną opcją dla małych projektów lub indywidualnych programistów.
  2. Plus: W cenie $1,499, ta opcja obsługuje do 10 programistów, 10 lokalizacji i 10 projektów. Ten poziom również zawiera jednorazową opłatę i zapewnia większą elastyczność dla małych i średnich zespołów.
  3. Professional: Za $2,999, ten poziom zapewnia szersze prawa do wdrażania i jest odpowiedni dla większych zespołów z bardziej wymagającymi wymaganiami projektowymi.
  4. Unlimited: W cenie $5,999, ten poziom pozwala na nieograniczoną liczbę programistów, lokalizacji i projektów. To idealne rozwiązanie dla dużych zespołów i przedsiębiorstw, które potrzebują szerokiego zakresu użytkowania bez ograniczeń.

IronPDF oferuje także licencje Enterprise i OEM na redystrybucję dla większych organizacji i tych, które muszą zintegrować funkcjonalności PDF z produktami komercyjnymi. Oferuje także bezpłatny okres próbny do testów.

Ceny i licencjonowanie APITemplate

APITemplate oferuje inne podejście z usługą generowania PDF opartą na API. Ceny są zazwyczaj oparte na liczbie wywołań API, co czyni go bardziej elastycznym w różnych wzorcach użytkowania:

  1. Podstawowy plan: Często zaczyna się od niższej ceny z ograniczoną liczbą wywołań API miesięcznie. To jest odpowiednie dla małych projektów lub firm z minimalnymi potrzebami generowania PDF.
  2. Standardowy plan: Ten plan zawiera więcej wywołań API i dodatkowe funkcje, zaspokajając potrzeby średnich firm.
  3. Plan dla przedsiębiorstw: Dostosowany do użytkowników o dużym wolumenie, ten plan zapewnia najwięcej wywołań API i funkcji premium, takich jak priorytetowe wsparcie i niestandardowe integracje.

Licencjonowanie APITemplate jest proste, zazwyczaj związane z modelem subskrypcji miesięcznej lub rocznej.

Kluczowe różnice

  1. Model cenowy: IronPDF stosuje model opłaty jednorazowej, który może być opłacalny w dłuższej perspektywie, szczególnie przy ciągłym, intensywnym użytkowaniu. Z kolei APITemplate stosuje model subskrypcyjny, który może być bardziej elastyczny i skalowalny z użytkowaniem.
  2. Wsparcie i aktualizacje: IronPDF zawiera jeden rok wsparcia i aktualizacji z zakupem, z opcjami przedłużenia tego okresu. Plany subskrypcyjne APITemplate zazwyczaj zawierają bieżące wsparcie i aktualizacje jako część pakietu.

Dlaczego warto wybrać IronPDF?

IronPDF i APITemplate oferują możliwość generowania PDF z treści HTML, ale implementacja IronPDF jest bardziej solidna i elastyczna. Oto porównanie:

IronPDF

using IronPdf;

var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { color: #0066cc; font-size: 24px; }
        .content { margin-top: 20px; }
    </style>
</head>
<body>
    <div class='header'>Dynamic Report</div>
    <div class='content'>
        <p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { color: #0066cc; font-size: 24px; }
        .content { margin-top: 20px; }
    </style>
</head>
<body>
    <div class='header'>Dynamic Report</div>
    <div class='content'>
        <p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
Imports IronPdf

Private renderer = New ChromePdfRenderer()
Private html = "
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { color: #0066cc; font-size: 24px; }
        .content { margin-top: 20px; }
    </style>
</head>
<body>
    <div class='header'>Dynamic Report</div>
    <div class='content'>
        <p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
</body>
</html>"
Private pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("IronPDF_report.pdf")
$vbLabelText   $csharpLabel

APITemplate

using System.Net.Http;
using System.Text.Json;

var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
    header = "Dynamic Report",
    content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
using System.Net.Http;
using System.Text.Json;

var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
    header = "Dynamic Report",
    content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
Imports System.Net.Http
Imports System.Text.Json

Private apiKey = "your_api_key"
Private templateId = "your_template_id"
Private url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}"
Private data = New With {
	Key .header = "Dynamic Report",
	Key .content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
	Key .date = DateTime.Now.ToShortDateString()
}
Private json = JsonSerializer.Serialize(data)
Private content = New StringContent(json, System.Text.Encoding.UTF8, "application/json")
Private client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey)
Dim response = Await client.PostAsync(url, content)
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes)
$vbLabelText   $csharpLabel

Kluczowe różnice

  1. Wsparcie JavaScript: IronPDF w pełni obsługuje wykonywanie JavaScript w ramach HTML, co pozwala na tworzenie dynamicznych treści (jak bieżąca data w przykładzie). APITemplate zazwyczaj wymaga dostarczenia wszystkich danych z góry.
  2. Elastyczność CSS: Z IronPDF masz pełną kontrolę nad stylizacją CSS bezpośrednio w HTML. APITemplate często wymaga wstępnie zdefiniowanych szablonów z ograniczonymi opcjami dostosowywania.
  3. Wydajność: IronPDF przetwarza HTML lokalnie, co skutkuje szybszym generowaniem PDF, zwłaszcza dla złożonych dokumentów. Podejście APITemplate oparte na chmurze może wprowadzać opóźnienia.
  4. Możliwość pracy offline: IronPDF działa offline, co jest pomocne dla aplikacji z ograniczoną łącznością internetową lub wymagającymi wysokiego poziomu bezpieczeństwa. APITemplate zawsze wymaga połączenia z internetem.
  5. Dynamiczna treść: IronPDF pozwala na bardziej dynamiczne generowanie treści na bieżąco, podczas gdy APITemplate zazwyczaj wymaga wstępnie zdefiniowanej struktury szablonów.
  6. Dostosowywanie: IronPDF oferuje bardziej szczegółową kontrolę nad procesem generowania PDF, w tym opcje dotyczące rozmiaru strony, marginesów i innych ustawień specyficznych dla PDF.
  7. Spójność: IronPDF zapewnia spójne renderowanie w różnych środowiskach, ponieważ używa własnego silnika renderującego. Wynik APITemplate może się różnić w zależności od konfiguracji serwera.

Wnioski

Po intensywnej pracy z oboma IronPDF i APITemplate w różnych projektach C#, doceniam unikalne zalety każdego narzędzia. Jednak dla większości moich zadań związanych z PDF, IronPDF bez przerwy okazało się lepszym wyborem. Chociaż APITemplate ma swoje zalety, szczególnie w przypadku prostego generowania dokumentów opartych na szablonach, odkryłem, że wszechstronność IronPDF pozwala mu radzić sobie z tego typu zadaniami równie skutecznie, jednocześnie zapewniając możliwość wykonywania bardziej skomplikowanych operacji PDF według potrzeby.

Podsumowując, chociaż oba narzędzia mają swoje miejsce, IronPDF nieustannie udowadnia, że jest potężniejszym, elastyczniejszym i bardziej opłacalnym rozwiązaniem do manipulacji PDF w programowaniu C#. Jego solidny zestaw funkcji, doskonała wydajność i kompleksowe wsparcie czynią go moim wyborem dla wszelkich zadań związanych z PDF, od najprostszej generacji dokumentów po najbardziej złożone manipulacje PDF.

Zwróć uwagęAPITemplate jest zarejestrowanym znakiem towarowym należącym do odpowiedniego właściciela. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez APITemplate. 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.

Często Zadawane Pytania

Jakie są kluczowe różnice między narzędziami do generowania plików PDF opartymi na chmurze a narzędziami opartymi na bibliotekach?

Narzędzia oparte na chmurze, takie jak APITemplate, umożliwiają generowanie plików PDF poprzez wywołania API i wymagają połączenia z Internetem. Natomiast narzędzia oparte na bibliotekach, takie jak IronPDF, są zintegrowane z aplikacją C#, co pozwala na edycję plików PDF w trybie offline i zapewnia większą kontrolę nad tworzeniem i dostosowywaniem plików PDF.

W jaki sposób IronPDF obsługuje konwersję HTML do PDF w aplikacjach C#?

IronPDF umożliwia płynną konwersję HTML do PDF przy użyciu metod takich jak RenderHtmlAsPdf. W pełni obsługuje nowoczesne standardy internetowe, w tym CSS i JavaScript, zapewniając wysokiej jakości renderowanie treści internetowych do plików PDF.

Czy mogę używać IronPDF do dynamicznego generowania treści w plikach PDF?

Tak, IronPDF obsługuje wykonywanie kodu JavaScript, co umożliwia dynamiczne generowanie treści w plikach PDF. Jest to szczególnie przydatne do tworzenia interaktywnych plików PDF bezpośrednio ze stron internetowych zawierających dane dynamiczne.

Jakie są zalety korzystania z IronPDF w porównaniu z usługą opartą na subskrypcji?

IronPDF oferuje jednorazową opłatę licencyjną, zapewniając ekonomiczne rozwiązanie do długoterminowego użytkowania. Umożliwia pracę w trybie offline i zapewnia rozbudowane funkcje edycji plików PDF, które mogą być bardziej elastyczne i niezawodne w porównaniu z usługami opartymi na subskrypcji, takimi jak APITemplate.

Jakie wsparcie jest dostępne dla programistów korzystających z IronPDF?

IronPDF oferuje kompleksowe wsparcie poprzez szczegółową dokumentację, w tym przewodniki, Dokumentację API i przykłady kodu. Programiści mogą również uzyskać pomoc poprzez Wsparcie e-mail, fora społecznościowe oraz monitorowanie na platformach takich jak Stack Overflow.

Czy IronPDF obsługuje tworzenie oprogramowania na wiele platform?

Tak, IronPDF jest kompatybilny z .NET Standard, który obsługuje tworzenie oprogramowania na wiele platform. Dzięki temu programiści mogą płynnie zintegrować IronPDF z projektami działającymi na różnych systemach operacyjnych.

W jaki sposób IronPDF zapewnia bezpieczeństwo generowanych plików PDF?

IronPDF zawiera funkcje szyfrowania i deszyfrowania plików PDF, umożliwiające programistom zabezpieczanie dokumentów hasłami i podpisami cyfrowymi. Funkcje te pomagają w zachowaniu poufności i integralności dokumentów PDF.

Jakie są typowe wskazówki dotyczące rozwiązywania problemów związanych z używaniem IronPDF?

W przypadku problemów z IronPDF upewnij się, że wszystkie zależności są poprawnie zainstalowane i zaktualizowane. Sprawdź dokumentację pod kątem zgodności i ustawień konfiguracyjnych oraz przejrzyj przykładowy kod, aby zweryfikować praktyki wdrożeniowe. Jeśli problemy nadal występują, zespół wsparcia technicznego jest gotowy do pomocy.

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ę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie