IRONSOFTWAREHOME
KORZYSTANIE Z IRONPDF

Jak porównać dwa pliki PDF w języku C# przy użyciu IronPDF

Curtis Chau
Curtis Chau
Updated: 12 lipca 2026

Aby wyświetlić pliki PDF z bazy danych w ASP.NET, należy pobrać zapisane dane binarne i wyrenderować je za pomocą klasy PdfDocument biblioteki IronPDF, która efektywnie obsługuje tablice bajtów i zapewnia wynik zgodny z przeglądarkami wraz z opcjami dostosowywania.

Czym jest wyświetlanie bazy danych PDF w ASP.NET?

Zarządzanie dokumentami PDF w aplikacjach ASP.NET często wiąże się z przechowywaniem plików PDF bezpośrednio w bazie danych, a nie w systemie plików. Ta metoda zapewnia większe bezpieczeństwo, scentralizowane tworzenie kopii zapasowych oraz uproszczone wdrażanie. Jednak pobieranie i wyświetlanie dokumentów PDF z bazy danych może być trudne bez odpowiednich narzędzi.

Przechowywanie plików PDF jako danych binarnych w tabeli bazy danych pozwala na lepszą kontrolę nad dostępem do dokumentów i wersjonowaniem. Gdy chcesz wyświetlić użytkownikom dokumenty PDF, musisz sprawnie pobrać tablicę bajtów z bazy danych i wyrenderować ją w przeglądarce. IronPDF upraszcza cały ten proces dzięki wydajnemu interfejsowi API do obsługi dokumentów PDF w aplikacjach ASP.NET.

Ten samouczek pokazuje, jak wyświetlać pliki PDF z bazy danych w ASP.NET, korzystając ze sprawdzonych funkcji IronPDF. Nauczysz się tworzyć kompletne rozwiązanie do przesyłania, przechowywania i wyświetlania plików PDF, zapewniające optymalną wydajność i bezpieczeństwo. Biblioteka obsługuje różne opcje renderowania oraz zaawansowane funkcje manipulacji plikami PDF, co ułatwia tworzenie systemów zarządzania dokumentami na poziomie produkcyjnym.

Jak zainstalować bibliotekę PDF w projekcie ASP.NET?

Przed wdrożeniem funkcji wyświetlania plików PDF upewnij się, że w projekcie ASP.NET zainstalowano IronPDF. Otwórz konsolę menedżera pakietów w Visual Studio i uruchom jedno z poniższych poleceń w zależności od preferowanych narzędzi:

PM > Install-Package IronPdf

Mozesz rowniez zainstalowac IronPDF przez interfejs Menadzera pakietow NuGet, wyszukujac IronPdf na karcie Przegladaj w projekcie. Po instalacji należy ustawić klucz licencyjny podczas uruchamiania aplikacji:

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

Bezpłatna licencja próbna zapewnia pełny dostęp do wszystkich funkcji podczas okresu testowego. W przypadku wdrożeń produkcyjnych zapoznaj się z dostępnymi poziomami licencji, aby znaleźć opcję dostosowaną do skali Twojego projektu.

Jaka struktura bazy danych jest wymagana?

Struktura tabeli bazy danych musi zawierac kolumne varbinary(max) do przechowywania plikow PDF jako danych binarnych. Tabela powinna zawierać pola metadanych, takie jak nazwa pliku, data przesłania i rozmiar pliku, aby ułatwić zarządzanie dokumentami. Poniższy kod SQL tworzy tabelę odpowiednią dla tego scenariusza:

using IronPdf;
using System.Data.SqlClient;
using System.IO;
using System.Configuration;

Skonfiguruj ciag polaczenia w pliku web.config, aby nawiazac lacznosc z baza danych. Implementacja przeglądarki plików PDF będzie wykorzystywać to połączenie do pobierania przesłanych plików z bazy danych i płynnego wyświetlania treści PDF.

Jakich przestrzeni nazw wymaga to rozwiązanie?

Rozwiązanie wykorzystuje standardowe przestrzenie nazw ADO.NET wraz z przestrzenią nazw IronPDF. Nie potrzebujesz żadnego zewnętrznego ORM — bezpośrednie podejście ADO.NET ogranicza zależności do minimum i zapewnia pełną kontrolę nad wykonywaniem zapytań. Upewnij się, że ciąg połączenia wskazuje instancję serwera SQL, na której znajduje się tabela przechowywania plików PDF.

Jak utworzyć tabelę bazy danych dla plików PDF?

