IRONSOFTWAREHOME
FILMY

Jak wyodrębnić osadzony tekst i obrazy z plików PDF w języku C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Api2pdf oferuje usługę w chmurze do generowania plików PDF, ale wysyłanie poufnych dokumentów na serwery zewnętrzne może prowadzić do zagrożeń bezpieczeństwa, problemów z zgodnością z przepisami oraz stałych kosztów, które z czasem mogą się sumować. Niniejszy przewodnik zawiera szczegółową ścieżkę migracji zApi2pdfdo IronPDF— natywnej biblioteki PDF dla platformy .NET, która przetwarza dokumenty całkowicie w ramach własnej infrastruktury, eliminując obawy związane z transmisją danych i zamieniając koszty poszczególnych konwersji na jednorazową inwestycję.

Dlaczego warto rozważyć odejście od Api2pdf?

ChociażApi2pdfzapewnia wygodne generowanie plików PDF w chmurze, kilka czynników skłania zespoły programistów do poszukiwania lokalnych alternatyw dla swoich potrzeb w zakresie generowania plików PDF.

Kwestie bezpieczeństwa i zgodności

Api2pdf działa jako usługa w chmurze, w ramach której poufne pliki HTML i dokumenty są wysyłane do serwerów stron trzecich w celu przetworzenia. Stanowi to poważny problem dla organizacji zajmujących się danymi podlegającymi regulacjom.

RyzykoApi2pdfIronPDF
Transmisja danychWszystkie treści wysyłane na serwery zewnętrznePrzetwarzanie lokalnie w Twojej infrastrukturze
Zgodność z RODODane przekraczają granice jurysdykcjiDane nigdy nie opuszczają Twojego środowiska
Zgodność z HIPAADane medyczne przekazywane na zewnątrzDane medyczne pozostają w Państwa systemach
SOC 2Zależności od podmiotów zewnętrznychPełna kontrola nad przetwarzaniem danych
PCI DSSPotencjalne ujawnienie danych kartBrak transmisji zewnętrznej

Kumulacja kosztów w czasie

Api2pdf nalicza podstawową opłatę w wysokości 1 USD/miesiąc plus mierzony użytek (przepustowość i sekundy obliczeniowe) bez ograniczeń, podczas gdy IronPDF oferuje jednorazową licencję wieczystą. Zweryfikuj aktualne liczby na api2pdf.com/pricing:

KomponentApi2pdfIronPDF
Podstawa1 USD/miesiącLicencja jednorazowa
Przepustowość0,001 USD za MBn/d (lokalnie)
Obliczenia0,00019551 USD za sekundęn/d (lokalnie)
Skalowanie objętościLiniowe zgodnie z użytkiem i rozmiarem plikuPłaska (Lite ~749 USD, Plus ~1 499 USD, Professional ~2 999 USD)

Bardziej intensywne obciążenia (duże pliki, strony bogate w JS, długie czasy renderowania) zwiększają rachunek api2pdf; Koszt IronPDF jest stały po uzyskaniu licencji.

Wydajność i dostępność

Api2pdf wymaga komunikacji sieciowej, co powoduje opóźnienie wynoszące 2–5 sekund przy każdym żądaniu generowania pliku PDF.IronPDF przetwarza dane lokalnie w ciągu 100–500 milisekund. Ponadto IronPDF działa w pełni w trybie offline oraz w środowiskach odizolowanych — co ma kluczowe znaczenie dla aplikacji, które nie mogą polegać na dostępności usług zewnętrznych.

##Api2pdfa IronPDF: kluczowe różnice

AspektApi2pdfIronPDF
Obsługa danychWysłane do zewnętrznych serwerów w chmurzePrzetwarzane lokalnie w Twojej infrastrukturze
Ceny1 USD/miesiąc podstawa + mierzony (0,001 USD/MB przepustowość, 0,00019551 USD/sek obliczenia)Jednorazowa Licencja wieczysta
Opóźnienie2–5 sekund (czas przesyłu w obie strony)100–500 ms (przetwarzanie lokalne)
OfflineNiedostępneDziała całkowicie w trybie offline
InstalacjaKlucz API + klient HTTPProsty pakiet NuGet
ZgodnośćKwestie związane z RODO/HIPAA (dane opuszczają sieć)Pełna kontrola zgodności

Proces migracji krok po kroku

Krok 1: Zaktualizuj pakiety NuGet

Usuń pakietApi2pdfi zainstaluj IronPDF:

# Remove Api2pdf
dotnet remove package Api2Pdf

# Install IronPDF
dotnet add package IronPdf
SHELL

Lub za pomocą konsoli menedżera pakietów:

Uninstall-Package Api2Pdf
Install-Package IronPdf
PowerShell

