Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions libraries/radpdfprocessing/features/bookmarks.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ To insert a bookmark in a document, add it to the `Bookmarks` collection. The fo

<snippet id='pdf-add-bookmark-to-document'/>

>tip To open the PDF with the bookmarks pane selected in a viewer application, set the document-level `PageMode` property to `PageMode.UseBookmarks`.

To remove a bookmark, use the same collection. In the following example, the second bookmark inside the document is removed:

<snippet id='pdf-remove-bookmark-from-document'/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,20 @@ Before you sign a document, make sure you have the required inputs and document
3. Choose whether the signature will be visible or invisible in the document.
4. Prepare a stream that supports both reading and writing for the export operation.

### Load a PKCS#12 Certificate from a File

In .NET 10, use the [`X509CertificateLoader.LoadPkcs12FromFile`](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509certificateloader.loadpkcs12fromfile?view=net-10.0) method to load a PKCS#12 (`.pfx` or `.p12`) certificate from disk. The method returns an `X509Certificate2` object that you can pass to the `Signature` constructor:

```csharp
using System.Security.Cryptography.X509Certificates;
using Telerik.Documents.Fixed.Model.DigitalSignatures;

X509Certificate2 certificate = X509CertificateLoader.LoadPkcs12FromFile("certificate.pfx", "password");
Signature signature = new Signature(certificate);
```

The certificate must contain the private key required for signing. For target frameworks other than .NET 10, use a certificate-loading approach supported by the target framework to create the required `X509Certificate2` instance.

## Signing a Document

Use this workflow to sign a PDF document:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
---
title: Overview
description: The digital signature feature in RadPdfProcessing enables you to sign and validate PDF documents using X509 certificates and signature fields.
description: The digital signature feature in RadPdfProcessing enables you to sign and validate PDF documents using X509 certificates, PKI certificate chains, and signature fields.
page_title: Digital Signature - Overview
slug: radpdfprocessing-features-digital-signature
tags: digital, signature, pdf, signing, validation, radpdfprocessing, x509, certificates, overview
tags: digital, signature, pdf, signing, validation, radpdfprocessing, x509, certificates, pki, public-key-infrastructure, overview
position: 0
---

# Overview

The **digital signature** feature enables you to sign and validate a PDF document. A signature confirms that the document content originated from the signer and has not been modified. A signed document is considered valid when it has not been changed after signing, and all of its certificates have a valid trusted root certificate.

In a **Public Key Infrastructure (PKI)** workflow, RadPdfProcessing uses X.509 certificates, certificate chains, trusted roots, and revocation checks for PDF signing and validation. Certificate issuance and certificate-authority management are outside the library's scope.

<a name="signing-a-document"><a/>

Telerik **RadPdfProcessing** provides an API that allows you to:
Expand Down
6 changes: 6 additions & 0 deletions libraries/radpdfprocessing/model/radfixeddocument.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ You can merge PDF documents with the `Merge()` method of `RadFixedDocument`. Thi

The code from **Example 5** merges the document created in [**Example 1**](#example1) with another `RadFixedDocument`.

### Fixed Content and Paragraphs

`RadFixedDocument` does not expose a paragraph collection. A fixed document contains [RadFixedPage]({%slug radpdfprocessing-model-radfixedpage%}) instances, and each page exposes a `Content` collection of positioned content elements such as [TextFragment]({%slug radpdfprocessing-model-textfragment%}) objects. To inspect text in a fixed document, enumerate the pages and their content elements.

`TextFragment` represents a fixed-layout text run. It does not retain flow paragraph boundaries, heading styles, or `StyleId` values. If you need paragraph or heading metadata, retain it while creating the document with [RadFixedDocumentEditor]({%slug radpdfprocessing-editing-radfixeddocumenteditor%}), before the flow content is rendered into fixed page content. For text that already exists in a PDF, use the [search API]({%slug radpdfprocessing-features-search%}) or public text-position APIs to locate known text rather than looking for `Paragraph` objects.

## Document Information

`RadFixedDocument` exposes a `DocumentInfo` property of type [RadFixedDocumentInfo]({%slug radpdfprocessing-model-radfixeddocumentinfo%}), intended to hold additional information about the document.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ position: 6

## How the Calculation Chain Works

RadSpreadProcessing does not recalculate all formulas in all open workbooks, regardless of whether they need recalculation. Instead, the library tracks formula dependencies internally and automatically recalculates affected formulas when their referenced values or formulas change. You do not need to rebuild the calculation chain manually.

When a cell value changes, **RadSpreadProcessing** needs to recalculate every formula that directly or indirectly references that cell. The calculation chain maintains a directed dependency graph of all formula cells in the workbook. The library uses this graph to determine the minimal set of formulas that require recalculation and the correct order in which to evaluate them.

The calculation chain covers the following scenarios:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,35 @@ public override bool IsSpillingArgument(int argumentIndex, RadExpression argumen
}
```

### Access the first range in a custom function

To access the first range, use the public `CellReferenceRanges` collection and convert the first `CellReferenceRange` to a `CellRange`:

```csharp
CellReferenceRangeExpression referenceExpression = context.Arguments[0] as CellReferenceRangeExpression;
if (referenceExpression == null || referenceExpression.CellReferenceRanges.Count == 0)
{
return ErrorExpressions.ValueError;
}

CellReferenceRange firstRange = referenceExpression.CellReferenceRanges[0];
CellRange cellRange = firstRange.ToCellRange();
```

If you need the evaluated values instead of the range coordinates, evaluate the expression and inspect the first nested `ArrayExpression`:

```csharp
ArrayExpression rangesValue = referenceExpression.GetValue() as ArrayExpression;
if (rangesValue == null || rangesValue.RowCount == 0 || rangesValue.ColumnCount == 0)
{
return ErrorExpressions.ValueError;
}

ArrayExpression firstRangeArray = rangesValue[0, 0] as ArrayExpression;
```

`ArrayExpression` exposes `RowCount`, `ColumnCount`, and an indexer for reading the evaluated expressions.

For the full description of spill behavior and the dynamic array model, see [Dynamic Array Formulas]({%slug radspreadprocessing-features-formulas-dynamic-array-formulas%}).

## See Also
Expand Down