diff --git a/libraries/radpdfprocessing/features/bookmarks.md b/libraries/radpdfprocessing/features/bookmarks.md
index 08223886..9e82c090 100644
--- a/libraries/radpdfprocessing/features/bookmarks.md
+++ b/libraries/radpdfprocessing/features/bookmarks.md
@@ -47,6 +47,8 @@ To insert a bookmark in a document, add it to the `Bookmarks` collection. The fo
+>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:
diff --git a/libraries/radpdfprocessing/features/digital-signature/getting-started.md b/libraries/radpdfprocessing/features/digital-signature/getting-started.md
index 04fcf9e1..5c77d84a 100644
--- a/libraries/radpdfprocessing/features/digital-signature/getting-started.md
+++ b/libraries/radpdfprocessing/features/digital-signature/getting-started.md
@@ -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:
diff --git a/libraries/radpdfprocessing/features/digital-signature/overview.md b/libraries/radpdfprocessing/features/digital-signature/overview.md
index 73dae211..914ce5b4 100644
--- a/libraries/radpdfprocessing/features/digital-signature/overview.md
+++ b/libraries/radpdfprocessing/features/digital-signature/overview.md
@@ -1,9 +1,9 @@
---
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
---
@@ -11,6 +11,8 @@ position: 0
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.
+
Telerik **RadPdfProcessing** provides an API that allows you to:
diff --git a/libraries/radpdfprocessing/model/radfixeddocument.md b/libraries/radpdfprocessing/model/radfixeddocument.md
index d9dd5382..a627f0fd 100644
--- a/libraries/radpdfprocessing/model/radfixeddocument.md
+++ b/libraries/radpdfprocessing/model/radfixeddocument.md
@@ -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.
diff --git a/libraries/radspreadprocessing/features/formulas/calculation-chain.md b/libraries/radspreadprocessing/features/formulas/calculation-chain.md
index afe926a4..1b1696c4 100644
--- a/libraries/radspreadprocessing/features/formulas/calculation-chain.md
+++ b/libraries/radspreadprocessing/features/formulas/calculation-chain.md
@@ -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:
diff --git a/libraries/radspreadprocessing/features/formulas/custom-functions.md b/libraries/radspreadprocessing/features/formulas/custom-functions.md
index 067a693b..bdf3d004 100644
--- a/libraries/radspreadprocessing/features/formulas/custom-functions.md
+++ b/libraries/radspreadprocessing/features/formulas/custom-functions.md
@@ -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