Merging Multiple Records with First-Page Headers and Footers
This article demonstrates how to merge multiple records with first-page headers and footers using the MailMerge class of the TX Text Control .NET Server.

When merging multiple records using the TX Text Control's Merge
Templates that contain only a first page header can be tricky in scenarios where the append parameter is set to true to append all records to a resulting document. If set to false, individual documents are created and the first page header is only visible on page 1.
The Problem
But when appended, the first page header is rendered for all sections, and if the header contains merge fields, they are populated with data from the first record. So basically, after the merge, you have all the records merged into separate sections, but the header and footer contain the merge field data from the first record.
Let's take a look at the following template:

You can see a first page header with a merge field and the main body containing a merge block. This is the JSON data that will be used to merge the content into the template.
[
{
"invoice": "INV-001",
"date": "2023-10-01",
"items": [
{
"name": "Widget A",
"description": "A longer description of Widget A.",
"quantity": 2,
"unit_price": 10.00
},
{
"name": "Widget B",
"description": "A longer description of Widget B.",
"quantity": 1,
"unit_price": 20.00
}
]
},
{
"invoice": "INV-002",
"date": "2023-10-02",
"items": [
{
"name": "Widget C",
"description": "A longer description of Widget C.",
"quantity": 5,
"unit_price": 5.00
},
{
"name": "Widget D",
"description": "A longer description of Widget D.",
"quantity": 3,
"unit_price": 15.00
}
]
}
]
The following code shows how to merge the JSON data into the template using the MergeJsonData method.
using System.IO;
using TXTextControl;
using TXTextControl.DocumentServer;
// Create and initialize a ServerTextControl instance
using var tx = new ServerTextControl();
// Create a new, empty document
tx.Create();
// Load the template in the internal Unicode format
tx.Load("template.tx", StreamType.InternalUnicodeFormat);
// Set up the MailMerge engine and assign the TextComponent
var mailMerge = new MailMerge
{
TextComponent = tx
};
// Read JSON data from a file
var jsonData = File.ReadAllText("data.json");
// Merge JSON data into the loaded template
// `append: true` means merge all records into one document, each in a new section
mailMerge.MergeJsonData(jsonData, append: true);
// Save the merged result as a PDF file
tx.Save("result.pdf", StreamType.AdobePDF);
After the merge, the resulting document looks like this:

The Solution
As you can see, the header of the second attached document contains the merge data from the first record. This is not what we want. A new section is added for each record, and a unique first page header should be added for all pages in each section. But we know that a new section is added for all records, so we can use a header and footer setting to implement this requirement.
For the first page header, we use the Connected

Now the first page header is not linked to the previous section, and the merge field is populated with the data from the current record. Below is the resulting document after the merge:

As you can see, the first page header is now populated with the data from the current record.
Conclusion
In this article, we learned how to use the Merge
By using this approach, we can ensure that the first page header is populated with the data from the current record and not the first record.
ASP.NET
Integrate document processing into your applications to create documents such as PDFs and MS Word documents, including client-side document editing, viewing, and electronic signatures.
- Angular
- Blazor
- React
- JavaScript
- ASP.NET MVC, ASP.NET Core, and WebForms
Related Posts
ASP.NETApplicationFieldsASP.NET Core
Find ApplicationFields within Sections and Paragraphs in .NET C#
This article shows how to find ApplicationFields within sections and paragraphs in a document using TX Text Control .NET. The implemented extension methods can be used to retrieve the sections and…
One More Stop on Our Conference Circus: code.talks 2026
Text Control is joining code.talks 2026 in Hamburg for the first time, a community-driven developer conference known for its strong technical focus and unique movie theater setting. We are excited…
ASP.NETASP.NET CoreDocument Processing
Build Your Own MCP-Powered Document Processing Backend with TX Text Control
This article explains how to create a document processing backend based on MCP using TX Text Control. It reveals structured tools that AI agents can identify and use. It showcases a clean…
TXTextControl.Markdown.Core 34.1.0-beta: Work with Full Documents,…
In this article, we will explore the new features and improvements in TXTextControl.Markdown.Core 34.1.0-beta, including working with full documents, selection, and SubTextParts. We will also…
ASP.NETASP.NET CoreDocument Editor
5 Layout Patterns for Integrating the TX Text Control Document Editor in…
When integrating a document editor into an ASP.NET Core application, the technical setup is only one part of the work. Just as important is the question of how the editor fits into the user…