Krok 2: Aktualizacja odniesień do przestrzeni nazw

Zastąp przestrzenie nazwApi2pdfprzez IronPDF:

// Remove these
using Api2Pdf;

// Add these
using IronPdf;
using IronPdf.Rendering;

Krok 3: Skonfiguruj klucz licencyjny

Ustaw klucz licencyjny IronPDF podczas uruchamiania aplikacji:

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }

Krok 4: Usuń konfigurację klucza API

IronPDF działa lokalnie i nie wymaga kluczy API:

// Remove thisApi2pdfpattern
var client = new Api2Pdf("API_KEY");

// Just create the renderer directly
var renderer = new ChromePdfRenderer();
C#

Kompletna dokumentacja API

Mapowanie klas podstawowych

KlasaApi2pdfOdpowiednik IronPDF
Api2Pdf (klient)ChromePdfRenderer
Api2PdfResultPdfDocument
ChromeHtmlToPdfOptionsChromePdfRenderOptions

Mapowanie metod

MetodaApi2pdfMetoda IronPDF
client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html })renderer.RenderHtmlAsPdf(html)
client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest { Url = url })renderer.RenderUrlAsPdf(url)
result.FileUrl (URL do pobrania)pdf.SaveAs(path)
result.GetFileBytes()pdf.BinaryData
client.PdfSharp.MergePdfs(new PdfMergeRequest { Urls = urls })PdfDocument.Merge(pdfs)
client.PdfSharp.SetPassword(new PdfPasswordRequest { Url, OwnerPassword })pdf.SecuritySettings.OwnerPassword

Mapowanie opcji renderowania

OpcjaApi2pdfOpcja IronPDF
Landscape = trueRenderingOptions.PaperOrientation = Landscape
PreferCSSPageSize = true / FormatRenderingOptions.PaperSize = PdfPaperSize.A4
PrintBackground = trueRenderingOptions.PrintHtmlBackgrounds = true
MarginTop, itd.RenderingOptions.MarginTop, itd.
Delay = 5000RenderingOptions.WaitFor.RenderDelay(5000)

Przykłady migracji kodu

Konwersja HTML do PDF

Najczęstsza operacjaApi2pdfilustruje fundamentalną zmianę — przejście od wywołań API w chmurze do przetwarzania lokalnego.

Wdrożenie Api2pdf:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Hello World</h1>"
        });
        Console.WriteLine(result.FileUrl);
    }
}

Wdrożenie IronPDF:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}

IronPDF eliminuje konieczność komunikacji sieciowej, zarządzanie kluczami API oraz oddzielny etap pobierania wymagany przez wzorzec odpowiedzi oparty na adresach URL stosowany przez Api2pdf.

Konwersja adresów URL do formatu PDF

Wdrożenie Api2pdf:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest
        {
            Url = "https://www.example.com"
        });
        Console.WriteLine(result.FileUrl);
    }
}

Wdrożenie IronPDF:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF created from URL successfully");
    }
}

Plik HTML do PDF z opcjami

Wdrożenie Api2pdf:

// NuGet: Install-Package Api2Pdf
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        string html = File.ReadAllText("input.html");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = html,
            Options = new ChromeHtmlToPdfOptions
            {
                Landscape = true,
                PrintBackground = true
            }
        });
        Console.WriteLine(result.FileUrl);
    }
}

Wdrożenie IronPDF:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
        string html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created with options successfully");
    }
}

IronPDF konfiguruje opcje renderowania bezpośrednio w obiekcie renderera, zamiast przekazywać je jako oddzielny parametr opcji do każdego wywołania API.

Łączenie wielu plików PDF

Wdrożenie Api2pdf:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var pdfUrls = new List<string>
{
    "https://example.com/pdf1.pdf",
    "https://example.com/pdf2.pdf",
    "https://example.com/pdf3.pdf"
};

var request = new PdfMergeRequest { Urls = pdfUrls };
var result = await client.PdfSharp.MergePdfsAsync(request);

if (result.Success)
{
    // Download merged PDF from result.FileUrl
}

Wdrożenie IronPDF:

using IronPdf;

// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");

// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");

Statyczna metoda Merge w IronPDF akceptuje wiele dokumentów bezpośrednio, eliminując przepływ pracy oparty na URL.

Pliki PDF chronione hasłem

Wdrożenie Api2pdf:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

// Generate PDF first
var pdfResult = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = "<h1>Confidential</h1>"
});

// Then add password protection in a second round-trip
var protectedResult = await client.PdfSharp.SetPasswordAsync(new PdfPasswordRequest
{
    Url = pdfResult.FileUrl,
    OwnerPassword = "secretpassword"
});

Wdrożenie IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