Zacznij od utworzenia tabeli bazy danych zaprojektowanej specjalnie do przechowywania dokumentów PDF. Struktura tabeli powinna uwzględniać zarówno dane binarne, jak i niezbędne metadane do zarządzania dokumentami PDF:

CREATE TABLE PdfDocuments (
    Id INT PRIMARY KEY IDENTITY(1,1),
    FileName NVARCHAR(255) NOT NULL,
    FileData VARBINARY(MAX) NOT NULL,
    ContentType NVARCHAR(100) DEFAULT 'application/pdf',
    FileSize INT,
    UploadDate DATETIME DEFAULT GETDATE(),
    CreatedBy NVARCHAR(100),
    LastModified DATETIME,
    DocumentVersion INT DEFAULT 1
);
Text

Ta tabela przechowuje kazdy plik PDF jako tablice bajtow w kolumnie FileData. Typ danych varbinary(max) moze przechowywac pliki do 2 GB, co jest wystarczajace dla wiekszosci dokumentow PDF. Pole FileName przechowuje oryginalna nazwe pliku do wyswietlania i pobierania.

Jak można poprawić wydajność bazy danych w zakresie wyszukiwania plików PDF?

Rozważ dodanie indeksów do często wyszukiwanych kolumn, aby uzyskać lepszą wydajność podczas pobierania dokumentów PDF. Poniższy kod SQL tworzy indeksy w kolumnach, które najprawdopodobniej pojawią się w klauzulach WHERE i ORDER BY:

CREATE INDEX IX_PdfDocuments_UploadDate
ON PdfDocuments(UploadDate DESC);

CREATE INDEX IX_PdfDocuments_FileName
ON PdfDocuments(FileName);
Text

Taka struktura zapewnia wydajne przechowywanie i pobieranie przesłanych plików, zachowując jednocześnie elastyczność w zakresie dodawania dodatkowych pól metadanych w razie potrzeby. W przypadku bardzo dużych plików PDF należy rozważyć, czy przechowywanie w bazie danych jest odpowiednim rozwiązaniem dla danej architektury, czy też lepszym rozwiązaniem w przypadku dużych skal byłoby podejście hybrydowe — przechowywanie plików na dysku lub w pamięci obiektowej, a w bazie danych pozostawianie jedynie metadanych.

Porównanie strategii przechowywania plików PDF
StrategiaNajlepsze dlaZaletyUwagi
Baza danych (VARBINARY)Pliki o małej i średniej wielkości, wysoki poziom bezpieczeństwaSpójność transakcyjna, scentralizowane tworzenie kopii zapasowychMoże szybko zwiększyć rozmiar bazy danych
System plikówDuże pliki, wysoka przepustowośćSzybki wczyt i zapis plików, niskie obciążenie bazy danychWymaga oddzielnej strategii tworzenia kopii zapasowych
Pamięć obiektowa (Azure Blob/S3)Wdrożenia w chmurze, nieograniczona skalaEkonomiczne, o wysokiej dostępnościDodatkowa zależność SDK

Jak przesłać pliki PDF do bazy danych?

Zaimplementuj funkcjonalnosc przesylania uzywajac kontrolki FileUpload w ASP.NET. Dodaj ten kod HTML do swojej strony .aspx w elemencie formularza z odpowiednią walidacją:

<div class="pdf-upload-container">
    <asp:FileUpload ID="FileUpload1" runat="server" accept=".pdf" />
    <asp:Button ID="btnUpload" Text="Upload PDF"
                OnClick="btnUpload_Click" runat="server" CssClass="btn-primary" />
    <asp:Label ID="lblMessage" runat="server" CssClass="status-message" />
    <div class="file-info">
        <asp:Label ID="lblFileInfo" runat="server" />
    </div>
</div>
HTML

Przykładowy wynik interfejsu użytkownika

Interfejs aplikacji ASP.NET pokazujacy formularz przesylania PDF z przyciskami 'Wybierz plik' i 'Przeslij PDF', oraz pusta sekcja Lista dokumentow PDF poniżej, do zarzadzania dokumentami

Jak radzisz sobie z zdarzeniami związanymi z przesyłaniem plików?

Przycisk przesyłania uruchamia procedurę obsługi zdarzeń po stronie serwera. Oto pełna implementacja funkcji przesyłania, która konwertuje przesłane pliki na tablicę bajtów i zapisuje je z odpowiednią obsługą błędów:

protected void btnUpload_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile && FileUpload1.PostedFile.ContentType == "application/pdf")
    {
        try
        {
            string fileName = FileUpload1.FileName;
            byte[] fileBytes = FileUpload1.FileBytes;
            int maxFileSize = 10 * 1024 * 1024; // 10MB limit

            if (fileBytes.Length > maxFileSize)
            {
                lblMessage.Text = "File size exceeds 10MB limit.";
                return;
            }

            // Validate PDF using IronPDF
            using (var stream = new MemoryStream(fileBytes))
            {
                var testPdf = new IronPdf.PdfDocument(stream);
                if (testPdf.PageCount == 0)
                {
                    lblMessage.Text = "Invalid PDF file.";
                    return;
                }
            }

            string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(constr))
            {
                string query = "INSERT INTO PdfDocuments (FileName, FileData, FileSize, CreatedBy) " +
                               "VALUES (@FileName, @FileData, @FileSize, @CreatedBy)";
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    cmd.Parameters.AddWithValue("@FileName", fileName);
                    cmd.Parameters.AddWithValue("@FileData", fileBytes);
                    cmd.Parameters.AddWithValue("@FileSize", fileBytes.Length);
                    cmd.Parameters.AddWithValue("@CreatedBy", User.Identity.Name ?? "Anonymous");

                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            lblMessage.Text = "PDF document uploaded successfully!";
            lblFileInfo.Text = $"File: {fileName} ({fileBytes.Length / 1024}KB)";
            LoadPdfList();
        }
        catch (Exception ex)
        {
            lblMessage.Text = "Error uploading file: " + ex.Message;
        }
    }
    else
    {
        lblMessage.Text = "Please select a valid PDF file.";
    }
}

Ten kod sprawdza typ pliku przed przesłaniem, zapewniając, że w bazie danych przechowywane są wyłącznie prawidłowe pliki PDF. Konwersja do tablicy bajtow zachodzi automatycznie poprzez wlasciwosc FileBytes. Dodatkowa weryfikacja obejmuje sprawdzenie integralności pliku PDF oraz limitów rozmiaru pliku. Użycie IronPDF do otwarcia tablicy bajtów przed zapisaniem potwierdza, że plik jest autentycznym, możliwym do przetworzenia dokumentem PDF — a nie tylko plikiem z zmienionym rozszerzeniem.

Interfejs użytkownika z przesłanymi plikami

Interfejs aplikacji ASP.NET pokazujacy funkcjonalnosc przesylania PDF z formularzem przesylania plikow i tabela wyswietlajaca przeslane dokumenty PDF z przyciskami akcji do podgladu i pobierania dla pelnego zarzadzania dokumentami

Jak pobierać i wyświetlać pliki PDF z bazy danych?

IronPDF doskonale radzi sobie z renderowaniem dokumentów PDF pobranych z bazy danych. Biblioteka oferuje wiele opcji wyświetlania treści PDF w przeglądarkach z zaawansowanymi możliwościami renderowania. Najpierw pobierz dane binarne z tabeli bazy danych, a następnie przekaż je do IronPDF w celu przetworzenia, zanim zostaną przesłane z powrotem do klienta:

private void LoadPdfList()
{
    string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(constr))
    {
        string query = @"SELECT Id, FileName, FileSize, UploadDate, CreatedBy
                        FROM PdfDocuments
                        ORDER BY UploadDate DESC";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            conn.Open();
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adapter.Fill(dt);

            foreach (DataRow row in dt.Rows)
            {
                int fileSize = Convert.ToInt32(row["FileSize"]);
                row["FileSize"] = FormatFileSize(fileSize);
            }

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
}

private string FormatFileSize(int bytes)
{
    if (bytes < 1024) return bytes + " B";
    if (bytes < 1048576) return (bytes / 1024) + " KB";
    return (bytes / 1048576) + " MB";
}

private PdfData GetPdfFromDatabase(int id)
{
    byte[] pdfBytes = null;
    string filename = "";
    string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(constr))
    {
        string query = "SELECT FileData, FileName FROM PdfDocuments WHERE Id = @Id";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.AddWithValue("@Id", id);
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    pdfBytes = (byte[])reader["FileData"];
                    filename = reader["FileName"].ToString();
                }
            }
        }
    }
    if (pdfBytes != null)
    {
        return new PdfData { Bytes = pdfBytes, FileName = filename };
    }
    return null;
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "ViewPdf")
    {
        int documentId = Convert.ToInt32(e.CommandArgument);
        ViewPdfDocument(documentId);
    }
    else if (e.CommandName == "DownloadPdf")
    {
        int documentId = Convert.ToInt32(e.CommandArgument);
        DownloadPdfDocument(documentId);
    }
}

private void ViewPdfDocument(int id)
{
    var pdfData = GetPdfFromDatabase(id);
    if (pdfData != null)
    {
        IronPdf.PdfDocument pdf;
        using (var stream = new System.IO.MemoryStream(pdfData.Bytes))
        {
            pdf = new IronPdf.PdfDocument(stream);
        }

        // Apply security settings
        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", $"inline; filename={pdfData.FileName}");
        Response.AddHeader("content-length", pdf.BinaryData.Length.ToString());
        Response.BinaryWrite(pdf.BinaryData);
        Response.End();
    }
}

Metoda ViewPdfDocument strumieniowo przesyla dokument z powrotem do klienta z zastosowanymi odpowiednimi ustawieniami zabezpieczen. Zawartosc dyspozycji inline informuje przegladarke, aby wyswietlac PDF zamiast proponowac jego pobranie. Możesz dostosować ustawienia zabezpieczeń, takie jak uprawnienia do drukowania i ograniczenia kopiowania i wklejania, aby spełnić wymagania polityki dotyczącej dokumentów.

Jak radzisz sobie z parametrami renderowania plików PDF?

Parametry polecenia SQL mają kluczowe znaczenie dla bezpiecznego pobrania konkretnego pliku PDF na podstawie jego klucza głównego. Zapytania parametryzowane zapobiegają atakom typu SQL injection i zapewniają prawidłowe powiązanie danych. Po pobraniu danych binarnych, IronPDF laduje je z MemoryStream, dajac ci pelny dostep do obiektu dokumentu do dalszej manipulacji przed przeslaniem go do przegladarki.

Wyświetlanie przesłanego pliku PDF

Interfejs przegladarki PDF pokazujacy dokument zatytulowany 'Co to jest PDF?' z tekstem wyjasniajacym o formacie Portable Document Format, wyswietlony przy powiększeniu 100% z kontrolkami nawigacji i wskaznikami wsparcia dla wielu stron

Jakie zaawansowane funkcje można dodać do plików PDF przed wyświetleniem?

Możliwości IronPDF w zakresie obróbki plików PDF wykraczają poza zwykłe wyświetlanie. Przed renderowaniem można modyfikować dokument PDF, dodając znaki wodne, nagłówki i stopki oraz podpisy cyfrowe:

// Add a confidentiality watermark before displaying
pdf.ApplyWatermark("<h2 style='color:red; font-family:Arial'>CONFIDENTIAL</h2>",
                   rotation: 30,
                   opacity: 50);

// Add page numbers in the footer
pdf.AddTextHeaders("{page} of {total-pages}",
                  IronPdf.Editing.TextHeaderFooter.DisplayLocation.BottomCenter);

// Add document metadata
pdf.MetaData.Author = "Your Application";
pdf.MetaData.ModifiedDate = DateTime.Now;

Wyświetlanie pliku PDF ze znakiem wodnym

Przegladarka PDF wyswietla dokument o 'Co to jest PDF?' z szczegolowym tekstem i wodnym znakiem 'POUFNE' w przekroju diagonalnym, demonstrujacym zdolnosci IronPDF do watermarkingu dla bezpieczenstwa dokumentu

Znak wodny jest szczególnie przydatny podczas wyświetlania dokumentów, które użytkownicy powinni przeglądać, ale nie powielać dosłownie. Można również wyodrębnić tekst z pliku PDF przed wyświetleniem w celu utworzenia indeksów wyszukiwania lub przekonwertować określone strony na obrazy w celu wygenerowania miniatur.

Dlaczego to podejście sprawdza się w aplikacjach produkcyjnych?

Połączenie ADO.NET z IronPDF zapewnia prosty wzorzec, który można skalować od małych narzędzi wewnętrznych po korporacyjne systemy zarządzania dokumentami. Podejście jest całkowicie po stronie serwera — nie jest wymagana żadna biblioteka renderowania PDF po stronie klienta, a wbudowana przeglądarka PDF w przeglądarce obsługuje wyświetlanie po zwróceniu prawidłowego typu MIME.

Główne zalety tego wzorca to:

  • Walidacja w momencie przesyłania: IronPDF otwiera plik, zanim trafi on do bazy danych, natychmiast odrzucając pliki uszkodzone lub niebędące plikami PDF.
  • Kontrola bezpieczeństwa w czasie wyświetlania: uprawnienia, takie jak drukowanie i kopiowanie-wklejanie, są egzekwowane przez IronPDF, zanim bajty dotrą do przeglądarki.
  • Minimalna ilość kodu po stronie klienta: przeglądarka obsługuje renderowanie natywnie, co zmniejsza złożoność kodu JavaScript.
  • Elastyczne przetwarzanie wstępne: Możesz konwertować ciągi HTML na PDF, łączyć dokumenty za pomocą operacji scałania i dzielenia lub dodawać niestandardowe znaki wodne przed strumieniowaniem — wszystko w ramach tej samej metody po stronie serwera.

Jak radzisz sobie z integracją przeglądarek i opcjami pobierania?

Aby zapewnić lepszą integrację z siecią, należy używać JavaScript do otwierania dokumentów w nowej karcie zamiast zastępowania bieżącej strony. Dzięki temu użytkownicy mają lepsze wrażenia podczas przeglądania listy dokumentów:

function openPdfInNewTab(documentId) {
    window.open('/PdfHandler.ashx?id=' + documentId, '_blank');
}

function openPdfInModal(documentId) {
    var modal = document.getElementById('pdfModal');
    var iframe = document.getElementById('pdfFrame');
    iframe.src = '/PdfHandler.ashx?id=' + documentId;
    modal.style.display = 'block';
}
JavaScript

Sciezka pobierania podaza tym samym logicznym wzorcem pobierania danych z bazy, ale uzywa attachment zamiast inline jako dyspozycje zawartosci. To zmusza przeglądarkę do zapisania pliku zamiast jego wyświetlenia. Obie sciezki dziela ten sam pomocnik GetPdfFromDatabase, pozwalajacy na zachowanie DRY w kodzie dostepu do danych.

Dla przepływów pracy opartych na formularzach, eksploruj możliwości wypełniania formularzy PDF IronPDF — możesz wstępnie wypełnić pola formularza przed wyświetleniem lub pobraniem dokumentu, co jest użyteczne dla scenariuszy generowania faktur i zarządzania umowami.

Jakie są kwestie związane z bezpieczeństwem w przypadku udostępniania plików PDF?

Zawsze sprawdzaj, czy użytkownik składający żądanie ma uprawnienia dostępu do żądanego identyfikatora dokumentu przed wysłaniem danych. Prosty identyfikator całkowitoliczbowy w ciągu zapytania jest łatwy do wyliczenia — bez kontroli autoryzacji każdy uwierzytelniony użytkownik mógłby wyświetlić dowolny dokument, odgadując identyfikatory.

Najlepsze praktyki obejmują:

  • Przechowuj kolumne CreatedBy lub OwnerId i weryfikuj ja wzgledem aktualnej tozsamosci uzytkownika przed zapytaniem FileData.
  • Należy używać identyfikatorów GUID zamiast kolejnych liczb całkowitych jako identyfikatorów dokumentów, aby uniemożliwić ich wyliczenie.
  • Zastosuj ochronę hasłem plików PDF podczas przesyłania w przypadku dokumentów o wysokim stopniu poufności, tak aby sam plik był chroniony nawet w przypadku uzyskania do niego dostępu poza aplikacją.
  • Rejestruj wszystkie zdarzenia wyświetlania i pobierania na potrzeby ścieżek audytu.

Jeśli chodzi o zewnętrzne źródła dotyczące wzorców bezpieczeństwa ASP.NET, autorytatywnymi wskazówkami są: OWASP ASP.NET Security Cheat Sheet oraz wytyczne Microsoftu dotyczące bezpiecznego kodowania dla ASP.NET. Wpis w galerii NuGet dla IronPDF również dokumentuje historię wersji i zależności.

Jak rozpocząć korzystanie z PDF Database Display?

Aby wdrożyć to rozwiązanie we własnym projekcie:

  1. Zainstaluj IronPDF za pomoca NuGet (Install-Package IronPdf lub dotnet add package IronPdf).
  2. Utworz tabele PdfDocuments uzywajac powyzszego schematu SQL.
  3. Dodaj procedurę obsługi przesyłania do kodu źródłowego pliku .aspx.
  4. Dodaj procedury obsługi wyświetlania i pobierania, które przesyłają bajty za pośrednictwem IronPDF.
  5. Podłącz GridView za pomocą poleceń wiersza wskazujących na procedury obsługi.

Możesz zapoznać się z pełnym zestawem funkcji IronPDF, aby odkryć dodatkowe możliwości, takie jak konwersja HTML do PDF oraz łączenie i dzielenie plików PDF, które naturalnie wpisują się w procesy zarządzania dokumentami. Rozpocznij bezpłatny okres próbny, aby przetestować pełną wersję API przed zakupem licencji.

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