# Sign PDF Programmatically in C# .NET 10: Podpis cyfrowy Guide
**Podpisy cyfrowe** w **C# .NET** uwierzytelniają dokumenty PDF za pomocą **kryptografii opartej na certyfikacie X.509**, zapewniając wykrywanie ingerencji, niemożność zanegowania oraz długoterminową ważność, które sama wizualna grafika podpisu nie może zapewnić. IronPDF ułatwia programistom .NET programowe **podpisywanie**, **weryfikację** oraz **zabezpieczanie PDF**, obejmując wszystko od podstawowego podpisu certyfikatowego i wizualizacji podpisu po **procesy wieloetapowego zatwierdzania**, integrację z serwerem sygnatury czasowej oraz **zgodność regulacyjną** z ramami takimi jak eIDAS i Ustawa ESIGN.
*as-heading:2(TL;DR: Przewodnik Quickstart)*
Ten samouczek dotyczy programowego podpisywania, weryfikacji i zabezpieczania dokumentów PDF za pomocą certyfikatów X.509 w C#, od pojedynczych podpisów po wieloetapowe łańcuchy zatwierdzeń.
- **Dla kogo to jest:** programiści .NET, którzy budują podpisy dokumentów w systemach zarządzania kontraktami, przetwarzania faktur lub systemach zgodności.
- **Co zbudujesz:** Podpisywanie PDF oparte na certyfikacie (`.p12`), nakładki wizualne podpisów, sekwencyjne przepływy wielopodmiotowe, weryfikację podpisu, wykrywanie manipulacji oraz blokowanie dokumentów sterowane zezwoleniami.
- **Gdzie działa:** .NET 10, .NET 8 LTS, .NET Ramy 4.6.2+ oraz .NET Standard 2.0.
- **Kiedy używać tego podejścia:** Kiedy potrzebujesz *podpisywać PDF programowo* na dużą skalę bez kierowania przez zewnętrzne portale podpisywania.
- **Dlaczego to ma znaczenie techniczne:** Podpisy kryptograficzne zapewniają dowody ingerencji, niemożność zanegowania i długoterminową ważność, której wizualne obrazy podpisów nie mogą zaoferować.
Aby śledzić przykłady kodu w tym samouczku, sprawdź [szybki przewodnik instalacji](https://ironpdf.com/docs/), aby ustawić IronPDF w swoim projekcie. Podpisz swój pierwszy PDF za pomocą kilku linijek kodu:
```cs
:title=Instant PDF Signing with IronPDF
var signature = new IronPdf.Signing.PdfSignature("certificate.pfx", "password");
IronPdf.PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("signed.pdf");
```
Po zakupie lub zapisaniu się na 30-dniowy okres próbny IronPDF, dodaj swój klucz licencyjny na początku aplikacji.
```cs
IronPdf.License.LicenseKey = "KEY";
```
!!!--LIBRARY_START_TRIAL_BLOCK--!!!
!!!--LIBRARY_NUGET_INSTALL_BLOCK--!!!
*as-heading:2(Spis treści)*
- **TL;DR: Przewodnik Szybkiego Startu**
- [Krótki Przegląd](#anchor-tldr-quickstart-guide)
- **Podpisy cyfrowe w porównaniu z wizualnymi podpisami**
- [Jaka jest różnica między podpisami cyfrowymi a wizualnymi w dokumentach PDF?](#anchor-what-is-the-difference-between-digital-signatures-and-visual-signatures-in-pdf-documents)
- **Konfiguracja infrastruktury podpisu cyfrowego**
- [Jakie formaty certyfikatów obsługuje IronPDF do podpisywania PDF?](#anchor-what-certificate-formats-does-ironpdf-support-for-pdf-signing)
- **Zastosowanie podpisów cyfrowych programowo**
- [Basic Certificate Signing in C#](#anchor-what-does-basic-certificate-signing-look-like-in-c)
- [Konfiguracja metadanych podpisu dla ścieżek audytu](#anchor-how-should-signature-metadata-be-configured-for-audit-trails)
- [Serwery sygnatury czasowej a ważność podpisu](#anchor-what-role-do-timestamp-servers-play-in-signature-validity-over-time)
- [Podpisy niewidoczne vs widoczne](#anchor-when-should-signatures-be-invisible-versus-visible-on-the-document)
- **Dodawanie wyglądu wizualnego podpisu**
- [Ładowanie i ustawianie obrazków podpisu](#anchor-how-can-signature-images-be-loaded-and-positioned)
- [Pozycjonowanie podpisu na wielu stronach](#anchor-how-does-signature-positioning-work-across-multiple-pages)
- **Przepływy pracy podpisu wielostronnego**
- [Podpisywanie sekwencyjne oraz jak umożliwia to zapisywanie przyrostowe](#anchor-what-is-sequential-signing-and-how-does-incremental-saving-enable-it)
- [Weryfikacja istniejących podpisów](#anchor-how-can-you-verify-existing-signatures-before-adding-new-ones)
- [Wykrywanie zmodyfikowanych dokumentów](#anchor-how-does-ironpdf-detect-tampered-documents)
- **Zgodność regulacyjna dla podpisów PDF**
- [Kluczowe ramy regulacyjne](#anchor-what-are-the-key-regulatory-frameworks-for-digital-signatures)
- [Wymagania certyfikacyjne dla branż regulowanych](#anchor-what-certificate-requirements-apply-to-regulated-industries)
- [Kontrola uprawnień do podpisu](#anchor-how-does-signature-permission-control-support-document-lifecycle-management)
- **Budowa vs Zakup: Własne podpisywanie czy zewnętrzne usługi**
- [Czynniki sprzyjające budowie wewnętrznych możliwości podpisywania](#anchor-what-factors-favor-building-internal-signing-capabilities)
- [Scenariusze sprzyjające rozwiązaniom zewnętrznym](#anchor-what-scenarios-favor-hosted-signing-solutions)
- [Ocena potrzeb infrastruktury podpisywania](#anchor-how-can-development-teams-evaluate-their-signing-infrastructure-needs)
<a id="anchor-quickstart-sign-your-first-pdf"></a>
---
## Jaka jest różnica między podpisami cyfrowymi a wizualnymi w dokumentach PDF?
Ludzie często używają "podpisu cyfrowego" i "podpisu elektronicznego" zamiennie, ale działają zupełnie inaczej, jeśli chodzi o bezpieczeństwo dokumentów. Podpis cyfrowy używa technik kryptograficznych do szyfrowania skrótu zawartości dokumentu przy użyciu klucza prywatnego. Każdy, kto ma dostęp do odpowiadającego klucza publicznego, może zweryfikować, czy dokument nie został zmieniony od momentu podpisania.
Z drugiej strony, podpis wizualny to po prostu obraz umieszczony na stronie PDF. Może to być zeskanowany odręczny podpis, logo firmy lub stylizowana wersja tekstu imienia. Podpisy wizualne pomagają dokumentom wyglądać na "podpisane" dla ludziach czytelników, lecz nie oferują ochrony kryptograficznej przed manipulacją.
W praktyce aplikacje biznesowe często potrzebują obu rodzajów działających razem. Umowa prawna może wymagać kryptograficznej ochrony podpisu cyfrowego opartego na certyfikacie, aby zapewnić integralność dokumentu, oraz widocznego bloku podpisu, aby odbiorcy mogli zobaczyć, kto podpisał i kiedy.
Poniższa tabela podsumowuje kluczowe różnice między tymi typami podpisów:
<div class="content-table dotnet-core-pdf-table">
<table>
<tbody>
<tr class="tr-head">
<th class="tcol1">Charakterystyka</th>
<th class="tcol2">Podpis cyfrowy</th>
<th class="tcol3">Podpis wizualny</th>
</tr>
<tr>
<td>Ochrona kryptograficzna</td>
<td>Używa PKI i certyfikatów X.509 do stworzenia pieczęci wykrywającej manipulacje</td>
<td>Brak, obraz można usunąć lub zastąpić</td>
</tr>
<tr>
<td>Niemożność zanegowania</td>
<td>Podpisujący nie może wiarygodnie zaprzeczyć podpisaniu</td>
<td>Nie dostarcza technicznego dowodu tożsamości</td>
</tr>
<tr>
<td>Wykrywanie ingerencji</td>
<td>Każda modyfikacja unieważnia podpis</td>
<td>Nie ma sposobu wykrycia, czy dokument został zmieniony</td>
</tr>
<tr>
<td>Pozycja prawna</td>
<td>Rozpoznawane zgodnie z przepisami jak Ustawa ESIGN i eIDAS</td>
<td>Może zaspokoić wymogi "intencji podpisania" tylko</td>
</tr>
<tr>
<td>Weryfikacja</td>
<td>Może być walidowane programowo lub w czytnikach PDF</td>
<td>Wymaga tylko inspekcji wizualnej</td>
</tr>
<tr>
<td>Wymagany certyfikat</td>
<td>Tak, wymaga pliku certyfikatu .pfx lub .p12</td>
<td>Nie, dowolny plik obrazu działa</td>
</tr>
</tbody>
</table>
</div>
Dla większości przypadków użycia biznesowego, podpisy cyfrowe z dołączoną reprezentacją wizualną oferują najsilniejszą kombinację bezpieczeństwa i użyteczności. Warstwa kryptograficzna zapewnia integralność dokumentu, podczas gdy wizualna warstwa zapewnia znane doświadczenie podpisywania dla odbiorców.
---
## Jak zespoły programistyczne mogą skonfigurować infrastrukturę podpisu cyfrowego?
Wdrażanie podpisów cyfrowych wymaga dwóch rzeczy: certyfikatów X.509 do podpisywania oraz pewnej wiedzy o tym, jak zarządzanie certyfikatami działa w produkcji. Ta sekcja przeprowadza przez każdy składnik.
### Jakie formaty certyfikatów obsługuje IronPDF do podpisywania PDF?
Podpisy cyfrowe opierają się na certyfikatach X.509, które zawierają parę kluczy publicznych i prywatnych oraz informacje o tożsamości posiadacza certyfikatu. Te poświadczenia zazwyczaj mają okresy ważności od jednego do trzech lat. IronPDF działa z certyfikatami w standardowym formacie PKCS#12, zwykle przechowywanymi jako pliki `.pfx` lub `.p12`. Te pliki łączą klucz prywatny (potrzebny do podpisywania) z certyfikatem publicznym (potrzebnym do weryfikacji) w kontener chroniony hasłem.
Środowiska Enterprise zazwyczaj uzyskują certyfikaty z jednego z kilku źródeł:
**Komercyjne Urzędy Certyfikacji** takie jak DigiCert, Sectigo lub GlobalSign wydają certyfikaty, które są automatycznie zaufane przez główne czytniki PDF.
**Wewnętrzna infrastruktura PKI** pozwala organizacjom wydawać własne certyfikaty, chociaż odbiorcy mogą musieć ręcznie zaufać wystawcy CA.
**Certyfikaty samopodpisane** nadają się do prototypowania, ale wyświetlą ostrzeżenia w czytnikach PDF, chyba że zostaną ręcznie zaufane.
Podczas ładowania certyfikatu dla IronPDF, należy określić flagę `X509KeyStorageFlags.Exportable`. Pozwala to podsystemowi kryptograficznemu na dostęp do klucza prywatnego do podpisywania. Oto jak poprawnie załadować certyfikat:
```csharp
using System.Security.Cryptography.X509Certificates;
// Load the certificate from a PKCS#12 file (.pfx or .p12)
// The Exportable flag allows the private key to be used for signing
var certificate = new X509Certificate2(
"company-signing-cert.pfx",
"certificate-password",
X509KeyStorageFlags.Exportable
);
```
**Przykład wyjścia:**
```
Certyfikat załadowano pomyślnie
Podmiot: CN=Testowy Podpisujący, O=Testowa Organizacja, C=US
Wystawca: CN=Testowy Podpisujący, O=Testowa Organizacja, C=US
Ważny od: 2026-01-27 7:50:04 AM
Ważny do: 2027-01-27 8:00:03 AM
Odcisk palca: 41355DE5ADD66CD64B2B99FF2CF87B9C87BD412F
Ma klucz prywatny: Prawda
```
W produkcji pobierz hasła certyfikatów z bezpiecznych systemów konfiguracji takich jak Azure Key Vault, AWS Secrets Manager, lub HashiCorp Vault zamiast ich umieszczania na stałe w kodzie. Przechowuj pliki certyfikatów z właściwymi kontrolami dostępu i nigdy nie umieszczaj ich w systemie kontroli wersji.
---
## Jak programiści mogą stosować podpisy cyfrowe do dokumentów PDF programowo?
Podstawowy przepływ podpisywania w IronPDF polega na utworzeniu obiektu `PdfSignature` z certyfikatu i zastosowaniu go do PDF. Ta sekcja omawia proces podpisywania wraz z opcjami dodawania metadanych i konfiguracji zachowania podpisu.
### What does Basic Certificate Signing look like in C#?
Najprostszy scenariusz podpisywania to załadowanie istniejącego PDF, utworzenie podpisu z certyfikatu i zapisanie podpisanego wyniku. IronPDF obsługuje wszystkie operacje kryptograficzne w tle:
```csharp
using IronPdf;
using IronPdf.Signing;
// Load the PDF document that needs to be signed
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
// Create a signature object using the certificate file path and password
var signature = new PdfSignature("certificate.pfx", "password");
// Apply the cryptographic signature to the document
// This embeds an invisible digital signature in the PDF structure
pdf.Sign(signature);
// Save the signed document to a new file
pdf.SaveAs("contract-signed.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/contract-input.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/contract-input.png" alt="contract.pdf - Przykładowy kontrakt przed podpisaniem" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">contract.pdf - Przykładowy kontrakt przed podpisaniem</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/contract-signed.pdf" width="100%" height="500px">
</iframe>
Tworzy to PDF z zakodowanym w nim niewidocznym podpisem cyfrowym. Po otwarciu w Adobe Acrobat lub innym czytniku PDF świadomym podpisu, dokument wyświetla informacje o weryfikacji podpisu, pokazując, czy podpis jest ważny i czy dokument został zmodyfikowany od czasu podpisania.
Dla scenariuszy, w których wymagana jest tylko podpisaniu dokumentu bez ładowania go do pamięci w celu dokonania innych zmian, IronPDF ma uproszczone podejście jedno-liniowe:
```csharp
using IronPdf;
using IronPdf.Signing;
// One-line approach for signing PDFs
// Useful for batch processing where you don't need to manipulate the document
var signature = new PdfSignature("certificate.pfx", "password");
PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf");
```
Jest to szczególnie przydatne do przetwarzania wsadowego, kiedy podpisujemy dużo dokumentów bez wprowadzania innych zmian.
### Jak skonfigurować metadane podpisu dla celów audytowych?
Podpisy cyfrowe mogą przenosić metadane, które dają kontekst na temat zdarzenia podpisywania. Ta informacja pojawia się w panelu podpisu czytników PDF i dodaje do ścieżki audytu dokumentu. IronPDF obsługuje kilka standardowych pól metadanych:
```csharp
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to be signed
PdfDocument pdf = PdfDocument.FromFile("invoice.pdf");
// Create a signature with the company certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
// Add metadata to create an audit trail
// This information appears in the signature panel of PDF readers
SigningReason = "Invoice Approval",
SigningLocation = "New York Office",
SigningContact = "accounts@company.com",
SignatureDate = DateTime.UtcNow
};
// Apply the signature with all metadata included
pdf.Sign(signature);
pdf.SaveAs("invoice-approved.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/invoice-input.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/invoice-input.png" alt="invoice.pdf - Faktura przed podpisaniem" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">invoice.pdf - Faktura przed podpisaniem</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/invoice-approved.pdf" width="100%" height="500px">
</iframe>
Pola metadanych służą różnym celom w przepływach pracy z dokumentami:
<div class="content-table dotnet-core-pdf-table">
<table>
<tbody>
<tr class="tr-head">
<th class="tcol1">Pole metadanych</th>
<th class="tcol2">Cel</th>
<th class="tcol3">Przykładowa wartość</th>
</tr>
<tr>
<td><code>Powód podpisania</code></td>
<td>Wyjaśnia, dlaczego dokument został podpisany</td>
<td>"Zatwierdzenie umowy", "Certyfikacja audytu"</td>
</tr>
<tr>
<td><code>SigningLocation</code></td>
<td>Rejestruje, gdzie nastąpiło podpisanie</td>
<td>"Nowojorskie biuro", "Zdalne biuro domowe"</td>
</tr>
<tr>
<td><code>Podpisanie umowy</code></td>
<td>Daje informacje kontaktowe do zapytań</td>
<td>"legal@company.com", "+1 555 0123"</td>
</tr>
<tr>
<td><code>Data podpisu</code></td>
<td>Daty zdarzenie podpisywania</td>
<td><code>DateTime.UtcNow</code></td>
</tr>
</tbody>
</table>
</div>
W ustawieniach korporacyjnych, te pola często wiążą się z danymi operacyjnymi. System zatwierdzania faktur może ustawić powód podpisania na numer zamówienia zakupu, podczas gdy system zarządzania kontraktami może zawierać identyfikator kontraktu i etap zatwierdzenia.
### Jaką rolę odgrywają serwery sygnatury czasowej w ważności podpisu w czasie?
Podpisy cyfrowe zawierają sygnaturę czasową pokazującą kiedy dokument został podpisany, ale ta sygnatura pochodzi z lokalnego zegara komputera podpisującego. Dla podpisów, które mogą wymagać weryfikacji w następnych latach, lub kiedy dowód dokładnego czasu podpisywania ma znaczenie prawne, zaufana sygnatura czasowa od zewnętrznego Urzędu Sygnatur Czasowych (TSA) daje znacznie silniejsze dowody.
Serwer sygnatury czasowej zapewnia kryptograficzny dowód, że dokument istniał w swojej obecnej formie w określonym momencie. Nawet jeśli certyfikat podpisu później wygaśnie lub zostanie odwołany, sygnatura czasowa pokazuje, że podpis był ważny, kiedy został zastosowany. IronPDF obsługuje serwery sygnatury czasowej zgodne z RFC 3161:
```csharp
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("agreement.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Agreement Execution",
// Configure a trusted timestamp server (RFC 3161 compliant)
// This provides cryptographic proof of when the document was signed
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
TimeStampUrl = "http://timestamp.digicert.com"
};
// Apply the signature with the trusted timestamp
pdf.Sign(signature);
pdf.SaveAs("agreement-timestamped.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/agreement-input.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/agreement-input.png" alt="agreement.pdf - Umowa serwisowa przed podpisaniem" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">agreement.pdf - Umowa serwisowa przed podpisaniem</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/agreement-timestamped.pdf" width="100%" height="500px">
</iframe>
Dostępnych jest kilka publicznych serwerów sygnatury czasowej do ogólnego użytku, w tym te działające przez główne urzędy certyfikacji. Większe organizacje mogą również prowadzić własne wewnętrzne serwery sygnatury czasowej, które przestrzegają polityk bezpieczeństwa firmy.
Wybór algorytmu skrótu ma znaczenie dla przedłużonej ważności. SHA 256 jest obecnym standardem, chociaż IronPDF obsługuje również SHA 512 dla ściślejszych wymagań bezpieczeństwa. Starsze algorytmy jak SHA 1 powinny być unikane, ponieważ nie są już uważane za kryptograficznie bezpieczne.
### Kiedy powinny być podpisy niewidoczne a kiedy widoczne na dokumencie?
Podpisy cyfrowe mogą być stosowane w dwóch trybach: niewidoczne podpisy, które istnieją tylko w strukturze kryptograficznej PDF, lub widoczne podpisy, które wyświetlają również graficzną reprezentację na wyznaczonej stronie. Wybór zależy od przeznaczenia dokumentu i oczekiwań jego odbiorców.
Niewidzialne podpisy dobrze sprawdzają się w zautomatyzowanym przetwarzaniu dokumentów, gdzie nie oczekuje się przeglądu przez człowieka, w sytuacjach, gdy istniejący układ dokumentu nie powinien ulec zmianie, oraz w przepływach pracy z wieloma podpisami, gdzie widoczne podpisy zagracałyby dokument.
Widoczne podpisy są preferowane, gdy odbiorcy oczekują zobaczyć wizualny dowód podpisania, gdy przepływy pracy wymagają umieszczenia podpisów w określonych miejscach, lub gdy dokument zostanie wydrukowany i podpis powinien się pojawić na papierze.
Kolejna sekcja omawia szczegółowo implementację wizualnych podpisów.
---
## Jak dodawane są wyglądy wizualnych podpisów do cyfrowo podpisanych PDF?
Wiele procesów biznesowych powstało wokół widocznych bloków podpisów, a odbiorcy często oczekują zobaczyć gdzie i kiedy dokument został podpisany. IronPDF pozwala na zastosowanie ochrony kryptograficznej przy jednoczesnym wyświetlaniu widocznego podpisu na stronie, dając najlepsze z obu światów.
### Jak można załadować i umieścić obrazy podpisów?
Wizualny podpis to zazwyczaj obraz (jak zeskanowany odręczny podpis, pieczęć firmowa lub stylizowany blok tekstu) umieszczony w określonym miejscu na stronie PDF. Metoda `LoadSignatureImageFromFile` IronPDF obsługuje pozycjonowanie i renderowanie:
```csharp
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Contract Approval",
SigningLocation = "Head Office"
};
// Define the position and size for the visible signature image
// Rectangle parameters: x position, y position, width, height (in points)
// Points are measured from the bottom-left corner of the page
var signatureArea = new Rectangle(150, 100, 200, 50);
// Load and attach the visual signature image
// The image will appear at the specified location on the document
signature.LoadSignatureImageFromFile(
"signature-image.png", // Path to the signature image file
0, // Page index (0 = first page)
signatureArea // Position and dimensions
);
// Apply both the cryptographic signature and visual representation
pdf.Sign(signature);
pdf.SaveAs("contract-visually-signed.pdf");
```
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/contract-visually-signed.pdf" width="100%" height="500px">
</iframe>
System współrzędnych używa punktów (1/72 cała) mierzone od lewego dolnego rogu strony. Dla standardowej strony US Letter (612 x 792 punktów), umieszczenie podpisu blisko prawego dolnego rogu oznacza uwzględnienie zarówno rozmiaru podpisu, jak i odpowiednich marginesów.
Istnieją alternatywne metody ładowania obrazów podpisów z różnych źródeł:
```csharp
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.IO;
// Create signature object
var signature = new PdfSignature("certificate.pfx", "password");
var signatureArea = new Rectangle(400, 50, 150, 75);
// Method 1: Load signature image directly from a file path
signature.LoadSignatureImageFromFile("signature.png", 0, signatureArea);
// Method 2: Load from a stream (useful for database-stored images)
using (FileStream imageStream = File.OpenRead("signature.png"))
{
signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea);
}
// Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)
AnyBitmap signatureBitmap = AnyBitmap.FromFile("signature.png");
using (var stream = signatureBitmap.ToStream())
{
signature.LoadSignatureImageFromStream(stream, 0, signatureArea);
}
```
Obsługiwane formaty obrazów obejmują PNG, JPEG, GIF, BMP, TIFF i WebP. Pliki PNG z przezroczystością świetnie sprawdzają się dla obrazów podpisów, ponieważ przezroczyste tło pozwala wyświetlić się treści dokumentu poniżej.
### Jak działa pozycjonowanie podpisu na wielu stronach?
Podczas podpisywania dokumentów wielostronicowych, podpis cyfrowy chroni cały dokument bez względu na ilość stron. Pojedynczy kryptograficzny podpis obejmuje wszystkie strony w PDF:
```csharp
using IronPdf;
using IronPdf.Signing;
// Load a multi-page document
PdfDocument pdf = PdfDocument.FromFile("multi-page-contract.pdf");
// Create signature - digital signatures protect the entire document
// regardless of page count
var signature = new PdfSignature("certificate.pfx", "password");
// Sign and save the document
// The signature applies to all pages in the document
pdf.Sign(signature);
pdf.SaveAs("contract-signed-last-page.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/multi-page-contract-input-last.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/multi-page-contract-input-last.png" alt="multi-page-contract.pdf (ostatnia strona) - Strona podpisu przed podpisaniem" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">multi-page-contract.pdf (ostatnia strona) - Strona podpisu przed podpisaniem</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/contract-signed-last-page.pdf" width="100%" height="500px">
</iframe>
Dla podpisów na wielu stronach (jak inicjały na każdej stronie umowy prawnej), programiści mogą stosować stemple obrazów oddzielnie od kryptograficznego podpisu:
```csharp
using IronPdf;
using IronPdf.Editing;
using IronPdf.Signing;
using IronSoftware.Drawing;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("agreement.pdf");
// Create an image stamp for initials that will appear on every page
var initialsStamp = new ImageStamper("initials.png")
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
HorizontalOffset = new Length(50, MeasurementUnit.Points),
VerticalOffset = new Length(50, MeasurementUnit.Points)
};
// Apply initials stamp to all pages
pdf.ApplyStamp(initialsStamp);
// Now apply the cryptographic signature with a full signature image on the last page
var signature = new PdfSignature("certificate.pfx", "password");
var signatureArea = new Rectangle(100, 100, 200, 100);
signature.SignatureImage = new PdfSignatureImage(
"full-signature.png",
pdf.PageCount - 1, // Last page only
signatureArea
);
// Sign the entire document cryptographically
pdf.Sign(signature);
pdf.SaveAs("agreement-initialed-and-signed.pdf");
```
To podejście oddziela naturalne elementy wizualne (które mogą pojawić się na wielu stronach) od kryptograficznego podpisu (który chroni cały dokument).
---
## Jak funkcjonują przepływy pracy wersji podpisów wielostronnych w aplikacjach korporacyjnych?
Złożone procesy biznesowe często wymagają wielu podpisów od różnych osób, stosowanych w określonej kolejności. Zamówienie zakupu może wymagać zatwierdzenia przez kierownika działu, następnie przeglądu finansowego, a następnie podpisu kierownictwa. IronPDF obsługuje te przepływy pracy poprzez przyrostowe zapisywanie i uprawnienia do podpisu.
### Co to jest podpisywanie sekwencyjne i jak umożliwia to zapisywanie przyrostowe?
Dokumenty PDF mogą przechowywać wewnętrzne wiele wersji, podobnie jak systemy kontroli wersji. Za każdym razem, gdy ktoś podpisuje, ten podpis dotyczy stanu dokumentu w danym momencie. Osoby podpisujące się później dodają swoje podpisy do nowych wersji, tworząc łańcuch zatwierdzeń, w którym każdy podpis można zweryfikować niezależnie.
```csharp
using IronPdf;
using IronPdf.Signing;
// Load the purchase order document
PdfDocument pdf = PdfDocument.FromFile("purchase-order.pdf");
// First signer: Department Manager approves the purchase order
var managerSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Manager Approval",
SigningLocation = "Department A"
};
// Sign the document and save
// This preserves the original state while adding the signature
pdf.Sign(managerSignature);
pdf.SaveAs("po-manager-approved.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/purchase-order-input.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/purchase-order-input.png" alt="purchase-order.PDF - Zamówienie oczekujące na zatwierdzenie" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">purchase-order.PDF - Zamówienie oczekujące na zatwierdzenie</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/po-manager-approved.pdf" width="100%" height="500px">
</iframe>
Gdy dokument trafia do kolejnego zatwierdzającego, osoba ta wczytuje go i dodaje swój podpis:
```csharp
using IronPdf;
using IronPdf.Signing;
// Load the document that already has the manager's signature
PdfDocument pdf = PdfDocument.FromFile("po-manager-approved.pdf");
// Second signer: Finance department verifies budget availability
var financeSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Finance Approval",
SigningLocation = "Finance Department"
};
// Add the second signature
// Both signatures remain independently verifiable
pdf.Sign(financeSignature);
pdf.SaveAs("po-finance-approved.pdf");
```
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/po-finance-approved.pdf" width="100%" height="500px">
</iframe>
Każda wersja posiada własny podpis, a czytniki plików PDF mogą wyświetlać pełną historię tego, kto i kiedy podpisał dokument.
### Jak można zweryfikować istniejące podpisy przed dodaniem nowych?
Przed dodaniem nowego podpisu do dokumentu kod powinien sprawdzić, czy istniejące podpisy są nadal ważne. Dokument zmodyfikowany poza właściwym przepływem pracy może zawierać nieprawidłowe podpisy, co może wskazywać na manipulację lub naruszenie procedur.
```csharp
using IronPdf;
using System;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Verify all existing signatures in the document
// Returns true only if ALL signatures are valid and untampered
bool isValid = pdf.VerifyPdfSignatures();
Console.WriteLine($"Signatures Valid: {isValid}");
// Get signature details
var signatures = pdf.GetVerifiedSignatures();
Console.WriteLine($"Number of Signatures: {signatures.Count}");
```
Aby uzyskać bardziej szczegółowe informacje, można pobrać dane dotyczące każdego zweryfikowanego podpisu:
```csharp
using IronPdf;
using System;
// Load a document with multiple signatures
PdfDocument pdf = PdfDocument.FromFile("multi-signed-document.pdf");
// Retrieve detailed information about each verified signature
var verifiedSignatures = pdf.GetVerifiedSignatures();
// Iterate through all signatures to build an audit trail
foreach (var sig in verifiedSignatures)
{
Console.WriteLine($"Signer: {sig.SignerName}");
Console.WriteLine($"Reason: {sig.SigningReason}");
Console.WriteLine($"Location: {sig.SigningLocation}");
Console.WriteLine($"Date: {sig.SigningDate}");
Console.WriteLine($"Contact: {sig.SigningContact}");
Console.WriteLine("---");
}
```
Informacje te umożliwiają tworzenie ścieżek audytu, weryfikację łańcuchów zatwierdzeń oraz upewnienie się, że dokumenty posiadają wszystkie wymagane podpisy przed przejściem do kolejnego etapu.
### W jaki sposób IronPDF wykrywa sfałszowane dokumenty?
Metoda `VerifyPdfSignatures()` zwraca `false`, jeśli jakikolwiek podpis w dokumencie jest nieprawidłowy. Zazwyczaj dzieje się tak, gdy treść została zmodyfikowana po podpisaniu dokumentu, gdy same dane podpisu uległy uszkodzeniu, gdy certyfikat został unieważniony lub gdy certyfikat nie był jeszcze ważny w momencie jego użycia.
```csharp
using IronPdf;
using System;
// Load a signed document and verify
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Check if all signatures are still valid
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
Console.WriteLine("Document has not been tampered with");
Console.WriteLine("All signatures are valid");
}
else
{
Console.WriteLine("WARNING: Document may have been tampered with!");
Console.WriteLine("One or more signatures are invalid");
}
```
Dla aplikacji wymagających usunięcia podpisu (może w celu stworzenia niepodpisanej kopii do redystrybucji), IronPDF ma metodę `RemoveSignatures()`:
```csharp
using IronPdf;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("signed-template.pdf");
// Remove all digital signatures from the document
// This strips signature data but does not restore previous document state
pdf.RemoveSignatures();
// Save as an unsigned version
pdf.SaveAs("unsigned-template.pdf");
```
Należy pamiętać, że usunięcie podpisów nie powoduje przywrócenia poprzedniego stanu dokumentu. Metoda ta po prostu usuwa dane podpisu z bieżącej wersji dokumentu.
---
## Jakie możliwości techniczne wspierają zgodność z przepisami dotyczącymi podpisów w plikach PDF?
Przepisy dotyczące podpisów cyfrowych różnią się w zależności od jurysdykcji i branży, ale mają wspólne wymagania techniczne dotyczące weryfikacji certyfikatów, znakowania czasem i metadanych podpisu. Zamiast próbować interpretować konkretne wymogi prawne (które należy omówić z wykwalifikowanym doradcą prawnym), niniejsza sekcja skupia się na możliwościach technicznych, których zazwyczaj wymagają ramy zgodności.
### Jakie są kluczowe ramy regulacyjne dotyczące podpisów cyfrowych?
Poniższa tabela zawiera podsumowanie popularnych ram regulacyjnych oraz ich ogólnych wymagań technicznych:
<div class="content-table dotnet-core-pdf-table">
<table>
<tbody>
<tr class="tr-head">
<th class="tcol1">Ramy</th>
<th class="tcol2">Jurysdykcja</th>
<th class="tcol3">Kluczowe wymagania techniczne</th>
</tr>
<tr>
<td>Ustawa ESIGN</td>
<td>Stany Zjednoczone</td>
<td>Zamiar podpisania, zgoda na dokumentację elektroniczną, przechowywanie dokumentacji</td>
</tr>
<tr>
<td>UETA</td>
<td>Stany USA</td>
<td>Podobnie jak w przypadku ESIGN, ma zastosowanie do transakcji wewnątrzstanowych</td>
</tr>
<tr>
<td>eIDAS</td>
<td>Unia Europejska</td>
<td>Trzy poziomy podpisu (prosty, zaawansowany, kwalifikowany); poziom kwalifikowany wymaga QSCD</td>
</tr>
<tr>
<td>21 CFR część 11</td>
<td>Amerykańska Agencja ds. Żywności i Leków (FDA)</td>
<td>Podpisy elektroniczne muszą być powiązane z dokumentacją elektroniczną, wymagane są ścieżki audytu</td>
</tr>
</tbody>
</table>
</div>
Ramyi te zazwyczaj uznają podpisy cyfrowe za prawnie równoważne podpisom odręcznym, o ile są one prawidłowo wdrożone. Wartość dowodowa podpisu cyfrowego często zależy od udowodnienia, że podpis był ważny w momencie jego złożenia, dlatego zaufane sygnatury czasowe stają się niezbędne do przechowywania dokumentów przez lata lub dziesięciolecia.
```csharp
using IronPdf;
using IronPdf.Signing;
using System;
// Load the compliance document
PdfDocument pdf = PdfDocument.FromFile("compliance-document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
// Add comprehensive metadata for audit trail requirements
SigningReason = "21 CFR Part 11 Compliance Certification",
SigningLocation = "Quality Assurance Department",
SigningContact = "compliance@company.com",
SignatureDate = DateTime.UtcNow,
// Configure a trusted timestamp for regulatory compliance
// The timestamp proves when the signature was applied
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
TimeStampUrl = "http://timestamp.digicert.com"
};
// Apply the signature with timestamp and full metadata
pdf.Sign(signature);
pdf.SaveAs("compliance-document-certified.pdf");
```
#### Wejscie
<div class="content-img-align-center">
<div class="center-image-wrapper">
<a rel="nofollow" href="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/compliance-document-input.png" target="_blank"><img src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/compliance-document-input.png" alt="compliance-document.PDF - Dokument zgodności oczekujący na certyfikację" class="img-responsive add-shadow" style="max-width: 400px;" /></a>
<p class="content__image-caption">compliance-document.PDF - Dokument zgodności oczekujący na certyfikację</p>
</div>
</div>
#### Wynik
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-digital-signatures-csharp-guide/compliance-document-certified.pdf" width="100%" height="500px">
</iframe>
### Jakie wymagania certyfikacyjne mają zastosowanie w branżach regulowanych?
Różne konteksty regulacyjne mogą określać kryteria dotyczące certyfikatów używanych do podpisywania. Te kryteria mogą obejmować wydanie przez akredytowane organy, minimalne długości kluczy (zwykle 2048-bitowy RSA lub ekwiwalent), szczególne rozszerzone atrybuty użycia klucza, czy chronione klucze na sprzęcie z użyciem HSM lub rozwiązań kart inteligentnych.
IronPDF współpracuje z każdym certyfikatem X.509, który spełnia standardowe specyfikacje formatowe, co pozwala na korzystanie z certyfikatów wydanych przez preferowany urząd certyfikacji. Dla środowisk wymagających kluczy chronionych sprzętowo, IronPDF wspiera integrację opartego na PKCS#11 HSM poprzez swoje funkcjonalności `HsmSigner`.
Osoby z branż podlegających regulacjom powinny współpracować ze swoimi działami prawnymi i ds. zgodności, aby ustalić, co jest potrzebne, a następnie skonfigurować odpowiednią infrastrukturę do podpisywania.
### W jaki sposób kontrola uprawnień podpisów wspiera zarządzanie cyklem życia dokumentów?
Po podpisaniu dokumenty muszą czasem pozostać edytowalne w określonych celach, np. aby umożliwić dodanie podpisów przez kolejnych sygnatariuszy lub wypełnienie pól formularza. Enumeracja `SignaturePermissions` w IronPDF kontroluje, jakie zmiany są dozwolone po podpisaniu:
```csharp
using IronPdf;
using IronPdf.Signing;
// Load a form document that needs signing
PdfDocument pdf = PdfDocument.FromFile("approval-form.pdf");
// Sign with specific permissions for document lifecycle management
// AdditionalSignaturesAndFormFillingAllowed permits form completion and additional signatures after signing
pdf.SignWithFile(
"approver-cert.pfx",
"password",
null,
SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed
);
// Save the signed document with form-filling permissions enabled
pdf.SaveAs("approval-form-signed.pdf");
```
Dostępne poziomy uprawnień to:
<div class="content-table dotnet-core-pdf-table">
<table>
<tbody>
<tr class="tr-head">
<th class="tcol1">Poziom uprawnień</th>
<th class="tcol2">Dopuszczalne zmiany po podpisaniu umowy</th>
</tr>
<tr>
<td><code>NoChangesAllowed</code></td>
<td>Dokument jest całkowicie zablokowany</td>
</tr>
<tr>
<td><code>FormFillingAllowed</code></td>
<td>Można wypełniać tylko pola formularza; nie wolno wprowadzać zmian w treści</td>
</tr>
<tr>
<td><code>Dodatkowe podpisy i wypełnianie formularzy dozwolone</code></td>
<td>Dopuszczalne jest wypełnianie formularzy i dodatkowe podpisy</td>
</tr>
<tr>
<td><code>FormFillingAndAnnotationsAllowed</code></td>
<td>Dopuszczalne jest wypełnianie formularzy Plus oraz dodawanie adnotacji</td>
</tr>
</tbody>
</table>
</div>
Odpowiedni poziom uprawnień zależy od roli dokumentu. Zakończone porozumienie może używać `NoChangesAllowed`, podczas gdy formularz akceptacji jeszcze w toku może używać `AdditionalSignaturesAndFormFillingAllowed`, aby umożliwić wypełnianie formularza i dodawanie dodatkowych podpisów przez innych zatwierdzaczy.
---
## Kiedy tworzenie niestandardowego podpisu ma większy sens niż korzystanie z usług zewnętrznych?
Każdy, kto wdraża podpisywanie dokumentów, staje przed fundamentalną decyzją architektoniczną: wbudować funkcje podpisywania we własne aplikacje lub skorzystać z hostowanych usług podpisywania. Oba podejścia mają swoje zalety, a właściwy wybór zależy od wielkości projektu, wymagań dotyczących dostosowania, kwestii zgodności oraz całkowitego kosztu posiadania.
### Jakie czynniki przemawiają za budowaniem wewnętrznych możliwości podpisywania?
Oto kilka scenariuszy, w których wbudowanie funkcji podpisywania bezpośrednio w aplikacjach ma sens:
**Duża liczba dokumentów** sprawia, że ceny za transakcję są wysokie w przypadku dużej skali. Firmy przetwarzające tysiące dokumentów miesięcznie często stwierdzają, że biblioteki z licencjami wieczystymi, takie jak IronPDF, są bardziej opłacalne niż opłaty za API naliczane za każdy podpis. Jednorazowa inwestycja licencyjna szybko się zwraca w porównaniu do ciągłych kosztów transakcyjnych.
**Specyficzne wymagania procesowe** pojawiają się, gdy zewnętrzne usługi podpisywania mają swoje własne paradygmaty. Zespoły, które mają nietypowe procesy zatwierdzania, specjalistyczną obsługę dokumentów lub wymagania integracyjne, które nie pasują do standardowych ofert, często uważają, że łatwiej jest stworzyć własne rozwiązanie niż próbować dostosować się do ograniczeń usługi.
**Polityka suwerenności danych i bezpieczeństwa** uniemożliwia niektórym firmom wysyłanie dokumentów do usług zewnętrznych ze względu na przepisy, politykę bezpieczeństwa lub zobowiązania umowne. Utrzymanie procesu podpisywania wewnętrznie zapewnia, że dokumenty pozostają wewnątrz granic korporacyjnych przez cały czas.
**Środowiska offline lub odizolowane** nie mogą polegać na rozwiązaniach hostowanych, które wymagają łączności sieciowej. Aplikacje, które muszą działać w trybie offline (aplikacje do obsługi terenowej, systemy o ograniczonym dostępie lub miejsca z niestabilnym połączeniem internetowym), wymagają lokalnie wdrożonych funkcji podpisywania.
**Przewidywalność kosztów** ma znaczenie, ponieważ subskrypcja oparta na cenach generuje trwające wydatki, które się kumulują. Licencje biblioteczne wieczyste zapewniają stabilne koszty, które działy finansowe mogą uwzględnić w planach bez obaw o wahania wolumenu lub podwyżki cen.
### W jakich sytuacjach warto wybrać rozwiązania Hosted Signing Solutions?
Rozwiązania hostowane sprawdzają się w różnych okolicznościach:
**Niewielka liczba dokumentów z różnymi stronami podpisującymi** ma miejsce, gdy dokumenty wymagają podpisów od osób spoza firmy, które nie posiadają własnych certyfikatów. Usługi zajmujące się weryfikacją tożsamości i wydawaniem certyfikatów zmniejszają utrudnienia. Budowanie takiej infrastruktury wewnętrznie rzadko się opłaca w przypadku sporadycznego użytkowania.
**Szybkie wdrożenie** ma znaczenie, gdy trzeba szybko rozpocząć pracę bez zasobów programistycznych do tworzenia od podstaw. Te platformy mają gotowe interfejsy użytkownika i powiadomienia e-mail, które zapewniają funkcjonalność gotową do użycia.
**Delegowanie obowiązków w zakresie zgodności z przepisami** staje się cenne, gdy dostawcy specjalizują się w konkretnych ramach regulacyjnych i mogą zapewnić certyfikaty lub poświadczenia, których uzyskanie we własnym zakresie byłoby kosztowne.
Decyzja często sprowadza się do tego, czy podpisywanie jest kluczową kompetencją, w którą warto zainwestować, czy też funkcją standardową, którą lepiej pozostawić specjalistom. Firmy, dla których obsługa dokumentów stanowi centralny element działalności (kancelarie prawne, instytucje finansowe, placówki służby zdrowia, agencje rządowe), zazwyczaj osiągają lepsze wyniki dzięki posiadaniu własnej infrastruktury do podpisywania dokumentów. Ci, dla których podpisywanie dokumentów ma drugorzędne znaczenie, mogą preferować prostotę opcji outsourcingowych.
### W jaki sposób zespoły programistów mogą ocenić swoje potrzeby w zakresie infrastruktury podpisów?
Przed podjęciem decyzji o wyborze jednego z podejść należy wziąć pod uwagę następujące czynniki:
**Obecny i prognozowany wolumen** decyduje o analizie kosztów. Ile dokumentów wymaga obecnie podpisów i jak ta liczba będzie się zmieniać w przyszłości?
**Kwestie związane z integracją** mają wpływ na architekturę. Jak podpisywanie dokumentów wpasuje się w istniejące aplikacje i procesy robocze? Biblioteki oferują maksymalną elastyczność, podczas gdy platformy zewnętrzne mogą wymagać dostosowania do ich interfejsów API i interfejsów użytkownika.
**Rodzaje stron podpisujących** wpływają na stopień złożoności. Czy dokumenty będą podpisywane wyłącznie przez użytkowników wewnętrznych posiadających certyfikaty zarządzane, czy też konieczne będzie uwzględnienie również podpisujących z zewnątrz?
**Wymogi zgodności z przepisami** określają wymagania techniczne. Jakie przepisy mają zastosowanie i jak wpływają one na wybory dotyczące wdrożenia? Niektóre wymagania łatwiej jest spełnić, korzystając z usług; inne wymagają kontroli wewnętrznej.
O wykonalności decydują **zasoby techniczne**. Czy zespół dysponuje zasobami niezbędnymi do wdrożenia i utrzymania funkcji podpisywania, czy też odwróciłoby to uwagę od głównych priorytetów rozwoju?
---
## Kolejne kroki
Wbudowanie podpisów cyfrowych w aplikacje .NET oznacza zrozumienie zarówno podstaw kryptografii, jak i praktycznych potrzeb, które napędzają przetwarzanie dokumentów biznesowych. [IronPDF](https://ironpdf.com/) zapewnia podstawy techniczne do [podpisywania opartego na certyfikatach](/how-to/signing/), [wizualnego renderowania podpisów](/how-to/signing/), obsługi wielostronnych procesów oraz [weryfikacji podpisów](/tutorials/csharp-pdf-security-complete-tutorial/), pozostawiając decyzje architektoniczne dotyczące tego, kiedy i jak korzystać z tych funkcji, programistom znającym swoje konkretne wymagania.
Funkcje omówione w tym przewodniku stanowią podstawę solidnych implementacji podpisów, niezależnie od tego, czy automatyzujesz realizację umów, wdrażasz łańcuchy zatwierdzeń, czy spełniasz wymogi zgodności. W przypadku środowisk Enterprise, które wymagają przechowywania kluczy w sprzęcie, [przewodnik po podpisywaniu HSM](/how-to/signing-pdf-with-hsm/) rozszerza te wzorce na urządzenia PKCS#11. Gdy podpisy są częścią szerszej strategii bezpieczeństwa dokumentów, połącz je z [ochroną hasłem, uprawnieniami](/how-to/pdf-permissions-passwords/) i [szyfrowaniem plików](/tutorials/encrypt-pdf-csharp/) [PDF,](/tutorials/encrypt-pdf-csharp/) aby zapewnić wielowarstwową ochronę.
Czy jesteś gotowy do rozpoczęcia budowy? [Pobierz IronPDF](download-modal) i wyprobuj go z darmowa wersja probna. Przed podjęciem decyzji o zakupie można przetestować podpisywanie oparte na certyfikatach, weryfikację podpisów oraz procesy wieloosobowe na rzeczywistych dokumentach. Jeśli masz pytania dotyczące architektury podpisywania lub integracji zgodności, [skontaktuj się z naszym zespołem wsparcia technicznego](/troubleshooting/engineering-request-pdf/).
Podpisy cyfrowe w C# .NET uwierzytelniają dokumenty PDF za pomocą kryptografii opartej na certyfikacie X.509, zapewniając wykrywanie ingerencji, niemożność zanegowania oraz długoterminową ważność, które sama wizualna grafika podpisu nie może zapewnić. IronPDF ułatwia programistom .NET programowe podpisywanie, weryfikację oraz zabezpieczanie PDF, obejmując wszystko od podstawowego podpisu certyfikatowego i wizualizacji podpisu po procesy wieloetapowego zatwierdzania, integrację z serwerem sygnatury czasowej oraz zgodność regulacyjną z ramami takimi jak eIDAS i Ustawa ESIGN.
TL;DR: Przewodnik Quickstart
Ten samouczek dotyczy programowego podpisywania, weryfikacji i zabezpieczania dokumentów PDF za pomocą certyfikatów X.509 w C#, od pojedynczych podpisów po wieloetapowe łańcuchy zatwierdzeń.
Dla kogo to jest: programiści .NET, którzy budują podpisy dokumentów w systemach zarządzania kontraktami, przetwarzania faktur lub systemach zgodności.
Co zbudujesz: Podpisywanie PDF oparte na certyfikacie (.p12), nakładki wizualne podpisów, sekwencyjne przepływy wielopodmiotowe, weryfikację podpisu, wykrywanie manipulacji oraz blokowanie dokumentów sterowane zezwoleniami.
Gdzie działa: .NET 10, .NET 8 LTS, .NET Ramy 4.6.2+ oraz .NET Standard 2.0.
Kiedy używać tego podejścia: Kiedy potrzebujesz podpisywać PDF programowo na dużą skalę bez kierowania przez zewnętrzne portale podpisywania.
Dlaczego to ma znaczenie techniczne: Podpisy kryptograficzne zapewniają dowody ingerencji, niemożność zanegowania i długoterminową ważność, której wizualne obrazy podpisów nie mogą zaoferować.
Aby śledzić przykłady kodu w tym samouczku, sprawdź szybki przewodnik instalacji, aby ustawić IronPDF w swoim projekcie. Podpisz swój pierwszy PDF za pomocą kilku linijek kodu:
1Install IronPDF with NuGet Package Manager
PM > Install-Package IronPdf
Install-Package IronPdf
2Skopiuj i uruchom ten fragment kodu.
var signature = new IronPdf.Signing.PdfSignature("certificate.pfx", "password");IronPdf.PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("signed.pdf");
var signature = new IronPdf.Signing.PdfSignature("certificate.pfx", "password");
IronPdf.PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("signed.pdf");
Dim signature As New IronPdf.Signing.PdfSignature("certificate.pfx", "password")IronPdf.PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("signed.pdf")
Dim signature As New IronPdf.Signing.PdfSignature("certificate.pfx", "password")
IronPdf.PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("signed.pdf")
3Wdrożenie do testowania w środowisku produkcyjnym
Jaka jest różnica między podpisami cyfrowymi a wizualnymi w dokumentach PDF?
Ludzie często używają "podpisu cyfrowego" i "podpisu elektronicznego" zamiennie, ale działają zupełnie inaczej, jeśli chodzi o bezpieczeństwo dokumentów. Podpis cyfrowy używa technik kryptograficznych do szyfrowania skrótu zawartości dokumentu przy użyciu klucza prywatnego. Każdy, kto ma dostęp do odpowiadającego klucza publicznego, może zweryfikować, czy dokument nie został zmieniony od momentu podpisania.
Z drugiej strony, podpis wizualny to po prostu obraz umieszczony na stronie PDF. Może to być zeskanowany odręczny podpis, logo firmy lub stylizowana wersja tekstu imienia. Podpisy wizualne pomagają dokumentom wyglądać na "podpisane" dla ludziach czytelników, lecz nie oferują ochrony kryptograficznej przed manipulacją.
W praktyce aplikacje biznesowe często potrzebują obu rodzajów działających razem. Umowa prawna może wymagać kryptograficznej ochrony podpisu cyfrowego opartego na certyfikacie, aby zapewnić integralność dokumentu, oraz widocznego bloku podpisu, aby odbiorcy mogli zobaczyć, kto podpisał i kiedy.
Poniższa tabela podsumowuje kluczowe różnice między tymi typami podpisów:
Charakterystyka
Podpis cyfrowy
Podpis wizualny
Ochrona kryptograficzna
Używa PKI i certyfikatów X.509 do stworzenia pieczęci wykrywającej manipulacje
Brak, obraz można usunąć lub zastąpić
Niemożność zanegowania
Podpisujący nie może wiarygodnie zaprzeczyć podpisaniu
Nie dostarcza technicznego dowodu tożsamości
Wykrywanie ingerencji
Każda modyfikacja unieważnia podpis
Nie ma sposobu wykrycia, czy dokument został zmieniony
Pozycja prawna
Rozpoznawane zgodnie z przepisami jak Ustawa ESIGN i eIDAS
Może zaspokoić wymogi "intencji podpisania" tylko
Weryfikacja
Może być walidowane programowo lub w czytnikach PDF
Wymaga tylko inspekcji wizualnej
Wymagany certyfikat
Tak, wymaga pliku certyfikatu .pfx lub .p12
Nie, dowolny plik obrazu działa
Dla większości przypadków użycia biznesowego, podpisy cyfrowe z dołączoną reprezentacją wizualną oferują najsilniejszą kombinację bezpieczeństwa i użyteczności. Warstwa kryptograficzna zapewnia integralność dokumentu, podczas gdy wizualna warstwa zapewnia znane doświadczenie podpisywania dla odbiorców.
Jak zespoły programistyczne mogą skonfigurować infrastrukturę podpisu cyfrowego?
Wdrażanie podpisów cyfrowych wymaga dwóch rzeczy: certyfikatów X.509 do podpisywania oraz pewnej wiedzy o tym, jak zarządzanie certyfikatami działa w produkcji. Ta sekcja przeprowadza przez każdy składnik.
Jakie formaty certyfikatów obsługuje IronPDF do podpisywania PDF?
Podpisy cyfrowe opierają się na certyfikatach X.509, które zawierają parę kluczy publicznych i prywatnych oraz informacje o tożsamości posiadacza certyfikatu. Te poświadczenia zazwyczaj mają okresy ważności od jednego do trzech lat. IronPDF działa z certyfikatami w standardowym formacie PKCS#12, zwykle przechowywanymi jako pliki .pfx lub .p12. Te pliki łączą klucz prywatny (potrzebny do podpisywania) z certyfikatem publicznym (potrzebnym do weryfikacji) w kontener chroniony hasłem.
Środowiska Enterprise zazwyczaj uzyskują certyfikaty z jednego z kilku źródeł:
Komercyjne Urzędy Certyfikacji takie jak DigiCert, Sectigo lub GlobalSign wydają certyfikaty, które są automatycznie zaufane przez główne czytniki PDF.
Wewnętrzna infrastruktura PKI pozwala organizacjom wydawać własne certyfikaty, chociaż odbiorcy mogą musieć ręcznie zaufać wystawcy CA.
Certyfikaty samopodpisane nadają się do prototypowania, ale wyświetlą ostrzeżenia w czytnikach PDF, chyba że zostaną ręcznie zaufane.
Podczas ładowania certyfikatu dla IronPDF, należy określić flagę X509KeyStorageFlags.Exportable. Pozwala to podsystemowi kryptograficznemu na dostęp do klucza prywatnego do podpisywania. Oto jak poprawnie załadować certyfikat:
using System.Security.Cryptography.X509Certificates;// Load the certificate from a PKCS#12 file (.pfx or .p12)// The Exportable flag allows the private key to be used for signingvar certificate = new X509Certificate2( "company-signing-cert.pfx", "certificate-password",X509KeyStorageFlags.Exportable);
using System.Security.Cryptography.X509Certificates;
// Load the certificate from a PKCS#12 file (.pfx or .p12)
// The Exportable flag allows the private key to be used for signing
var certificate = new X509Certificate2(
"company-signing-cert.pfx",
"certificate-password",
X509KeyStorageFlags.Exportable
);
ImportsSystem.Security.Cryptography.X509Certificates' Load the certificate from a PKCS#12 file (.pfx or .p12)' The Exportable flag allows the private key to be used for signingDim certificate As New X509Certificate2( "company-signing-cert.pfx", "certificate-password",X509KeyStorageFlags.Exportable)
Imports System.Security.Cryptography.X509Certificates
' Load the certificate from a PKCS#12 file (.pfx or .p12)
' The Exportable flag allows the private key to be used for signing
Dim certificate As New X509Certificate2(
"company-signing-cert.pfx",
"certificate-password",
X509KeyStorageFlags.Exportable
)
W produkcji pobierz hasła certyfikatów z bezpiecznych systemów konfiguracji takich jak Azure Key Vault, AWS Secrets Manager, lub HashiCorp Vault zamiast ich umieszczania na stałe w kodzie. Przechowuj pliki certyfikatów z właściwymi kontrolami dostępu i nigdy nie umieszczaj ich w systemie kontroli wersji.
Jak programiści mogą stosować podpisy cyfrowe do dokumentów PDF programowo?
Podstawowy przepływ podpisywania w IronPDF polega na utworzeniu obiektu PdfSignature z certyfikatu i zastosowaniu go do PDF. Ta sekcja omawia proces podpisywania wraz z opcjami dodawania metadanych i konfiguracji zachowania podpisu.
What does Basic Certificate Signing look like in C#?
Najprostszy scenariusz podpisywania to załadowanie istniejącego PDF, utworzenie podpisu z certyfikatu i zapisanie podpisanego wyniku. IronPDF obsługuje wszystkie operacje kryptograficzne w tle:
using IronPdf;using IronPdf.Signing;// Load the PDF document that needs to be signedPdfDocument pdf = PdfDocument.FromFile("contract.pdf");// Create a signature object using the certificate file path and passwordvar signature = new PdfSignature("certificate.pfx", "password");// Apply the cryptographic signature to the document// This embeds an invisible digital signature in the PDF structurepdf.Sign(signature);// Save the signed document to a new filepdf.SaveAs("contract-signed.pdf");
using IronPdf;
using IronPdf.Signing;
// Load the PDF document that needs to be signed
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
// Create a signature object using the certificate file path and password
var signature = new PdfSignature("certificate.pfx", "password");
// Apply the cryptographic signature to the document
// This embeds an invisible digital signature in the PDF structure
pdf.Sign(signature);
// Save the signed document to a new file
pdf.SaveAs("contract-signed.pdf");
ImportsIronPdfImportsIronPdf.Signing' Load the PDF document that needs to be signedDim pdf AsPdfDocument = PdfDocument.FromFile("contract.pdf")' Create a signature object using the certificate file path and passwordDim signature As New PdfSignature("certificate.pfx", "password")' Apply the cryptographic signature to the document' This embeds an invisible digital signature in the PDF structurepdf.Sign(signature)' Save the signed document to a new filepdf.SaveAs("contract-signed.pdf")
Imports IronPdf
Imports IronPdf.Signing
' Load the PDF document that needs to be signed
Dim pdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
' Create a signature object using the certificate file path and password
Dim signature As New PdfSignature("certificate.pfx", "password")
' Apply the cryptographic signature to the document
' This embeds an invisible digital signature in the PDF structure
pdf.Sign(signature)
' Save the signed document to a new file
pdf.SaveAs("contract-signed.pdf")
Wejscie
contract.pdf - Przykładowy kontrakt przed podpisaniem
Wynik
Tworzy to PDF z zakodowanym w nim niewidocznym podpisem cyfrowym. Po otwarciu w Adobe Acrobat lub innym czytniku PDF świadomym podpisu, dokument wyświetla informacje o weryfikacji podpisu, pokazując, czy podpis jest ważny i czy dokument został zmodyfikowany od czasu podpisania.
Dla scenariuszy, w których wymagana jest tylko podpisaniu dokumentu bez ładowania go do pamięci w celu dokonania innych zmian, IronPDF ma uproszczone podejście jedno-liniowe:
using IronPdf;using IronPdf.Signing;// One-line approach for signing PDFs// Useful for batch processing where you don't need to manipulate the documentvar signature = new PdfSignature("certificate.pfx", "password");PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf");
using IronPdf;
using IronPdf.Signing;
// One-line approach for signing PDFs
// Useful for batch processing where you don't need to manipulate the document
var signature = new PdfSignature("certificate.pfx", "password");
PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf");
ImportsIronPdfImportsIronPdf.Signing' One-line approach for signing PDFs' Useful for batch processing where you don't need to manipulate the documentDim signature As New PdfSignature("certificate.pfx", "password")PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf")
Imports IronPdf
Imports IronPdf.Signing
' One-line approach for signing PDFs
' Useful for batch processing where you don't need to manipulate the document
Dim signature As New PdfSignature("certificate.pfx", "password")
PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf")
Jest to szczególnie przydatne do przetwarzania wsadowego, kiedy podpisujemy dużo dokumentów bez wprowadzania innych zmian.
Jak skonfigurować metadane podpisu dla celów audytowych?
Podpisy cyfrowe mogą przenosić metadane, które dają kontekst na temat zdarzenia podpisywania. Ta informacja pojawia się w panelu podpisu czytników PDF i dodaje do ścieżki audytu dokumentu. IronPDF obsługuje kilka standardowych pól metadanych:
using IronPdf;using IronPdf.Signing;using System;// Load the document to be signedPdfDocument pdf = PdfDocument.FromFile("invoice.pdf");// Create a signature with the company certificatevar signature = new PdfSignature("certificate.pfx", "password"){ // Add metadata to create an audit trail // This information appears in the signature panel of PDF readersSigningReason = "Invoice Approval",SigningLocation = "New York Office",SigningContact = "accounts@company.com",SignatureDate = DateTime.UtcNow};// Apply the signature with all metadata includedpdf.Sign(signature);pdf.SaveAs("invoice-approved.pdf");
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to be signed
PdfDocument pdf = PdfDocument.FromFile("invoice.pdf");
// Create a signature with the company certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
// Add metadata to create an audit trail
// This information appears in the signature panel of PDF readers
SigningReason = "Invoice Approval",
SigningLocation = "New York Office",
SigningContact = "accounts@company.com",
SignatureDate = DateTime.UtcNow
};
// Apply the signature with all metadata included
pdf.Sign(signature);
pdf.SaveAs("invoice-approved.pdf");
ImportsIronPdfImportsIronPdf.SigningImportsSystem' Load the document to be signedDim pdf AsPdfDocument = PdfDocument.FromFile("invoice.pdf")' Create a signature with the company certificateDim signature As New PdfSignature("certificate.pfx", "password") With { ' Add metadata to create an audit trail ' This information appears in the signature panel of PDF readers .SigningReason = "Invoice Approval", .SigningLocation = "New York Office", .SigningContact = "accounts@company.com", .SignatureDate = DateTime.UtcNow}' Apply the signature with all metadata includedpdf.Sign(signature)pdf.SaveAs("invoice-approved.pdf")
Imports IronPdf
Imports IronPdf.Signing
Imports System
' Load the document to be signed
Dim pdf As PdfDocument = PdfDocument.FromFile("invoice.pdf")
' Create a signature with the company certificate
Dim signature As New PdfSignature("certificate.pfx", "password") With {
' Add metadata to create an audit trail
' This information appears in the signature panel of PDF readers
.SigningReason = "Invoice Approval",
.SigningLocation = "New York Office",
.SigningContact = "accounts@company.com",
.SignatureDate = DateTime.UtcNow
}
' Apply the signature with all metadata included
pdf.Sign(signature)
pdf.SaveAs("invoice-approved.pdf")
Wejscie
invoice.pdf - Faktura przed podpisaniem
Wynik
Pola metadanych służą różnym celom w przepływach pracy z dokumentami:
W ustawieniach korporacyjnych, te pola często wiążą się z danymi operacyjnymi. System zatwierdzania faktur może ustawić powód podpisania na numer zamówienia zakupu, podczas gdy system zarządzania kontraktami może zawierać identyfikator kontraktu i etap zatwierdzenia.
Jaką rolę odgrywają serwery sygnatury czasowej w ważności podpisu w czasie?
Podpisy cyfrowe zawierają sygnaturę czasową pokazującą kiedy dokument został podpisany, ale ta sygnatura pochodzi z lokalnego zegara komputera podpisującego. Dla podpisów, które mogą wymagać weryfikacji w następnych latach, lub kiedy dowód dokładnego czasu podpisywania ma znaczenie prawne, zaufana sygnatura czasowa od zewnętrznego Urzędu Sygnatur Czasowych (TSA) daje znacznie silniejsze dowody.
Serwer sygnatury czasowej zapewnia kryptograficzny dowód, że dokument istniał w swojej obecnej formie w określonym momencie. Nawet jeśli certyfikat podpisu później wygaśnie lub zostanie odwołany, sygnatura czasowa pokazuje, że podpis był ważny, kiedy został zastosowany. IronPDF obsługuje serwery sygnatury czasowej zgodne z RFC 3161:
using IronPdf;using IronPdf.Signing;using System;// Load the document to signPdfDocument pdf = PdfDocument.FromFile("agreement.pdf");var signature = new PdfSignature("certificate.pfx", "password"){SigningReason = "Agreement Execution", // Configure a trusted timestamp server (RFC 3161 compliant) // This provides cryptographic proof of when the document was signedTimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,TimeStampUrl = "http://timestamp.digicert.com"};// Apply the signature with the trusted timestamppdf.Sign(signature);pdf.SaveAs("agreement-timestamped.pdf");
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("agreement.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Agreement Execution",
// Configure a trusted timestamp server (RFC 3161 compliant)
// This provides cryptographic proof of when the document was signed
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
TimeStampUrl = "http://timestamp.digicert.com"
};
// Apply the signature with the trusted timestamp
pdf.Sign(signature);
pdf.SaveAs("agreement-timestamped.pdf");
ImportsIronPdfImportsIronPdf.SigningImportsSystem' Load the document to signDim pdf AsPdfDocument = PdfDocument.FromFile("agreement.pdf")Dim signature As New PdfSignature("certificate.pfx", "password") With { .SigningReason = "Agreement Execution", ' Configure a trusted timestamp server (RFC 3161 compliant) ' This provides cryptographic proof of when the document was signed .TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256, .TimeStampUrl = "http://timestamp.digicert.com"}' Apply the signature with the trusted timestamppdf.Sign(signature)pdf.SaveAs("agreement-timestamped.pdf")
Imports IronPdf
Imports IronPdf.Signing
Imports System
' Load the document to sign
Dim pdf As PdfDocument = PdfDocument.FromFile("agreement.pdf")
Dim signature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Agreement Execution",
' Configure a trusted timestamp server (RFC 3161 compliant)
' This provides cryptographic proof of when the document was signed
.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
.TimeStampUrl = "http://timestamp.digicert.com"
}
' Apply the signature with the trusted timestamp
pdf.Sign(signature)
pdf.SaveAs("agreement-timestamped.pdf")
Wejscie
agreement.pdf - Umowa serwisowa przed podpisaniem
Wynik
Dostępnych jest kilka publicznych serwerów sygnatury czasowej do ogólnego użytku, w tym te działające przez główne urzędy certyfikacji. Większe organizacje mogą również prowadzić własne wewnętrzne serwery sygnatury czasowej, które przestrzegają polityk bezpieczeństwa firmy.
Wybór algorytmu skrótu ma znaczenie dla przedłużonej ważności. SHA 256 jest obecnym standardem, chociaż IronPDF obsługuje również SHA 512 dla ściślejszych wymagań bezpieczeństwa. Starsze algorytmy jak SHA 1 powinny być unikane, ponieważ nie są już uważane za kryptograficznie bezpieczne.
Kiedy powinny być podpisy niewidoczne a kiedy widoczne na dokumencie?
Podpisy cyfrowe mogą być stosowane w dwóch trybach: niewidoczne podpisy, które istnieją tylko w strukturze kryptograficznej PDF, lub widoczne podpisy, które wyświetlają również graficzną reprezentację na wyznaczonej stronie. Wybór zależy od przeznaczenia dokumentu i oczekiwań jego odbiorców.
Niewidzialne podpisy dobrze sprawdzają się w zautomatyzowanym przetwarzaniu dokumentów, gdzie nie oczekuje się przeglądu przez człowieka, w sytuacjach, gdy istniejący układ dokumentu nie powinien ulec zmianie, oraz w przepływach pracy z wieloma podpisami, gdzie widoczne podpisy zagracałyby dokument.
Widoczne podpisy są preferowane, gdy odbiorcy oczekują zobaczyć wizualny dowód podpisania, gdy przepływy pracy wymagają umieszczenia podpisów w określonych miejscach, lub gdy dokument zostanie wydrukowany i podpis powinien się pojawić na papierze.
Jak dodawane są wyglądy wizualnych podpisów do cyfrowo podpisanych PDF?
Wiele procesów biznesowych powstało wokół widocznych bloków podpisów, a odbiorcy często oczekują zobaczyć gdzie i kiedy dokument został podpisany. IronPDF pozwala na zastosowanie ochrony kryptograficznej przy jednoczesnym wyświetlaniu widocznego podpisu na stronie, dając najlepsze z obu światów.
Jak można załadować i umieścić obrazy podpisów?
Wizualny podpis to zazwyczaj obraz (jak zeskanowany odręczny podpis, pieczęć firmowa lub stylizowany blok tekstu) umieszczony w określonym miejscu na stronie PDF. Metoda LoadSignatureImageFromFile IronPDF obsługuje pozycjonowanie i renderowanie:
using IronPdf;using IronPdf.Signing;using IronSoftware.Drawing;// Load the document to signPdfDocument pdf = PdfDocument.FromFile("contract.pdf");var signature = new PdfSignature("certificate.pfx", "password"){SigningReason = "Contract Approval",SigningLocation = "Head Office"};// Define the position and size for the visible signature image// Rectangle parameters: x position, y position, width, height (in points)// Points are measured from the bottom-left corner of the pagevar signatureArea = new Rectangle(150, 100, 200, 50);// Load and attach the visual signature image// The image will appear at the specified location on the documentsignature.LoadSignatureImageFromFile( "signature-image.png", // Path to the signature image file 0, // Page index (0 = first page) signatureArea // Position and dimensions);// Apply both the cryptographic signature and visual representationpdf.Sign(signature);pdf.SaveAs("contract-visually-signed.pdf");
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Contract Approval",
SigningLocation = "Head Office"
};
// Define the position and size for the visible signature image
// Rectangle parameters: x position, y position, width, height (in points)
// Points are measured from the bottom-left corner of the page
var signatureArea = new Rectangle(150, 100, 200, 50);
// Load and attach the visual signature image
// The image will appear at the specified location on the document
signature.LoadSignatureImageFromFile(
"signature-image.png", // Path to the signature image file
0, // Page index (0 = first page)
signatureArea // Position and dimensions
);
// Apply both the cryptographic signature and visual representation
pdf.Sign(signature);
pdf.SaveAs("contract-visually-signed.pdf");
ImportsIronPdfImportsIronPdf.SigningImportsIronSoftware.Drawing' Load the document to signDim pdf AsPdfDocument = PdfDocument.FromFile("contract.pdf")Dim signature As New PdfSignature("certificate.pfx", "password") With { .SigningReason = "Contract Approval", .SigningLocation = "Head Office"}' Define the position and size for the visible signature image' Rectangle parameters: x position, y position, width, height (in points)' Points are measured from the bottom-left corner of the pageDim signatureArea As New Rectangle(150, 100, 200, 50)' Load and attach the visual signature image' The image will appear at the specified location on the documentsignature.LoadSignatureImageFromFile( "signature-image.png", ' Path to the signature image file 0, ' Page index (0 = first page) signatureArea ' Position and dimensions)' Apply both the cryptographic signature and visual representationpdf.Sign(signature)pdf.SaveAs("contract-visually-signed.pdf")
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
' Load the document to sign
Dim pdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
Dim signature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Contract Approval",
.SigningLocation = "Head Office"
}
' Define the position and size for the visible signature image
' Rectangle parameters: x position, y position, width, height (in points)
' Points are measured from the bottom-left corner of the page
Dim signatureArea As New Rectangle(150, 100, 200, 50)
' Load and attach the visual signature image
' The image will appear at the specified location on the document
signature.LoadSignatureImageFromFile(
"signature-image.png", ' Path to the signature image file
0, ' Page index (0 = first page)
signatureArea ' Position and dimensions
)
' Apply both the cryptographic signature and visual representation
pdf.Sign(signature)
pdf.SaveAs("contract-visually-signed.pdf")
Wynik
System współrzędnych używa punktów (1/72 cała) mierzone od lewego dolnego rogu strony. Dla standardowej strony US Letter (612 x 792 punktów), umieszczenie podpisu blisko prawego dolnego rogu oznacza uwzględnienie zarówno rozmiaru podpisu, jak i odpowiednich marginesów.
Istnieją alternatywne metody ładowania obrazów podpisów z różnych źródeł:
using IronPdf.Signing;using IronSoftware.Drawing;using System.IO;// Create signature objectvar signature = new PdfSignature("certificate.pfx", "password");var signatureArea = new Rectangle(400, 50, 150, 75);// Method 1: Load signature image directly from a file pathsignature.LoadSignatureImageFromFile("signature.png", 0, signatureArea);// Method 2: Load from a stream (useful for database-stored images)using (FileStream imageStream = File.OpenRead("signature.png")){ signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea);}// Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)AnyBitmap signatureBitmap = AnyBitmap.FromFile("signature.png");using (var stream = signatureBitmap.ToStream()){ signature.LoadSignatureImageFromStream(stream, 0, signatureArea);}
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.IO;
// Create signature object
var signature = new PdfSignature("certificate.pfx", "password");
var signatureArea = new Rectangle(400, 50, 150, 75);
// Method 1: Load signature image directly from a file path
signature.LoadSignatureImageFromFile("signature.png", 0, signatureArea);
// Method 2: Load from a stream (useful for database-stored images)
using (FileStream imageStream = File.OpenRead("signature.png"))
{
signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea);
}
// Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)
AnyBitmap signatureBitmap = AnyBitmap.FromFile("signature.png");
using (var stream = signatureBitmap.ToStream())
{
signature.LoadSignatureImageFromStream(stream, 0, signatureArea);
}
ImportsIronPdf.SigningImportsIronSoftware.DrawingImportsSystem.IO' Create signature objectDim signature As New PdfSignature("certificate.pfx", "password")Dim signatureArea As New Rectangle(400, 50, 150, 75)' Method 1: Load signature image directly from a file pathsignature.LoadSignatureImageFromFile("signature.png", 0, signatureArea)' Method 2: Load from a stream (useful for database-stored images)Using imageStream AsFileStream = File.OpenRead("signature.png") signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea)EndUsing' Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)Dim signatureBitmap AsAnyBitmap = AnyBitmap.FromFile("signature.png")Using stream AsStream = signatureBitmap.ToStream() signature.LoadSignatureImageFromStream(stream, 0, signatureArea)EndUsing
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System.IO
' Create signature object
Dim signature As New PdfSignature("certificate.pfx", "password")
Dim signatureArea As New Rectangle(400, 50, 150, 75)
' Method 1: Load signature image directly from a file path
signature.LoadSignatureImageFromFile("signature.png", 0, signatureArea)
' Method 2: Load from a stream (useful for database-stored images)
Using imageStream As FileStream = File.OpenRead("signature.png")
signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea)
End Using
' Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)
Dim signatureBitmap As AnyBitmap = AnyBitmap.FromFile("signature.png")
Using stream As Stream = signatureBitmap.ToStream()
signature.LoadSignatureImageFromStream(stream, 0, signatureArea)
End Using
Obsługiwane formaty obrazów obejmują PNG, JPEG, GIF, BMP, TIFF i WebP. Pliki PNG z przezroczystością świetnie sprawdzają się dla obrazów podpisów, ponieważ przezroczyste tło pozwala wyświetlić się treści dokumentu poniżej.
Jak działa pozycjonowanie podpisu na wielu stronach?
Podczas podpisywania dokumentów wielostronicowych, podpis cyfrowy chroni cały dokument bez względu na ilość stron. Pojedynczy kryptograficzny podpis obejmuje wszystkie strony w PDF:
using IronPdf;using IronPdf.Signing;// Load a multi-page documentPdfDocument pdf = PdfDocument.FromFile("multi-page-contract.pdf");// Create signature - digital signatures protect the entire document// regardless of page countvar signature = new PdfSignature("certificate.pfx", "password");// Sign and save the document// The signature applies to all pages in the documentpdf.Sign(signature);pdf.SaveAs("contract-signed-last-page.pdf");
using IronPdf;
using IronPdf.Signing;
// Load a multi-page document
PdfDocument pdf = PdfDocument.FromFile("multi-page-contract.pdf");
// Create signature - digital signatures protect the entire document
// regardless of page count
var signature = new PdfSignature("certificate.pfx", "password");
// Sign and save the document
// The signature applies to all pages in the document
pdf.Sign(signature);
pdf.SaveAs("contract-signed-last-page.pdf");
ImportsIronPdfImportsIronPdf.Signing' Load a multi-page documentDim pdf AsPdfDocument = PdfDocument.FromFile("multi-page-contract.pdf")' Create signature - digital signatures protect the entire document' regardless of page countDim signature As New PdfSignature("certificate.pfx", "password")' Sign and save the document' The signature applies to all pages in the documentpdf.Sign(signature)pdf.SaveAs("contract-signed-last-page.pdf")
Imports IronPdf
Imports IronPdf.Signing
' Load a multi-page document
Dim pdf As PdfDocument = PdfDocument.FromFile("multi-page-contract.pdf")
' Create signature - digital signatures protect the entire document
' regardless of page count
Dim signature As New PdfSignature("certificate.pfx", "password")
' Sign and save the document
' The signature applies to all pages in the document
pdf.Sign(signature)
pdf.SaveAs("contract-signed-last-page.pdf")
Wejscie
multi-page-contract.pdf (ostatnia strona) - Strona podpisu przed podpisaniem
Wynik
Dla podpisów na wielu stronach (jak inicjały na każdej stronie umowy prawnej), programiści mogą stosować stemple obrazów oddzielnie od kryptograficznego podpisu:
using IronPdf;using IronPdf.Editing;using IronPdf.Signing;using IronSoftware.Drawing;// Load the documentPdfDocument pdf = PdfDocument.FromFile("agreement.pdf");// Create an image stamp for initials that will appear on every pagevar initialsStamp = new ImageStamper("initials.png"){HorizontalAlignment = HorizontalAlignment.Right,VerticalAlignment = VerticalAlignment.Bottom,HorizontalOffset = new Length(50, MeasurementUnit.Points),VerticalOffset = new Length(50, MeasurementUnit.Points)};// Apply initials stamp to all pagespdf.ApplyStamp(initialsStamp);// Now apply the cryptographic signature with a full signature image on the last pagevar signature = new PdfSignature("certificate.pfx", "password");var signatureArea = new Rectangle(100, 100, 200, 100);signature.SignatureImage = new PdfSignatureImage( "full-signature.png", pdf.PageCount - 1, // Last page only signatureArea);// Sign the entire document cryptographicallypdf.Sign(signature);pdf.SaveAs("agreement-initialed-and-signed.pdf");
using IronPdf;
using IronPdf.Editing;
using IronPdf.Signing;
using IronSoftware.Drawing;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("agreement.pdf");
// Create an image stamp for initials that will appear on every page
var initialsStamp = new ImageStamper("initials.png")
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
HorizontalOffset = new Length(50, MeasurementUnit.Points),
VerticalOffset = new Length(50, MeasurementUnit.Points)
};
// Apply initials stamp to all pages
pdf.ApplyStamp(initialsStamp);
// Now apply the cryptographic signature with a full signature image on the last page
var signature = new PdfSignature("certificate.pfx", "password");
var signatureArea = new Rectangle(100, 100, 200, 100);
signature.SignatureImage = new PdfSignatureImage(
"full-signature.png",
pdf.PageCount - 1, // Last page only
signatureArea
);
// Sign the entire document cryptographically
pdf.Sign(signature);
pdf.SaveAs("agreement-initialed-and-signed.pdf");
ImportsIronPdfImportsIronPdf.EditingImportsIronPdf.SigningImportsIronSoftware.Drawing' Load the documentDim pdf AsPdfDocument = PdfDocument.FromFile("agreement.pdf")' Create an image stamp for initials that will appear on every pageDim initialsStamp As New ImageStamper("initials.png") With { .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom, .HorizontalOffset = New Length(50, MeasurementUnit.Points), .VerticalOffset = New Length(50, MeasurementUnit.Points)}' Apply initials stamp to all pagespdf.ApplyStamp(initialsStamp)' Now apply the cryptographic signature with a full signature image on the last pageDim signature As New PdfSignature("certificate.pfx", "password")Dim signatureArea As New Rectangle(100, 100, 200, 100)signature.SignatureImage = New PdfSignatureImage( "full-signature.png", pdf.PageCount - 1, ' Last page only signatureArea)' Sign the entire document cryptographicallypdf.Sign(signature)pdf.SaveAs("agreement-initialed-and-signed.pdf")
Imports IronPdf
Imports IronPdf.Editing
Imports IronPdf.Signing
Imports IronSoftware.Drawing
' Load the document
Dim pdf As PdfDocument = PdfDocument.FromFile("agreement.pdf")
' Create an image stamp for initials that will appear on every page
Dim initialsStamp As New ImageStamper("initials.png") With {
.HorizontalAlignment = HorizontalAlignment.Right,
.VerticalAlignment = VerticalAlignment.Bottom,
.HorizontalOffset = New Length(50, MeasurementUnit.Points),
.VerticalOffset = New Length(50, MeasurementUnit.Points)
}
' Apply initials stamp to all pages
pdf.ApplyStamp(initialsStamp)
' Now apply the cryptographic signature with a full signature image on the last page
Dim signature As New PdfSignature("certificate.pfx", "password")
Dim signatureArea As New Rectangle(100, 100, 200, 100)
signature.SignatureImage = New PdfSignatureImage(
"full-signature.png",
pdf.PageCount - 1, ' Last page only
signatureArea
)
' Sign the entire document cryptographically
pdf.Sign(signature)
pdf.SaveAs("agreement-initialed-and-signed.pdf")
To podejście oddziela naturalne elementy wizualne (które mogą pojawić się na wielu stronach) od kryptograficznego podpisu (który chroni cały dokument).
Moją ulubioną biblioteką tego typu jest IronPDF. Umożliwia ona szybkie i efektywne manipulowanie plikami PDF. Posiada także wiele cennych funkcji, takich jak eksport do formatu PDF/A i cyfrowe podpisywanie dokumentów PDF.
IronOCR pozwala nam oszczędzić 40 000 USD rocznie na ręcznym przetwarzaniu, jednocześnie zwiększając produktywność i uwalniając zasoby do zadań o wysokim wpływie. Gorąco polecam.
Jak funkcjonują przepływy pracy wersji podpisów wielostronnych w aplikacjach korporacyjnych?
Złożone procesy biznesowe często wymagają wielu podpisów od różnych osób, stosowanych w określonej kolejności. Zamówienie zakupu może wymagać zatwierdzenia przez kierownika działu, następnie przeglądu finansowego, a następnie podpisu kierownictwa. IronPDF obsługuje te przepływy pracy poprzez przyrostowe zapisywanie i uprawnienia do podpisu.
Co to jest podpisywanie sekwencyjne i jak umożliwia to zapisywanie przyrostowe?
Dokumenty PDF mogą przechowywać wewnętrzne wiele wersji, podobnie jak systemy kontroli wersji. Za każdym razem, gdy ktoś podpisuje, ten podpis dotyczy stanu dokumentu w danym momencie. Osoby podpisujące się później dodają swoje podpisy do nowych wersji, tworząc łańcuch zatwierdzeń, w którym każdy podpis można zweryfikować niezależnie.
using IronPdf;using IronPdf.Signing;// Load the purchase order documentPdfDocument pdf = PdfDocument.FromFile("purchase-order.pdf");// First signer: Department Manager approves the purchase ordervar managerSignature = new PdfSignature("certificate.pfx", "password"){SigningReason = "Manager Approval",SigningLocation = "Department A"};// Sign the document and save// This preserves the original state while adding the signaturepdf.Sign(managerSignature);pdf.SaveAs("po-manager-approved.pdf");
using IronPdf;
using IronPdf.Signing;
// Load the purchase order document
PdfDocument pdf = PdfDocument.FromFile("purchase-order.pdf");
// First signer: Department Manager approves the purchase order
var managerSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Manager Approval",
SigningLocation = "Department A"
};
// Sign the document and save
// This preserves the original state while adding the signature
pdf.Sign(managerSignature);
pdf.SaveAs("po-manager-approved.pdf");
ImportsIronPdfImportsIronPdf.Signing' Load the purchase order documentDim pdf AsPdfDocument = PdfDocument.FromFile("purchase-order.pdf")' First signer: Department Manager approves the purchase orderDim managerSignature As New PdfSignature("certificate.pfx", "password") With { .SigningReason = "Manager Approval", .SigningLocation = "Department A"}' Sign the document and save' This preserves the original state while adding the signaturepdf.Sign(managerSignature)pdf.SaveAs("po-manager-approved.pdf")
Imports IronPdf
Imports IronPdf.Signing
' Load the purchase order document
Dim pdf As PdfDocument = PdfDocument.FromFile("purchase-order.pdf")
' First signer: Department Manager approves the purchase order
Dim managerSignature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Manager Approval",
.SigningLocation = "Department A"
}
' Sign the document and save
' This preserves the original state while adding the signature
pdf.Sign(managerSignature)
pdf.SaveAs("po-manager-approved.pdf")
Wejscie
purchase-order.PDF - Zamówienie oczekujące na zatwierdzenie
Wynik
Gdy dokument trafia do kolejnego zatwierdzającego, osoba ta wczytuje go i dodaje swój podpis:
using IronPdf;using IronPdf.Signing;// Load the document that already has the manager's signaturePdfDocument pdf = PdfDocument.FromFile("po-manager-approved.pdf");// Second signer: Finance department verifies budget availabilityvar financeSignature = new PdfSignature("certificate.pfx", "password"){SigningReason = "Finance Approval",SigningLocation = "Finance Department"};// Add the second signature// Both signatures remain independently verifiablepdf.Sign(financeSignature);pdf.SaveAs("po-finance-approved.pdf");
using IronPdf;
using IronPdf.Signing;
// Load the document that already has the manager's signature
PdfDocument pdf = PdfDocument.FromFile("po-manager-approved.pdf");
// Second signer: Finance department verifies budget availability
var financeSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Finance Approval",
SigningLocation = "Finance Department"
};
// Add the second signature
// Both signatures remain independently verifiable
pdf.Sign(financeSignature);
pdf.SaveAs("po-finance-approved.pdf");
ImportsIronPdfImportsIronPdf.Signing' Load the document that already has the manager's signatureDim pdf AsPdfDocument = PdfDocument.FromFile("po-manager-approved.pdf")' Second signer: Finance department verifies budget availabilityDim financeSignature As New PdfSignature("certificate.pfx", "password") With { .SigningReason = "Finance Approval", .SigningLocation = "Finance Department"}' Add the second signature' Both signatures remain independently verifiablepdf.Sign(financeSignature)pdf.SaveAs("po-finance-approved.pdf")
Imports IronPdf
Imports IronPdf.Signing
' Load the document that already has the manager's signature
Dim pdf As PdfDocument = PdfDocument.FromFile("po-manager-approved.pdf")
' Second signer: Finance department verifies budget availability
Dim financeSignature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Finance Approval",
.SigningLocation = "Finance Department"
}
' Add the second signature
' Both signatures remain independently verifiable
pdf.Sign(financeSignature)
pdf.SaveAs("po-finance-approved.pdf")
Wynik
Każda wersja posiada własny podpis, a czytniki plików PDF mogą wyświetlać pełną historię tego, kto i kiedy podpisał dokument.
Jak można zweryfikować istniejące podpisy przed dodaniem nowych?
Przed dodaniem nowego podpisu do dokumentu kod powinien sprawdzić, czy istniejące podpisy są nadal ważne. Dokument zmodyfikowany poza właściwym przepływem pracy może zawierać nieprawidłowe podpisy, co może wskazywać na manipulację lub naruszenie procedur.
using IronPdf;using System;// Load a signed documentPdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");// Verify all existing signatures in the document// Returns true only if ALL signatures are valid and untamperedbool isValid = pdf.VerifyPdfSignatures();Console.WriteLine($"Signatures Valid: {isValid}");// Get signature detailsvar signatures = pdf.GetVerifiedSignatures();Console.WriteLine($"Number of Signatures: {signatures.Count}");
using IronPdf;
using System;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Verify all existing signatures in the document
// Returns true only if ALL signatures are valid and untampered
bool isValid = pdf.VerifyPdfSignatures();
Console.WriteLine($"Signatures Valid: {isValid}");
// Get signature details
var signatures = pdf.GetVerifiedSignatures();
Console.WriteLine($"Number of Signatures: {signatures.Count}");
ImportsIronPdfImportsSystem' Load a signed documentDim pdf AsPdfDocument = PdfDocument.FromFile("contract-signed.pdf")' Verify all existing signatures in the document' Returns true only if ALL signatures are valid and untamperedDim isValid AsBoolean = pdf.VerifyPdfSignatures()Console.WriteLine($"Signatures Valid: {isValid}")' Get signature detailsDim signatures = pdf.GetVerifiedSignatures()Console.WriteLine($"Number of Signatures: {signatures.Count}")
Imports IronPdf
Imports System
' Load a signed document
Dim pdf As PdfDocument = PdfDocument.FromFile("contract-signed.pdf")
' Verify all existing signatures in the document
' Returns true only if ALL signatures are valid and untampered
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
Console.WriteLine($"Signatures Valid: {isValid}")
' Get signature details
Dim signatures = pdf.GetVerifiedSignatures()
Console.WriteLine($"Number of Signatures: {signatures.Count}")
Aby uzyskać bardziej szczegółowe informacje, można pobrać dane dotyczące każdego zweryfikowanego podpisu:
using IronPdf;using System;// Load a document with multiple signaturesPdfDocument pdf = PdfDocument.FromFile("multi-signed-document.pdf");// Retrieve detailed information about each verified signaturevar verifiedSignatures = pdf.GetVerifiedSignatures();// Iterate through all signatures to build an audit trailforeach (var sig in verifiedSignatures){Console.WriteLine($"Signer: {sig.SignerName}");Console.WriteLine($"Reason: {sig.SigningReason}");Console.WriteLine($"Location: {sig.SigningLocation}");Console.WriteLine($"Date: {sig.SigningDate}");Console.WriteLine($"Contact: {sig.SigningContact}");Console.WriteLine("---");}
using IronPdf;
using System;
// Load a document with multiple signatures
PdfDocument pdf = PdfDocument.FromFile("multi-signed-document.pdf");
// Retrieve detailed information about each verified signature
var verifiedSignatures = pdf.GetVerifiedSignatures();
// Iterate through all signatures to build an audit trail
foreach (var sig in verifiedSignatures)
{
Console.WriteLine($"Signer: {sig.SignerName}");
Console.WriteLine($"Reason: {sig.SigningReason}");
Console.WriteLine($"Location: {sig.SigningLocation}");
Console.WriteLine($"Date: {sig.SigningDate}");
Console.WriteLine($"Contact: {sig.SigningContact}");
Console.WriteLine("---");
}
ImportsIronPdfImportsSystem' Load a document with multiple signaturesDim pdf AsPdfDocument = PdfDocument.FromFile("multi-signed-document.pdf")' Retrieve detailed information about each verified signatureDim verifiedSignatures = pdf.GetVerifiedSignatures()' Iterate through all signatures to build an audit trailFor Each sig In verifiedSignaturesConsole.WriteLine($"Signer: {sig.SignerName}")Console.WriteLine($"Reason: {sig.SigningReason}")Console.WriteLine($"Location: {sig.SigningLocation}")Console.WriteLine($"Date: {sig.SigningDate}")Console.WriteLine($"Contact: {sig.SigningContact}")Console.WriteLine("---")Next
Imports IronPdf
Imports System
' Load a document with multiple signatures
Dim pdf As PdfDocument = PdfDocument.FromFile("multi-signed-document.pdf")
' Retrieve detailed information about each verified signature
Dim verifiedSignatures = pdf.GetVerifiedSignatures()
' Iterate through all signatures to build an audit trail
For Each sig In verifiedSignatures
Console.WriteLine($"Signer: {sig.SignerName}")
Console.WriteLine($"Reason: {sig.SigningReason}")
Console.WriteLine($"Location: {sig.SigningLocation}")
Console.WriteLine($"Date: {sig.SigningDate}")
Console.WriteLine($"Contact: {sig.SigningContact}")
Console.WriteLine("---")
Next
Informacje te umożliwiają tworzenie ścieżek audytu, weryfikację łańcuchów zatwierdzeń oraz upewnienie się, że dokumenty posiadają wszystkie wymagane podpisy przed przejściem do kolejnego etapu.
W jaki sposób IronPDF wykrywa sfałszowane dokumenty?
Metoda VerifyPdfSignatures() zwraca false, jeśli jakikolwiek podpis w dokumencie jest nieprawidłowy. Zazwyczaj dzieje się tak, gdy treść została zmodyfikowana po podpisaniu dokumentu, gdy same dane podpisu uległy uszkodzeniu, gdy certyfikat został unieważniony lub gdy certyfikat nie był jeszcze ważny w momencie jego użycia.
using IronPdf;using System;// Load a signed document and verifyPdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");// Check if all signatures are still validbool isValid = pdf.VerifyPdfSignatures();if (isValid){Console.WriteLine("Document has not been tampered with");Console.WriteLine("All signatures are valid");}else{Console.WriteLine("WARNING: Document may have been tampered with!");Console.WriteLine("One or more signatures are invalid");}
using IronPdf;
using System;
// Load a signed document and verify
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Check if all signatures are still valid
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
Console.WriteLine("Document has not been tampered with");
Console.WriteLine("All signatures are valid");
}
else
{
Console.WriteLine("WARNING: Document may have been tampered with!");
Console.WriteLine("One or more signatures are invalid");
}
ImportsIronPdfImportsSystem' Load a signed document and verifyDim pdf AsPdfDocument = PdfDocument.FromFile("contract-signed.pdf")' Check if all signatures are still validDim isValid AsBoolean = pdf.VerifyPdfSignatures()If isValid ThenConsole.WriteLine("Document has not been tampered with")Console.WriteLine("All signatures are valid")ElseConsole.WriteLine("WARNING: Document may have been tampered with!")Console.WriteLine("One or more signatures are invalid")End If
Imports IronPdf
Imports System
' Load a signed document and verify
Dim pdf As PdfDocument = PdfDocument.FromFile("contract-signed.pdf")
' Check if all signatures are still valid
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
If isValid Then
Console.WriteLine("Document has not been tampered with")
Console.WriteLine("All signatures are valid")
Else
Console.WriteLine("WARNING: Document may have been tampered with!")
Console.WriteLine("One or more signatures are invalid")
End If
Dla aplikacji wymagających usunięcia podpisu (może w celu stworzenia niepodpisanej kopii do redystrybucji), IronPDF ma metodę RemoveSignatures():
using IronPdf;// Load a signed documentPdfDocument pdf = PdfDocument.FromFile("signed-template.pdf");// Remove all digital signatures from the document// This strips signature data but does not restore previous document statepdf.RemoveSignatures();// Save as an unsigned versionpdf.SaveAs("unsigned-template.pdf");
using IronPdf;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("signed-template.pdf");
// Remove all digital signatures from the document
// This strips signature data but does not restore previous document state
pdf.RemoveSignatures();
// Save as an unsigned version
pdf.SaveAs("unsigned-template.pdf");
ImportsIronPdf' Load a signed documentDim pdf AsPdfDocument = PdfDocument.FromFile("signed-template.pdf")' Remove all digital signatures from the document' This strips signature data but does not restore previous document statepdf.RemoveSignatures()' Save as an unsigned versionpdf.SaveAs("unsigned-template.pdf")
Imports IronPdf
' Load a signed document
Dim pdf As PdfDocument = PdfDocument.FromFile("signed-template.pdf")
' Remove all digital signatures from the document
' This strips signature data but does not restore previous document state
pdf.RemoveSignatures()
' Save as an unsigned version
pdf.SaveAs("unsigned-template.pdf")
Należy pamiętać, że usunięcie podpisów nie powoduje przywrócenia poprzedniego stanu dokumentu. Metoda ta po prostu usuwa dane podpisu z bieżącej wersji dokumentu.
Jakie możliwości techniczne wspierają zgodność z przepisami dotyczącymi podpisów w plikach PDF?
Przepisy dotyczące podpisów cyfrowych różnią się w zależności od jurysdykcji i branży, ale mają wspólne wymagania techniczne dotyczące weryfikacji certyfikatów, znakowania czasem i metadanych podpisu. Zamiast próbować interpretować konkretne wymogi prawne (które należy omówić z wykwalifikowanym doradcą prawnym), niniejsza sekcja skupia się na możliwościach technicznych, których zazwyczaj wymagają ramy zgodności.
Jakie są kluczowe ramy regulacyjne dotyczące podpisów cyfrowych?
Poniższa tabela zawiera podsumowanie popularnych ram regulacyjnych oraz ich ogólnych wymagań technicznych:
Ramy
Jurysdykcja
Kluczowe wymagania techniczne
Ustawa ESIGN
Stany Zjednoczone
Zamiar podpisania, zgoda na dokumentację elektroniczną, przechowywanie dokumentacji
UETA
Stany USA
Podobnie jak w przypadku ESIGN, ma zastosowanie do transakcji wewnątrzstanowych
eIDAS
Unia Europejska
Trzy poziomy podpisu (prosty, zaawansowany, kwalifikowany); poziom kwalifikowany wymaga QSCD
21 CFR część 11
Amerykańska Agencja ds. Żywności i Leków (FDA)
Podpisy elektroniczne muszą być powiązane z dokumentacją elektroniczną, wymagane są ścieżki audytu
Ramyi te zazwyczaj uznają podpisy cyfrowe za prawnie równoważne podpisom odręcznym, o ile są one prawidłowo wdrożone. Wartość dowodowa podpisu cyfrowego często zależy od udowodnienia, że podpis był ważny w momencie jego złożenia, dlatego zaufane sygnatury czasowe stają się niezbędne do przechowywania dokumentów przez lata lub dziesięciolecia.
using IronPdf;using IronPdf.Signing;using System;// Load the compliance documentPdfDocument pdf = PdfDocument.FromFile("compliance-document.pdf");var signature = new PdfSignature("certificate.pfx", "password"){ // Add comprehensive metadata for audit trail requirementsSigningReason = "21 CFR Part 11 Compliance Certification",SigningLocation = "Quality Assurance Department",SigningContact = "compliance@company.com",SignatureDate = DateTime.UtcNow, // Configure a trusted timestamp for regulatory compliance // The timestamp proves when the signature was appliedTimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,TimeStampUrl = "http://timestamp.digicert.com"};// Apply the signature with timestamp and full metadatapdf.Sign(signature);pdf.SaveAs("compliance-document-certified.pdf");
using IronPdf;
using IronPdf.Signing;
using System;
// Load the compliance document
PdfDocument pdf = PdfDocument.FromFile("compliance-document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
// Add comprehensive metadata for audit trail requirements
SigningReason = "21 CFR Part 11 Compliance Certification",
SigningLocation = "Quality Assurance Department",
SigningContact = "compliance@company.com",
SignatureDate = DateTime.UtcNow,
// Configure a trusted timestamp for regulatory compliance
// The timestamp proves when the signature was applied
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
TimeStampUrl = "http://timestamp.digicert.com"
};
// Apply the signature with timestamp and full metadata
pdf.Sign(signature);
pdf.SaveAs("compliance-document-certified.pdf");
ImportsIronPdfImportsIronPdf.SigningImportsSystem' Load the compliance documentDim pdf AsPdfDocument = PdfDocument.FromFile("compliance-document.pdf")Dim signature As New PdfSignature("certificate.pfx", "password") With { ' Add comprehensive metadata for audit trail requirements .SigningReason = "21 CFR Part 11 Compliance Certification", .SigningLocation = "Quality Assurance Department", .SigningContact = "compliance@company.com", .SignatureDate = DateTime.UtcNow, ' Configure a trusted timestamp for regulatory compliance ' The timestamp proves when the signature was applied .TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256, .TimeStampUrl = "http://timestamp.digicert.com"}' Apply the signature with timestamp and full metadatapdf.Sign(signature)pdf.SaveAs("compliance-document-certified.pdf")
Imports IronPdf
Imports IronPdf.Signing
Imports System
' Load the compliance document
Dim pdf As PdfDocument = PdfDocument.FromFile("compliance-document.pdf")
Dim signature As New PdfSignature("certificate.pfx", "password") With {
' Add comprehensive metadata for audit trail requirements
.SigningReason = "21 CFR Part 11 Compliance Certification",
.SigningLocation = "Quality Assurance Department",
.SigningContact = "compliance@company.com",
.SignatureDate = DateTime.UtcNow,
' Configure a trusted timestamp for regulatory compliance
' The timestamp proves when the signature was applied
.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
.TimeStampUrl = "http://timestamp.digicert.com"
}
' Apply the signature with timestamp and full metadata
pdf.Sign(signature)
pdf.SaveAs("compliance-document-certified.pdf")
Wejscie
compliance-document.PDF - Dokument zgodności oczekujący na certyfikację
Wynik
Jakie wymagania certyfikacyjne mają zastosowanie w branżach regulowanych?
Różne konteksty regulacyjne mogą określać kryteria dotyczące certyfikatów używanych do podpisywania. Te kryteria mogą obejmować wydanie przez akredytowane organy, minimalne długości kluczy (zwykle 2048-bitowy RSA lub ekwiwalent), szczególne rozszerzone atrybuty użycia klucza, czy chronione klucze na sprzęcie z użyciem HSM lub rozwiązań kart inteligentnych.
IronPDF współpracuje z każdym certyfikatem X.509, który spełnia standardowe specyfikacje formatowe, co pozwala na korzystanie z certyfikatów wydanych przez preferowany urząd certyfikacji. Dla środowisk wymagających kluczy chronionych sprzętowo, IronPDF wspiera integrację opartego na PKCS#11 HSM poprzez swoje funkcjonalności HsmSigner.
Osoby z branż podlegających regulacjom powinny współpracować ze swoimi działami prawnymi i ds. zgodności, aby ustalić, co jest potrzebne, a następnie skonfigurować odpowiednią infrastrukturę do podpisywania.
W jaki sposób kontrola uprawnień podpisów wspiera zarządzanie cyklem życia dokumentów?
Po podpisaniu dokumenty muszą czasem pozostać edytowalne w określonych celach, np. aby umożliwić dodanie podpisów przez kolejnych sygnatariuszy lub wypełnienie pól formularza. Enumeracja SignaturePermissions w IronPDF kontroluje, jakie zmiany są dozwolone po podpisaniu:
using IronPdf;using IronPdf.Signing;// Load a form document that needs signingPdfDocument pdf = PdfDocument.FromFile("approval-form.pdf");// Sign with specific permissions for document lifecycle management// AdditionalSignaturesAndFormFillingAllowed permits form completion and additional signatures after signingpdf.SignWithFile( "approver-cert.pfx", "password", null,SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed);// Save the signed document with form-filling permissions enabledpdf.SaveAs("approval-form-signed.pdf");
using IronPdf;
using IronPdf.Signing;
// Load a form document that needs signing
PdfDocument pdf = PdfDocument.FromFile("approval-form.pdf");
// Sign with specific permissions for document lifecycle management
// AdditionalSignaturesAndFormFillingAllowed permits form completion and additional signatures after signing
pdf.SignWithFile(
"approver-cert.pfx",
"password",
null,
SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed
);
// Save the signed document with form-filling permissions enabled
pdf.SaveAs("approval-form-signed.pdf");
ImportsIronPdfImportsIronPdf.Signing' Load a form document that needs signingDim pdf AsPdfDocument = PdfDocument.FromFile("approval-form.pdf")' Sign with specific permissions for document lifecycle management' AdditionalSignaturesAndFormFillingAllowed permits form completion and additional signatures after signingpdf.SignWithFile( "approver-cert.pfx", "password", Nothing,SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed)' Save the signed document with form-filling permissions enabledpdf.SaveAs("approval-form-signed.pdf")
Imports IronPdf
Imports IronPdf.Signing
' Load a form document that needs signing
Dim pdf As PdfDocument = PdfDocument.FromFile("approval-form.pdf")
' Sign with specific permissions for document lifecycle management
' AdditionalSignaturesAndFormFillingAllowed permits form completion and additional signatures after signing
pdf.SignWithFile(
"approver-cert.pfx",
"password",
Nothing,
SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed
)
' Save the signed document with form-filling permissions enabled
pdf.SaveAs("approval-form-signed.pdf")
Dostępne poziomy uprawnień to:
Poziom uprawnień
Dopuszczalne zmiany po podpisaniu umowy
NoChangesAllowed
Dokument jest całkowicie zablokowany
FormFillingAllowed
Można wypełniać tylko pola formularza; nie wolno wprowadzać zmian w treści
Dodatkowe podpisy i wypełnianie formularzy dozwolone
Dopuszczalne jest wypełnianie formularzy i dodatkowe podpisy
FormFillingAndAnnotationsAllowed
Dopuszczalne jest wypełnianie formularzy Plus oraz dodawanie adnotacji
Odpowiedni poziom uprawnień zależy od roli dokumentu. Zakończone porozumienie może używać NoChangesAllowed, podczas gdy formularz akceptacji jeszcze w toku może używać AdditionalSignaturesAndFormFillingAllowed, aby umożliwić wypełnianie formularza i dodawanie dodatkowych podpisów przez innych zatwierdzaczy.
Kiedy tworzenie niestandardowego podpisu ma większy sens niż korzystanie z usług zewnętrznych?
Każdy, kto wdraża podpisywanie dokumentów, staje przed fundamentalną decyzją architektoniczną: wbudować funkcje podpisywania we własne aplikacje lub skorzystać z hostowanych usług podpisywania. Oba podejścia mają swoje zalety, a właściwy wybór zależy od wielkości projektu, wymagań dotyczących dostosowania, kwestii zgodności oraz całkowitego kosztu posiadania.
Jakie czynniki przemawiają za budowaniem wewnętrznych możliwości podpisywania?
Oto kilka scenariuszy, w których wbudowanie funkcji podpisywania bezpośrednio w aplikacjach ma sens:
Duża liczba dokumentów sprawia, że ceny za transakcję są wysokie w przypadku dużej skali. Firmy przetwarzające tysiące dokumentów miesięcznie często stwierdzają, że biblioteki z licencjami wieczystymi, takie jak IronPDF, są bardziej opłacalne niż opłaty za API naliczane za każdy podpis. Jednorazowa inwestycja licencyjna szybko się zwraca w porównaniu do ciągłych kosztów transakcyjnych.
Specyficzne wymagania procesowe pojawiają się, gdy zewnętrzne usługi podpisywania mają swoje własne paradygmaty. Zespoły, które mają nietypowe procesy zatwierdzania, specjalistyczną obsługę dokumentów lub wymagania integracyjne, które nie pasują do standardowych ofert, często uważają, że łatwiej jest stworzyć własne rozwiązanie niż próbować dostosować się do ograniczeń usługi.
Polityka suwerenności danych i bezpieczeństwa uniemożliwia niektórym firmom wysyłanie dokumentów do usług zewnętrznych ze względu na przepisy, politykę bezpieczeństwa lub zobowiązania umowne. Utrzymanie procesu podpisywania wewnętrznie zapewnia, że dokumenty pozostają wewnątrz granic korporacyjnych przez cały czas.
Środowiska offline lub odizolowane nie mogą polegać na rozwiązaniach hostowanych, które wymagają łączności sieciowej. Aplikacje, które muszą działać w trybie offline (aplikacje do obsługi terenowej, systemy o ograniczonym dostępie lub miejsca z niestabilnym połączeniem internetowym), wymagają lokalnie wdrożonych funkcji podpisywania.
Przewidywalność kosztów ma znaczenie, ponieważ subskrypcja oparta na cenach generuje trwające wydatki, które się kumulują. Licencje biblioteczne wieczyste zapewniają stabilne koszty, które działy finansowe mogą uwzględnić w planach bez obaw o wahania wolumenu lub podwyżki cen.
W jakich sytuacjach warto wybrać rozwiązania Hosted Signing Solutions?
Rozwiązania hostowane sprawdzają się w różnych okolicznościach:
Niewielka liczba dokumentów z różnymi stronami podpisującymi ma miejsce, gdy dokumenty wymagają podpisów od osób spoza firmy, które nie posiadają własnych certyfikatów. Usługi zajmujące się weryfikacją tożsamości i wydawaniem certyfikatów zmniejszają utrudnienia. Budowanie takiej infrastruktury wewnętrznie rzadko się opłaca w przypadku sporadycznego użytkowania.
Szybkie wdrożenie ma znaczenie, gdy trzeba szybko rozpocząć pracę bez zasobów programistycznych do tworzenia od podstaw. Te platformy mają gotowe interfejsy użytkownika i powiadomienia e-mail, które zapewniają funkcjonalność gotową do użycia.
Delegowanie obowiązków w zakresie zgodności z przepisami staje się cenne, gdy dostawcy specjalizują się w konkretnych ramach regulacyjnych i mogą zapewnić certyfikaty lub poświadczenia, których uzyskanie we własnym zakresie byłoby kosztowne.
Decyzja często sprowadza się do tego, czy podpisywanie jest kluczową kompetencją, w którą warto zainwestować, czy też funkcją standardową, którą lepiej pozostawić specjalistom. Firmy, dla których obsługa dokumentów stanowi centralny element działalności (kancelarie prawne, instytucje finansowe, placówki służby zdrowia, agencje rządowe), zazwyczaj osiągają lepsze wyniki dzięki posiadaniu własnej infrastruktury do podpisywania dokumentów. Ci, dla których podpisywanie dokumentów ma drugorzędne znaczenie, mogą preferować prostotę opcji outsourcingowych.
W jaki sposób zespoły programistów mogą ocenić swoje potrzeby w zakresie infrastruktury podpisów?
Przed podjęciem decyzji o wyborze jednego z podejść należy wziąć pod uwagę następujące czynniki:
Obecny i prognozowany wolumen decyduje o analizie kosztów. Ile dokumentów wymaga obecnie podpisów i jak ta liczba będzie się zmieniać w przyszłości?
Kwestie związane z integracją mają wpływ na architekturę. Jak podpisywanie dokumentów wpasuje się w istniejące aplikacje i procesy robocze? Biblioteki oferują maksymalną elastyczność, podczas gdy platformy zewnętrzne mogą wymagać dostosowania do ich interfejsów API i interfejsów użytkownika.
Rodzaje stron podpisujących wpływają na stopień złożoności. Czy dokumenty będą podpisywane wyłącznie przez użytkowników wewnętrznych posiadających certyfikaty zarządzane, czy też konieczne będzie uwzględnienie również podpisujących z zewnątrz?
Wymogi zgodności z przepisami określają wymagania techniczne. Jakie przepisy mają zastosowanie i jak wpływają one na wybory dotyczące wdrożenia? Niektóre wymagania łatwiej jest spełnić, korzystając z usług; inne wymagają kontroli wewnętrznej.
O wykonalności decydują zasoby techniczne. Czy zespół dysponuje zasobami niezbędnymi do wdrożenia i utrzymania funkcji podpisywania, czy też odwróciłoby to uwagę od głównych priorytetów rozwoju?
Kolejne kroki
Wbudowanie podpisów cyfrowych w aplikacje .NET oznacza zrozumienie zarówno podstaw kryptografii, jak i praktycznych potrzeb, które napędzają przetwarzanie dokumentów biznesowych. IronPDF zapewnia podstawy techniczne do podpisywania opartego na certyfikatach, wizualnego renderowania podpisów, obsługi wielostronnych procesów oraz weryfikacji podpisów, pozostawiając decyzje architektoniczne dotyczące tego, kiedy i jak korzystać z tych funkcji, programistom znającym swoje konkretne wymagania.
Funkcje omówione w tym przewodniku stanowią podstawę solidnych implementacji podpisów, niezależnie od tego, czy automatyzujesz realizację umów, wdrażasz łańcuchy zatwierdzeń, czy spełniasz wymogi zgodności. W przypadku środowisk Enterprise, które wymagają przechowywania kluczy w sprzęcie, przewodnik po podpisywaniu HSM rozszerza te wzorce na urządzenia PKCS#11. Gdy podpisy są częścią szerszej strategii bezpieczeństwa dokumentów, połącz je z ochroną hasłem, uprawnieniami i szyfrowaniem plikówPDF, aby zapewnić wielowarstwową ochronę.
Czy jesteś gotowy do rozpoczęcia budowy? Pobierz IronPDF i wyprobuj go z darmowa wersja probna. Przed podjęciem decyzji o zakupie można przetestować podpisywanie oparte na certyfikatach, weryfikację podpisów oraz procesy wieloosobowe na rzeczywistych dokumentach. Jeśli masz pytania dotyczące architektury podpisywania lub integracji zgodności, skontaktuj się z naszym zespołem wsparcia technicznego.
Często Zadawane Pytania
Czym jest podpis cyfrowy w kontekście plików PDF?
Podpis cyfrowy to mechanizm kryptograficzny używany do weryfikacji autentyczności i integralności dokumentu PDF. Zapewnia, że dokument nie został zmieniony i potwierdza tożsamość podpisującego.
Jak mogę zaimplementować podpisy cyfrowe w C# przy użyciu IronPDF?
IronPDF zapewnia prosty API do implementacji podpisów cyfrowych w PDF-ów używając C#. Można podpisywać dokumenty programowo korzystając z podpisu certyfikatem, dodawania wizualnych podpisów oraz zarządzania workflows wielostronnymi.
Jakie rodzaje podpisów cyfrowych obsługuje IronPDF?
IronPDF obsługuje różne typy podpisów cyfrowych, w tym podpisy oparte na certyfikacie, wizualne podpisy oraz te wymagające serwerów znaczników czasu do dodatkowej weryfikacji.
Czy mogę zweryfikować podpis cyfrowy w PDF za pomocą IronPDF?
Tak, IronPDF zawiera funkcje do weryfikacji podpisów cyfrowych w dokumentach PDF, zapewniając, że dokument jest autentyczny i nie został zmieniony od momentu jego podpisania.
Jaka jest rola serwera znaczników czasu w podpisach cyfrowych?
Serwer znaczników czasu zapewnia zaufane źródło czasu do potwierdzania, kiedy podpis cyfrowy został zaaplikowany do dokumentu. Dodaje to dodatkową warstwę bezpieczeństwa poprzez weryfikację dokładnego czasu podpisywania.
Czym różnią się podpisy wizualne od certyfikatów cyfrowych?
Podpisy wizualne wyświetlają graficzną reprezentację podpisu na dokumencie, podczas gdy certyfikaty cyfrowe dostarczają kryptograficznego potwierdzenia autentyczności i integralności bez konieczności wyświetlania wizualnego znaku.
Czy IronPDF obsługuje workflows podpisu wielostronnego?
Tak, IronPDF jest zdolny do zarządzania workflows podpisu wielostronnego, pozwalając na podpisanie dokumentu przez wiele stron w sposób skoordynowany i bezpieczny.
Jakie są korzyści z używania podpisów cyfrowych w dokumentach PDF?
Podpisy cyfrowe zwiększają bezpieczeństwo poprzez zapewnienie integralności i autentyczności dokumentu. Ułatwiają one również workflows poprzez umożliwienie podpisu elektronicznego, co jest szybsze i bardziej efektywne niż tradycyjne metody.
Czy możliwe jest podpisanie PDF-ów programowo bez interakcji użytkownika?
Tak, przy użyciu IronPDF można podpisywać PDF-y programowo w C# bez konieczności interakcji użytkownika, co czyni go idealnym dla zautomatyzowanych workflows i przetwarzania partii.
How do I start using IronPDF for digital signatures in a .NET application?
To start using IronPDF for digital signatures, download the comprehensive sample project from IronPDF’s website. This project includes everything you need to implement and test digital signature features in your .NET application.
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.