IRONSOFTWAREHOME
FILMY

Migrating fromNetBarcodeto IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 sierpnia 2026

Niniejszy przewodnik obejmuje kompletną ścieżkę migracji zNetBarcodedo IronBarcode, wraz z instrukcjami usuwania pakietów, aktualizacjami przestrzeni nazw, przykładami tłumaczenia API oraz listą kontrolną służącą do zlokalizowania wszystkich miejsc wywołań przed rozpoczęciem migracji. Poradnik dotyczy typowego scenariusza, w którym projekt zaczyna się zNetBarcodedo generacji kodu kreskowego 1D, a później wymaga formatów 2D, możliwości odczytu lub wyjaśnienia obowiązku licencji SixLabors.ImageSharp — co wszystko jest poza zakresem NetBarcode.

Dlaczego warto przejść z NetBarcode

Limit formatu: Enumeracja Type wNetBarcodedefiniuje dokładnie 11 formatów kodów kreskowych, wszystkie liniowe. Nie ma wpisu dla QR Code, DataMatrix, PDF417 ani Aztec. Gdy w projekcie pojawia się wymóg dotyczący kodu QR — na przykład w celu zapewnienia bezkontaktowych linków dostawczych, głębokich linków mobilnych lub wymogu stosowania kodu DataMatrix w branży farmaceutycznej —NetBarcodenie jest w stanie go spełnić. Jedynym rozwiązaniem w ramach struktury biblioteki jest zaprzestanie jej używania w tym formacie i wprowadzenie oddzielnego pakietu. Każde dodatkowe wymaganie formatu, które wychodzi poza 11 wpisów enum, dodaje kolejną bibliotekę do drzewa zależności.

**Brak API do odczytu:**NetBarcodegeneruje obrazy BARCODE i nie udostępnia żadnej metody ich dekodowania. Projekt, który wymaga skanowania etykiet zwrotnych, wyodrębniania wartości BarCode'ów z faktur dostawców lub sprawdzania, czy wydrukowany BarCode zgadza się z danymi źródłowymi, musi zawierać oddzielną bibliotekę do odczytu. ZXing.Net jest najczęściej wybieranym rozwiązaniem, wprowadzającym trzeci interfejs API do kodu źródłowego, który zawiera jużNetBarcodei zazwyczaj bibliotekę przeznaczoną specjalnie dla kodów QR.

**Licencja komercyjna ImageSharp:**NetBarcodezależy od SixLabors.ImageSharp, który używa podzielonej licencji komercyjnej. Bezpłatny poziom dotyczy projektów open source oraz firm, których roczne przychody nie przekraczają określonego progu; powyżej tego progu wymagana jest licencja komercyjna. Warunek ten jest osadzony w łańcuchu zależności przechodnich i nie jest wyświetlany przez NuGet podczas instalacji. Firma detaliczna lub logistyczna przetwarzająca BARCODES na dużą skalę — czyli dokładnie taki przypadek użycia, do którego skierowany jestNetBarcode— może działać powyżej progu bez oceny tego obowiązku.

Gromadzenie wielu bibliotek: Projekty, które sięgają po QRCoder, gdy potrzebne są kody QR, a następnie po ZXing.Net, gdy konieczne staje się odczytanie, gromadzą trzy oddzielne zależności związane z kodami barcode. Każde z nich ma własny harmonogram wydawania, własne wymagania dotyczące wersji ImageSharp oraz własne API, które należy utrzymywać. Konsolidacja w jedną bibliotekę, która obejmuje generowanie, odczyt, 1D i 2D, eliminuje problem zarządzania wersjami między bibliotekami.

Podstawowy problem

Projekt, który zaczyna się od samego NetBarcode, a następnie rozrasta się i wymaga formatów 2D, kończy się tego rodzaju podzielonym importem:

//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
C#

Po migracji do IronBarcode te same dwa wyniki pochodzą z jednego importu:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

##IronBarcode vs NetBarcode: Porównanie funkcji

FunkcjaNetBarcodeIronBarcode
Generowanie kodów kreskowych 1DTakTak
Generowanie kodów kreskowych 2D (QR, DataMatrix, PDF417, Aztec)NieTak
Odczytywanie BarCode z obrazówNieTak
Odczytywanie BarCode'ów z dokumentów PDFNieTak
Liczba formatów 1D1130+
Liczba formatów 2D08+
Całkowita liczba symboli1150+
GS1-128, GS1 DataBarNieTak
Formaty adresów pocztowychNieTak
Wynik w formacie SVGNieTak
Przetwarzanie wsadowePodręcznikWbudowane
Zależność ImageSharpTak (podzielona licencja)Nie
Wsparcie komercyjneSpołecznośćProfessional
Model licencjiMIT (+ warunki ImageSharp)Komercjalne

Szybki start: Migracja zNetBarcodedo IronBarcode

Krok 1: Zastąp pakiet NuGet

UsuńNetBarcodei jego zależność przechodnią od ImageSharp:

dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SHELL

Należy pamiętać, że SixLabors.ImageSharp może ponownie pojawić się na liście przywracanych pakietów, jeśli inne pakiety w projekcie również odwołują się do niego tranzytywnie. Po usunięciu, uruchom dotnet list package --include-transitive, aby potwierdzić, czy ImageSharp pozostaje i czy jego komercyjna licencja nadal ma zastosowanie do projektu.

Krok 2: Dodaj IronBarcode

dotnet add package IronBarcode
SHELL

Nazwa pakietu NuGet to IronBarcode; przestrzeń nazw używana w kodzie to IronBarCode (zwróć uwagę na wielką literę C).

Krok 3: Zaktualizuj przestrzenie nazw i zainicjuj licencję

Zastąp stare dyrektywy using w każdym pliku zawierającym wywołania NetBarcode:

// Usuń these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
C#

Dodaj inicjalizację licencji raz na starcie aplikacji — w Program.cs, Startup.cs lub w punkcie wejścia projektu:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Dostępny jest bezpłatny klucz próbny do oceny wersji próbnej; Zakup licencji usuwa znak wodny wersji próbnej z wygenerowanych obrazów BARCODE.

Przykłady migracji kodu

Generowanie kodu 128

Najczęstszy wzorzec użyciaNetBarcodeprzekłada się bezpośrednio na IronBarcode poprzez zmianę konstruktóra na metodę statyczną oraz zmianę nazwy metody.

Podejście NetBarcode:

using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

Konstruktor new Barcode(data, Type.X) zmienia się na BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). Metoda SaveImageFile() zmienia się na SaveAsPng(), SaveAsJpeg() lub SaveAsWindowsBitmap() w zależności od wymaganego formatu wyjściowego. Wszystkie dostępne opcje generowania kodów kreskowych 1D są opisane w poradnikach IronBarcode.

EAN-13

Typy BarCodes produktów detalicznych są bezpośrednio mapowane między bibliotekami za pomocą stałej rename i metody rename.

Podejście NetBarcode:

using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");

Nazwy stałych kodowania odpowiadają odpowiednikomNetBarcodeType, jeśli istnieją bezpośrednie odpowiedniki. Należy zauważyć, że UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF) i MSI (Type.MSI) nie są częścią enumeracjiNetBarcodeType — jeśli te formaty są wymagane,IronBarcode wspiera je natywnie za pomocą BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF i BarcodeEncoding.MSI.

GetImage() do ToPngBinaryData()

MetodaNetBarcodeGetImage() zwraca SixLabors.ImageSharp.Image<Rgba32>, która wymaga jawnych importów ImageSharp w kodzie wywołującym i wiąże logikę dalszą z API ImageSharp.IronBarcode umożliwia bezpośrednie metody wyjścia binarnego i strumieniowego na obiekcie GeneratedBarcode, eliminując całkowicie zależność od ImageSharp w kodzie wywołującym.

Podejście NetBarcode:

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();

Podejście IronBarcode:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);

Kod, który wykonywał dalsze manipulacje ImageSharp na wyniku Image<Rgba32> — zmiana rozmiaru, kompozycja, konwersja formatu — będzie wymagał indywidualnej oceny tych operacji, ponieważIronBarcode nie udostępnia obiektu ImageSharp.

Wspólne zastąpienieNetBarcodei QRCoder

Projekty korzystające zNetBarcodei QRCoder mogą zastąpić oba narzędzia jednocześnie. 2D generacja w IronBarcode używa tej samej metody BarcodeWriter.CreateBarcode co generacja 1D; różni się tylko stała BarcodeEncoding. Opcje kodowania i konfiguracji można znaleźć w przewodniku dotyczącym generowania BARCODE-ów 2D.

PodejścieNetBarcodei QRCoder:

using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));

Podejście IronBarcode:

using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

Dodanie funkcji czytania

Jeśli w projekcie wykorzystywano również bibliotekę ZXing.Net do odczytu, zależność tę można usunąć wraz z biblioteką NetBarcode. IronBarcode's BarcodeReader obsługuje obrazy i dokumenty PDF z automatycznym wykrywaniem formatu.

Podejście ZXing.Net:

using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call

Podejście IronBarcode:

using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}

Pełna dokumentacja dotycząca opcji odczytu jest dostępna w przewodniku odczytu BARCODE-ów z obrazów, obejmującym ustawienia regulacji prędkości, wykrywania wielu BARCODE-ów oraz korekcji obrazu.

Dokumentacja APINetBarcodedo IronBarcode