IronPDF zapewnia szczegółową kontrolę nad uprawnieniami PDF dzięki właściwości SecuritySettings.

Nagłówki i stopki

Wdrożenie Api2pdf:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = html,
    Options = new ChromeHtmlToPdfOptions
    {
        DisplayHeaderFooter = true,
        HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
        FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
    }
});

Wdrożenie IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();

// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");

IronPDF obsługuje symbole zastępcze jak {page} i {total-pages} do dynamicznego numerowania stron. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą nagłówków i stopek.

Integracja z ASP.NET Core.NET Core

Wzorzec asynchronicznego HTTP wApi2pdfznacznie różni się od bezpośredniego generowania plików PDF w IronPDF.

Wzorzec Api2pdf:

[ApiController]
public class PdfController : ControllerBase
{
    private readonly Api2Pdf _client;

    public PdfController()
    {
        _client = new Api2Pdf("YOUR_API_KEY");
    }

    [HttpGet("generate")]
    public async Task<IActionResult> GeneratePdf()
    {
        var result = await _client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Report</h1>"
        });

        if (!result.Success)
            return BadRequest(result.Error);

        // Redirect to download URL
        return Redirect(result.FileUrl);
    }
}

Wzór IronPDF:

[ApiController]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        // Return PDF directly - no download step needed
        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }
}

IronPDF zwraca PDF bezpośrednio przez BinaryData lub Stream, eliminując wzorzec przekierowania do pobrania.

Konfiguracja wstrzykiwania zależności

// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IPdfService, IronPdfService>();
}

// IPdfService.cs
public interface IPdfService
{
    PdfDocument GenerateFromHtml(string html);
    Task<PdfDocument> GenerateFromHtmlAsync(string html);
}

// IronPdfService.cs
public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public PdfDocument GenerateFromHtml(string html) =>
        _renderer.RenderHtmlAsPdf(html);

    public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
        _renderer.RenderHtmlAsPdfAsync(html);
}

Obsługa błędów Migracja

Api2pdf wykorzystuje sprawdzanie obiektów odpowiedzi.IronPDF wykorzystuje standardowe wyjątki platformy .NET.

Wzorzec Api2pdf:

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html });

if (!result.Success)
{
    Console.WriteLine($"Error: {result.Error}");
    return;
}

Wzór IronPDF:

try
{
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
    Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
    Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

Porownanie wydajności

MetrykaApi2pdfIronPDF
Prosty HTML2–5 sekund (sieć)100–500 ms (lokalnie)
Złożona strona5–10 sekund500 ms–2 s
Partia 100 sztukMinuty (limity stawek)Sekundy (równoległe)
OfflineNiedostępneDziała w pełni
Zimny startNone~2 s (pierwsze wyświetlenie)

Wskazówki dotyczące optymalizacji wydajności

// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();

public PdfDocument GeneratePdf(string html)
{
    return SharedRenderer.RenderHtmlAsPdf(html);
}

// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
    Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);

// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0);   // No delay

Rozwiązywanie typowych problemów związanych z migracją

Problem: Plik PDF wygląda inaczej niż wynik działania Api2pdf

Dopasuj ustawienia Headless Chrome w Api2pdf:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);

Problem: Nie ładują się zasoby zewnętrzne

Skonfiguruj limity czasu ładowania zasobów:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);

// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");

Problem: Duże rozmiary plików PDF

Kompresuj obrazy po wygenerowaniu:

renderer.RenderingOptions.ImageQuality = 80;

// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");

Lista kontrolna po migracji

Po zakończeniu migracji kodu sprawdź, czy:

  • Sprawdź, czy jakość pliku PDF odpowiada oczekiwaniom
  • Przetestuj wszystkie skrajne przypadki (duże dokumenty, znaki specjalne)
  • Sprawdź wskaźniki wydajności (powinno być widać znaczną poprawę)
  • W razie potrzeby zaktualizuj konfiguracje Docker
  • Usuń konto na portaluApi2pdforaz klucze API
  • Monitorowanie aktualizacji (nie jest już potrzebne śledzenie opóźnień API)
  • Dokumentuj nowe wzorce dla swojego zespołu
  • Aktualizacja potoków CI/CD

Dodatkowe zasoby


Przejście zApi2pdfna IronPDF zmienia sposób generowania plików PDF z modelu opartego na chmurze i kosztach za każdą konwersję na lokalną, jednorazową inwestycję. Twoje poufne dokumenty pozostają w Twojej infrastrukturze, opóźnienia spadają z sekund do milisekund, a Ty eliminujesz zależność od dostawców w zakresie tej kluczowej funkcji aplikacji.

Zwróć uwagę: API2PDF i PDFSharp są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana, popierana ani sponsorowana przez Api2Pdf ani empira Software GmbH. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta