Sumatra PDF vs IronPDF: Przewodnik porównania technicznego
Kiedy programiści .NET oceniają rozwiązania PDF,Sumatra PDFiIronPDFreprezentują zasadniczo różne kategorie narzędzi.Sumatra PDFto lekka aplikacja do przeglądania plików PDF na komputerach stacjonarnych, natomiastIronPDFto kompleksowa biblioteka .NET do programowego generowania i edycji plików PDF. W niniejszym porównaniu technicznym przeanalizowano oba rozwiązania, aby pomóc profesjonalnym programistom i architektom zrozumieć, kiedy każde z nich jest odpowiednie oraz dłączego zespoły często przechodzą z wzorców integracjiSumatra PDFna podejście oparte na bibliotece IronPDF.
Zrozumienie Sumatra PDF
Sumatra PDF to lekki, otwarty czytnik plików PDF, znany ze swojej prostoty i szybkości działania. Filozofia minimalistycznego projektowania zapewnia najwyższą wydajność nawet na starszych systemach.Sumatra PDFto przede wszystkim samodzielna aplikacja, której celem jest zapewnienie użytkownikom szybkiego i niezawodnego sposobu przeglądania dokumentów PDF.
Ważna uwaga:Sumatra PDFto aplikacja do przeglądania plików PDF na komputerze, a nie biblioteka programistyczna. Jeśli używaszSumatra PDFw swojej aplikacji .NET, prawdopodobnie uruchamiasz ją jako proces zewnętrzny w celu wyświetlania plików PDF, używasz jej do drukowania plików PDF za pomocą wiersza poleceń lub polegasz na niej jako na zależności, którą użytkownicy muszą zainstalować.
Prostota narzędzia wiąże się z pewnymi ograniczeniami dla programistów:
- Tylko do odczytu — jest to wyłącznie czytnik plików PDF, pozbawiony funkcji tworzenia lub edycji plików PDF
- Aplikacja samodzielna — nie jest to biblioteka, którą można zintegrować z innymi aplikacjami
- Licencja GPL — LicencjaGPLogranicza jej wykorzystanie w produktach komercyjnych
Zrozumienie IronPDF
IronPDF to kompleksowa biblioteka .NET zaprojektowana specjalnie dla programistów, którzy muszą zintegrować funkcjonalność PDF ze swoimi aplikacjami. W przeciwieństwie do Sumatra PDF,IronPDFzapewnia pełne możliwości tworzenia, edytowania, odczytywania i manipulowania plikami PDF programowo w aplikacjach C#.
IronPDF działa jako samodzielna biblioteka, którą można łatwo zintegrować z dowolną aplikacją C#, co zmniejsza obciążenie infrastruktury. Biblioteka wykorzystuje nowoczesny silnik renderujący Chromium do konwersji HTML na PDF i zapewnia natywną integrację z platformą .NET bez konieczności stosowania zewnętrznych procesów lub zależności instalowanych przez użytkownika.
Podstawowa różnica: aplikacja a biblioteka
Najważniejsza różnica międzySumatra PDFaIronPDFpolega na ich przeznaczeniu architektonicznym:
| Charakterystyka | Sumatra PDF | IronPDF |
|---|---|---|
| Typ | Zastosowanie | Biblioteka |
| Integracja | Proces zewnętrzny | Natywny .NET |
| Zależność użytkownika | Wymagana instalacja | W pakiecie z aplikacją |
| API | Tylko wiersz poleceń | Pełne API C# |
| Wsparcie internetowe | Nie | Tak |
| Licencja komercyjna | GPL | Tak |
Główne problemy związane z integracją Sumatra PDF
| Problem | Wpływ |
|---|---|
| Nie jest to biblioteka | Nie można programowo tworzyć ani edytować plików PDF |
| Proces zewnętrzny | Wymaga uruchamiania oddzielnych procesów |
| Licencja GPL | Ograniczenia dotyczące oprogramowania komercyjnego |
| Zależność użytkownika | Użytkownicy muszą zainstalować Sumatrę osobno |
| Brak API | Ograniczone do argumentów wiersza poleceń |
| Tylko do przeglądania | Nie można tworzyć, edytować ani modyfikować plików PDF |
| Brak wsparcia internetowego | Aplikacja przeznaczona wyłącznie na komputery stacjonarne |
Konwersja HTML do PDF
Konwersja HTML do PDF pokazuje zasadniczą różnicę w możliwościach między aplikacją do przeglądania a biblioteką programistyczną.
Sumatra PDFHTML do PDF
Sumatra PDF nie może konwertować HTML na PDF — wymaga zewnętrznych narzędzi jako pośredników:
// NuGet: Install-Package SumatraPDF (Note: Sumatra is primarily a viewer, not a generator)
//Sumatra PDFdoesn't have direct C# integration for HTML do PDF conversion
// You would need to use external tools or libraries and then open with Sumatra
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//Sumatra PDFcannot directly convert HTML to PDF
// You'd need to use wkhtmltopdf or similar, then view in Sumatra
string htmlFile = "input.html";
string pdfFile = "output.pdf";
// Using wkhtmltopdf as intermediary
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "wkhtmltopdf.exe",
Arguments = $"{htmlFile} {pdfFile}",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
// Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile);
}
}
// NuGet: Install-Package SumatraPDF (Note: Sumatra is primarily a viewer, not a generator)
//Sumatra PDFdoesn't have direct C# integration for HTML do PDF conversion
// You would need to use external tools or libraries and then open with Sumatra
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//Sumatra PDFcannot directly convert HTML to PDF
// You'd need to use wkhtmltopdf or similar, then view in Sumatra
string htmlFile = "input.html";
string pdfFile = "output.pdf";
// Using wkhtmltopdf as intermediary
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "wkhtmltopdf.exe",
Arguments = $"{htmlFile} {pdfFile}",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
// Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile);
}
}
Imports System.Diagnostics
Imports System.IO
Module Program
Sub Main()
' Sumatra PDF cannot directly convert HTML to PDF
' You'd need to use wkhtmltopdf or similar, then view in Sumatra
Dim htmlFile As String = "input.html"
Dim pdfFile As String = "output.pdf"
' Using wkhtmltopdf as intermediary
Dim psi As New ProcessStartInfo With {
.FileName = "wkhtmltopdf.exe",
.Arguments = $"{htmlFile} {pdfFile}",
.UseShellExecute = False
}
Process.Start(psi)?.WaitForExit()
' Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile)
End Sub
End Module
Takie podejście wymaga:
- Instalacja narzędzia zewnętrznego (wkhtmltopdf)
- Tworzenie i zarządzanie procesami
- Wiele punktów awarii
- Brak programowej kontroli nad konwersją
IronPDFHTML do PDF
IronPDF umożliwia bezpośrednią konwersję plików HTML do formatu PDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This is HTML do PDF conversion.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This is HTML do PDF conversion.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<h1>Hello World</h1><p>This is HTML do PDF conversion.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
Metoda RenderHtmlAsPdf konwertuje zawartość HTML bezpośrednio do formatu PDF przy użyciu silnika renderującego Chromium. Bez zewnętrznych narzędzi, bez zarządzania procesami, bez zależności od użytkownika.
Otwieranie i wyświetlanie plików PDF
Oba rozwiązania mogą wyświetlać pliki PDF, ale za pomocą zupełnie różnych mechanizmów.
Sumatra PDFDisplay
Sumatra PDF wyróżnia się możliwością przeglądania plików PDF podczas wykonywania procesów:
// NuGet: Install-Package SumatraPDF.CommandLine (or direct executable)
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
string pdfPath = "document.pdf";
//Sumatra PDFexcels at viewing PDFs
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "SumatraPDF.exe",
Arguments = $"\"{pdfPath}\"",
UseShellExecute = true
};
Process.Start(startInfo);
// Optional: Open specific page
// Arguments = $"-page 5 \"{pdfPath}\""
}
}
// NuGet: Install-Package SumatraPDF.CommandLine (or direct executable)
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
string pdfPath = "document.pdf";
//Sumatra PDFexcels at viewing PDFs
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "SumatraPDF.exe",
Arguments = $"\"{pdfPath}\"",
UseShellExecute = true
};
Process.Start(startInfo);
// Optional: Open specific page
// Arguments = $"-page 5 \"{pdfPath}\""
}
}
Imports System.Diagnostics
Imports System.IO
Module Program
Sub Main()
Dim pdfPath As String = "document.pdf"
' Sumatra PDF excels at viewing PDFs
Dim startInfo As New ProcessStartInfo With {
.FileName = "SumatraPDF.exe",
.Arguments = $"""{pdfPath}""",
.UseShellExecute = True
}
Process.Start(startInfo)
' Optional: Open specific page
' .Arguments = $"-page 5 ""{pdfPath}"""
End Sub
End Module
Takie podejście:
- Wymaga zainstalowania programuSumatra PDFw systemie użytkownika
- Uruchamia proces zewnętrzny
- Nie można uzyskać dostępu do treści plików PDF ani modyfikować ich programowo
IronPDFDisplay
IronPDF może ładować, przetwarzać, a następnie wyświetlać pliki PDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}");
//IronPDFcan manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf");
// Open with default PDF viewer
Process.Start(new ProcessStartInfo("modified.pdf") { UseShellExecute = true });
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}");
//IronPDFcan manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf");
// Open with default PDF viewer
Process.Start(new ProcessStartInfo("modified.pdf") { UseShellExecute = true });
}
}
Imports IronPdf
Imports System
Imports System.Diagnostics
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}")
' IronPDF can manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf")
' Open with default PDF viewer
Process.Start(New ProcessStartInfo("modified.pdf") With {.UseShellExecute = True})
End Sub
End Class
Metoda PdfDocument.FromFile() bibliotekiIronPDFładuje dokument w celu uzyskania do niego dostępu programowego — umożliwiając wyodrębnianie liczby stron, manipulowanie treścią oraz zapisywanie zmian przed wyświetleniem.
Wyodrębnianie tekstu
Wyodrębnianie tekstu z plików PDF ujawnia poważną lukę w możliwościach.
Sumatra PDFText Extraction
Sumatra PDF nie może wyodrębniać tekstu programowo — wymaga zewnętrznych narzędzi wiersza poleceń:
//Sumatra PDFdoesn't provide C# API for text extraction
// You would need to use command-line tools or other libraries
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//Sumatra PDFis a viewer, not a text extraction library
// You'd need to use PDFBox, iTextSharp, or similar for extraction
string pdfFile = "document.pdf";
// This would require external tools like pdftotext
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "pdftotext.exe",
Arguments = $"{pdfFile} output.txt",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
string extractedText = File.ReadAllText("output.txt");
Console.WriteLine(extractedText);
}
}
//Sumatra PDFdoesn't provide C# API for text extraction
// You would need to use command-line tools or other libraries
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//Sumatra PDFis a viewer, not a text extraction library
// You'd need to use PDFBox, iTextSharp, or similar for extraction
string pdfFile = "document.pdf";
// This would require external tools like pdftotext
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "pdftotext.exe",
Arguments = $"{pdfFile} output.txt",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
string extractedText = File.ReadAllText("output.txt");
Console.WriteLine(extractedText);
}
}
Imports System.Diagnostics
Imports System.IO
Module Program
Sub Main()
' Sumatra PDF is a viewer, not a text extraction library
' You'd need to use PDFBox, iTextSharp, or similar for extraction
Dim pdfFile As String = "document.pdf"
' This would require external tools like pdftotext
Dim psi As New ProcessStartInfo With {
.FileName = "pdftotext.exe",
.Arguments = $"{pdfFile} output.txt",
.UseShellExecute = False
}
Process.Start(psi)?.WaitForExit()
Dim extractedText As String = File.ReadAllText("output.txt")
Console.WriteLine(extractedText)
End Sub
End Module
To obejście:
- Wymaga instalacji zewnętrznego narzędzia (pdftotext)
- Zapisuje do plików pośrednich
- Nie można programowo wyodrębniać danych z określonych stron
- Zwiększa złożoność i liczbę punktów awarii
Wydobywanie tekstu z plików PDF za pomocą IronPDF
IronPDF udostępnia natywne interfejsy API do wyodrębniania tekstu:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Wyodrębnij tekst from all pages
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted Text:");
Console.WriteLine(allText);
// Wyodrębnij tekst from specific page
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine($"\nFirst Page Text:\n{pageText}");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Wyodrębnij tekst from all pages
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted Text:");
Console.WriteLine(allText);
// Wyodrębnij tekst from specific page
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine($"\nFirst Page Text:\n{pageText}");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
' Wyodrębnij tekst from all pages
Dim allText As String = pdf.ExtractAllText()
Console.WriteLine("Extracted Text:")
Console.WriteLine(allText)
' Wyodrębnij tekst from specific page
Dim pageText As String = pdf.ExtractTextFromPage(0)
Console.WriteLine(vbCrLf & "First Page Text:" & vbCrLf & pageText)
End Sub
End Class
Metody ExtractAllText() i ExtractTextFromPage() zapewniają bezpośredni programowy dostęp do zawartości PDF bez potrzeby stosowania zewnętrznych narzędzi lub plików pośrednich.
Pełne porównanie funkcji
| Funkcja | Sumatra PDF | IronPDF |
|---|---|---|
| Odczytywanie plików PDF | Tak | Tak |
| Tworzenie plików PDF | Nie | Tak |
| Edycja plików PDF | Nie | Tak |
| Integracja | Ograniczone (samodzielne) | Pełna integracja z aplikacjami |
| Licencja | GPL | Komercjalne |
Szczegółowe porównanie możliwości
| Możliwości | Sumatra PDF | IronPDF |
|---|---|---|
| Tworzenie | ||
| HTML do PDF | Nie | Tak |
| URL do pliku PDF | Nie | Tak |
| Tekst do PDF | Nie | Tak |
| Obraz do PDF | Nie | Tak |
| Manipulacja | ||
| Łączenie plików PDF | Nie | Tak |
| Podział plików PDF | Nie | Tak |
| Przewracaj strony | Nie | Tak |
| Usuń strony | Nie | Tak |
| Zmień kolejność stron | Nie | Tak |
| Treść | ||
| Dodaj znaki wodne | Nie | Tak |
| Dodaj nagłówki/stopki | Nie | Tak |
| Tekst stempla | Nie | Tak |
| Obrazy stempli | Nie | Tak |
| Bezpieczeństwo | ||
| Ochrona hasłem | Nie | Tak |
| Podpisy cyfrowe | Nie | Tak |
| Szyfrowanie | Nie | Tak |
| Ustawienia uprawnień | Nie | Tak |
| Ekstrakcja | ||
| Wyodrębnij tekst | Nie | Tak |
| Wyodrębnij obrazy | Nie | Tak |
| Formularze | ||
| Wypełnij formularze | Nie | Tak |
| Tworzenie formularzy | Nie | Tak |
| Odczyt danych z formularza | Nie | Tak |
| Platforma | ||
| Windows | Tak | Tak |
| Linux | Nie | Tak |
| macOS | Nie | Tak |
| Aplikacje internetowe | Nie | Tak |
| Azure/AWS | Nie | Tak |
Kiedy zespoły rozważają przejście z Sumatra PDF
Kilka czynników skłania zespoły programistów do rozważenia alternatyw dla wzorców integracji Sumatra PDF:
Zewnętrzne obciążenie związane z zarządzaniem procesami komplikuje architekturę aplikacji. Tworzenie i zarządzanie oddzielnymi procesami zwiększa złożoność, wymaga obsługi błędów i stwarza potencjalne punkty awarii.
Ograniczenia licencji GPL mają wpływ na komercyjne tworzenie oprogramowania. LicencjaGPLmoże kolidować z wymaganiami dotyczącymi licencjonowania oprogramowania własnościowego, co sprawia, żeSumatra PDFnie nadaje się do zastosowań korporacyjnych.
Zależności instalacyjne użytkownika stwarzają wyzwania związane z wdrażaniem. Wymóg oddzielnej instalacjiSumatra PDFutrudnia wdrożenie i zwiększa nakłady na wsparcie techniczne.
Brak możliwości tworzenia plików PDF nie ogranicza funkcjonalności aplikacji.Sumatra PDFumożliwia jedynie przeglądanie plików PDF — aplikacje wymagające generowania plików PDF muszą integrować dodatkowe narzędzia.
Żadna manipulacja programowa nie uniemożliwia zaawansowanych procesów roboczych. Zadania takie jak scałanie, dzielenie, dodawanie znaków wodnych lub zabezpieczanie plików PDF są niemożliwe w programie Sumatra PDF.
Ograniczenie do komputerów stacjonarnych uniemożliwia wdrożenia w sieci i chmurze.Sumatra PDFnie może być używana w aplikacjach ASP.NET, Azure Functions ani w środowiskach kontenerowych.
Zalety i kompromisy
Atuty Sumatra PDF
- Lekka i szybka przeglądarka plików PDF
- Oprogramowanie typu open source i bezpłatne
- Prosty i przyjazny dla użytkownika interfejs
- Doskonała wydajność na starszych systemach
- Obsługa drukowania z wiersza poleceń
Ograniczenia Sumatra PDF
- Tylko do czytania — brak funkcji tworzenia lub edycji plików PDF
- Aplikacja samodzielna — nie jest to biblioteka do integracji
- LicencjaGPLogranicza wykorzystanie komercyjne
- Wymaga zewnętrznego zarządzania procesami
- Brak programowego API do manipulacji
- Tylko na komputery stacjonarne — brak obsługi sieciowej lub w chmurze
- Użytkownicy muszą zainstalować osobno
- Brak API do wyodrębniania tekstu
Atuty IronPDF
- Kompleksowe tworzenie i edycja plików PDF
- Natywna integracja bibliotek .NET
- Licencja komercyjna do użytku korporacyjnego
- Renderowanie HTML oparte na silniku Chromium
- Pełny programowy interfejs API
- Obsługa wielu platform (Windows, Linux, macOS)
- Obsługa aplikacji internetowych
- Kompatybilność z wdrożeniami w chmurze
- Pobieranie tekstu i obrazów
- Obsługa zabezpieczeń i podpisów cyfrowych
Uwagi dotyczące IronPDF
- Komercyjny model licencjonowania
- Szerszy zakres wdrożenia niż w przypadku zwykłej przeglądarki
Podsumowanie porównania API
| Działanie | Sumatra PDF | IronPDF |
|---|---|---|
| Wyświetl plik PDF | Process.Start("SumatraPDF.exe", "file.pdf") |
PdfDocument.FromFile() + systemówy przeglądarka |
| PRINT PDF | Process.Start("SumatraPDF.exe", "-print-to-default file.pdf") |
pdf.Print() |
| Utwórz plik PDF | Niemożliwe | renderer.RenderHtmlAsPdf() |
| Wyodrębnij tekst | Wymaga narzędzi zewnętrznych | pdf.ExtractAllText() |
| Łączenie plików PDF | Niemożliwe | PdfDocument.Merge() |
| Dodaj znak wodny | Niemożliwe | pdf.ApplyWatermark() |
| Zabezpiecz hasłem | Niemożliwe | pdf.SecuritySettings |
Wnioski
Sumatra PDF iIronPDFsłużą zupełnie innym celom w ekosystemie .NET.Sumatra PDFzapewnia doskonałe wrażenia użytkownikom końcowym, którzy potrzebują szybkiej i lekkiej aplikacji do czytania plików PDF. Jednak dla programistów i przedsiębiorstw potrzebujących programowych funkcji obsługi plików PDF w swoich aplikacjach, konstrukcjaSumatra PDFprzeznaczona wyłącznie do przeglądania oraz licencjaGPLstwarzają znaczne ograniczenia.
W przypadku aplikacji wymagających generowania plików PDF, manipulacji nimi, wyodrębniania tekstu lub integracji wykraczającej poza zwykłe przeglądanie,IronPDFzapewnia kompleksowe możliwości biblioteki, którychSumatra PDFnie jest w stanie zaoferować. Możliwość tworzenia plików PDF z HTML, scałania dokumentów, wyodrębniania treści oraz wdrażania w środowiskach internetowych i chmurowych odpowiada na typowe wymagania programistyczne, których nie da się spełnić za pomocą aplikacji do przeglądania plików.
Oceniając migrację zSumatra PDFdo IronPDF, zespoły powinny wziąć pod uwagę swoje konkretne wymagania dotyczące tworzenia, edycji, licencjonowania i platform wdrażania plików PDF. Dla zespołów, które w 2026 r. planują wdrożenie .NET 10 i C# 14 w środowisku internetowym lub chmurze, architektura bibliotekiIronPDFzapewnia możliwości, których aplikacje do przeglądania plików zasadniczo nie są w stanie zapewnić.
Aby uzyskać wskazówki dotyczące wdrożenia, zapoznaj się z samouczkiem IronPDF HTML-to-PDF oraz dokumentacją obejmującą wzorce generowania plików PDF dla nowoczesnych aplikacji .NET.