NetBarcodeIronBarcodeUwagi
new Barcode(data, Type.Code128)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)Konstruktor → metoda statyczna
new Barcode(data, Type.EAN13)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13)Bezpośrednie odwzorowanie
new Barcode(data, Type.Code39)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39)Bezpośrednie odwzorowanie
new Barcode(data, Type.EAN8)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8)Bezpośrednie odwzorowanie
new Barcode(data, Type.Codabar)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar)Bezpośrednie odwzorowanie
new Barcode(data, Type.Code93)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93)Bezpośrednie odwzorowanie
barcode.SaveImageFile("x.png").SaveAsPng("x.png")Zmiana nazwy metody
barcode.SaveImageFile("x.jpg").SaveAsJpeg("x.jpg")Zmiana nazwy metody
barcode.GetImage()Image<Rgba32>.ToPngBinaryData() lub .SaveAsPng()Brak eksponowanego typu ImageSharp
Brak Type.QRCodeBarcodeEncoding.QRCodeNowa funkcja
Brak Type.DataMatrixBarcodeEncoding.DataMatrixNowa funkcja
Brak Type.PDF417BarcodeEncoding.PDF417Nowa funkcja
Brak Type.AztecBarcodeEncoding.AztecNowa funkcja
Brak API do odczytuBarcodeReader.Read(path)Nowa funkcja
using NetBarcode;using IronBarCode;Zastąpienie przestrzeni nazw
using SixLabors.ImageSharp;UsuńNie jest już potrzebne
using SixLabors.ImageSharp.PixelFormats;UsuńNie jest już potrzebne
using SixLabors.Fonts;UsuńNie jest już potrzebne

Pełna lista stałych kodowania znajduje się w opisie obsługiwanych formatów BarCode.

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Zależność przechodnia ImageSharp pozostaje po usunięciu pakietu

Problem: Po uruchomieniu dotnet remove package NetBarcode, dotnet restore pokazuje, że SixLabors.ImageSharp jest nadal obecny w drzewie zależności, ponieważ inny pakiet w projekcie również się do niego odwołuje.

Rozwiązanie: Uruchom dotnet list package --include-transitive, aby zidentyfikować, który pakiet nadal wciąga ImageSharp. Jeśli to tylko NetBarcode, usunięcie jawnego odniesienia do pakietu i przywrócenie powinno to rozwiązać. Jeśli inny pakiet jest odpowiedzialny, zależność od ImageSharp tego pakietu i jego warunek licencji komercyjnej pozostają w zakresie niezależnie od usunięcia NetBarcode.

dotnet list package --include-transitive | grep -i imagesharp
SHELL

Problem 2: Typ obrazu<Rgba32> nie może być rozwiązany po usunięciu

Problem: Po usunięciu pakietu SixLabors.ImageSharp, każda zmienna zadeklarowana jako Image<Rgba32> lub parametr o typie SixLabors.ImageSharp.Image<Rgba32> powoduje błąd kompilacji, ponieważ typ nie jest już dostępny.

Rozwiązanie: Zastąp każde użycie odpowiednią metodą wyjściową IronBarcode. Jeśli zmienna była używana do uzyskiwania bajtów, zastąp ją .ToPngBinaryData(). Jeśli była zapisywana do strumienia, zastąp ją .SaveAsPng(stream). Jeśli była zapisywana do pliku, zastąp ją .SaveAsPng(path).

// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);

Problem 3: Kontekst zmiany łamiącej w wersji 1.8

Problem: Bazowe kodu, które były napisane przeciwkoNetBarcodeprzed v1.8 mogą mieć wywołania GetImage(), które przechowywały wynik bez jawnego typowania, opierając się na wewnętrznym typie zwracanym sprzed v1.8. Te wywołania mogą już być zepsute po aktualizacji NetBarcode, niezależnie od migracji IronBarcode.

Rozwiązanie: Skorzystaj z migracji do IronBarcode jako okazji do równoczesnego rozwiązania wszelkich usterek istniejących przed v1.8. Wszystkie miejsca wywołań GetImage() powinny zostać zlokalizowane za pomocą projektowego wyszukiwania i zastąpione odpowiednią metodą wyjścia IronBarcode podczas przepływu migracji. Polecenia grep w poniższej liście kontrolnej migracji identyfikują te lokalizacje.

Lista kontrolna dla migracji z NetBarcode

Przed migracją

Przeglądaj całe użycieNetBarcodeprzed wprowadzeniem jakichkolwiek zmian:

grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
SHELL
  • Zidentyfikuj każdy plik, który wymaga zmiany dyrektywy using
  • Zanotuj wszystkie miejsca wywołań GetImage() i sposób, w jaki zwracany obiekt Image<Rgba32> jest używany dalej
  • Sprawdź, czy QRCoder lub ZXing.Net są obecne i można je usunąć w tym samym przebiegu
  • Uruchom dotnet list package --include-transitive, aby przed usunięciem udokumentować obecny stan zależności ImageSharp
  • Uzyskaj klucz licencyjny IronBarcode(darmowy klucz próbny jest dostępny bez zakupu)

Aktualizacja kodu

  1. Uruchom dotnet remove package NetBarcode
  2. Uruchom dotnet remove package SixLabors.ImageSharp, jeśli nie jest używany przez inne pakiety
  3. Uruchom dotnet add package IronBarcode
  4. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; na starcie aplikacji
  5. Zastąp using NetBarcode; using IronBarCode; w każdym dotkniętym pliku
  6. Usuń using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats; i using SixLabors.Fonts; z wszystkich plików
  7. Przetłumacz każde wywołanie new Barcode(data, Type.X) do BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) używając tabeli mapowania API
  8. Zastąp SaveImageFile() SaveAsPng() lub odpowiednią metodą specyficzną dla formatu
  9. Zastąp wywołania GetImage() ToPngBinaryData(), SaveAsPng() lub SaveAsPng(stream) zgodnie z potrzebą
  10. Jeśli usuwasz QRCoder: zamień łańcuchy QRCodeGenerator + PngByteQRCode na BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  11. Jeśli usuwasz ZXing.Net: zamień konfigurację czytnika na BarcodeReader.Read(path)

Testy po migracji

  • Zbuduj projekt i potwierdź zero błędów kompilacji
  • Uruchom istniejące testy jednostkowe w celu sprawdzenia wygenerowanego kodu kreskowego
  • Zweryfikuj wizualnie obrazy kodów kreskowych pod kątem poprawnej symboliki i czytelnej treści
  • Zweryfikuj wyjście kodu QR, jeśli ten format został dodany podczas migracji
  • Przetestuj funkcjonalność odczytu, jeśli dodano skanowanie kodu kreskowego
  • Uruchom dotnet list package --include-transitive, aby potwierdzić, że ImageSharp nie jest już obecny, jeśli został usunięty
  • Zatwierdź, że inicjalizacja klucza licencyjnego działa przed pierwszą operacją kodu kreskowego

Kluczowe korzyści wynikające z migracji do IronBarcode

Zunifikowane pokrycie formatu: Po migracji kody QR, DataMatrix, PDF417, Aztec i wszystkie inne formaty 2D są dostępne poprzez to samo wywołanie API używane dla Code128 i EAN-13. Nie jest potrzebna druga biblioteka, gdy wymagania dotyczące formatu się rozszerzają, a stała BarcodeEncoding to jedyna rzecz, która zmienia się między typami formatów.

Wbudowane odczytywanie: BarcodeReader.Read() obsługuje pliki obrazów i dokumenty PDF z automatycznym wykrywaniem formatu. Projekty, które wcześniej wymagały ZXing.Net do odczytu, mogą usunąć to zależność i skonsolidować do jednej biblioteki kodów kreskowych, zmniejszając powierzchnię API, którą deweloperzy muszą poznać.

**Brak zobowiązań względem ImageSharp:**IronBarcode nie ma zależności od SixLabors.ImageSharp. Po migracji podzielony warunek licencyjny zawarty w przejrzystych zależnościachNetBarcodenie ma już zastosowania do projektu. Przeglądy zgodności licencyjnej stają się prostsze, ponieważ zobowiązania biblioteki kodów kreskowych są bezpośrednio określone i nie zależą od progu przychodów zewnętrznej biblioteki przetwarzania obrazów.

**Stabilne publiczne API:**IronBarcode nie ujawnia typów zewnętrznych w swojej publicznej powierzchni API. Zwracany typ GeneratedBarcode z BarcodeWriter.CreateBarcode jest własnym typem IronBarcode, co oznacza, że przyszłe aktualizacje wewnętrznego renderowania IronBarcode nie spowodują zerwania zmian w wywołującym kodzie w sposób, w jaki zrobiła to zmiana typuNetBarcodew wersji v1.8 GetImage().

Pojedyncza zależność do utrzymania: Zastąpienie NetBarcode, QRCoder i ZXing.Net przez IronBarcode redukuje trzy cykle aktualizacji, trzy zestawy notatek o wersjach i trzy potencjalne konflikty wersji do jednego. W miarę postępu wersji .NET i konieczności aktualizacji zależności, praca konserwacyjna obejmuje jedną bibliotekę zamiast trzech.

Zwróć uwagę: NetBarcode, QRCoder i ZXing.NET są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana z, popierana przez, ani sponsorowana przez NetBarcode, QRCoder lub ZXing.NET. 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