Thanks for your Reply @asad.ali
I tried replacing text inside a PDF document, but it does not satisfy our expectation
We want to replace/mailmerge multiple repeating variables.
But Aspose PDF needs TextFragmentAbsorber
object for each variable replacement.
We have used below code to replace multiple repeating variables
Also we have used
TextFragmentAbsorber searchAbsorber = new TextFragmentAbsorber("(?<=ForEach)(.*?)(?=EndForEach)", new TextSearchOptions(true));
to Extract text between a particular start and end text, but it is not working when start and end text is in different line.
private static void ReplacePdfLoopingText()
{
Aspose.Pdf.Document doc = new Aspose.Pdf.Document("C:/Jagan/My Project/MailMergePdf/MailMergePdf/MergeTemplate.pdf");
TextFragmentAbsorber textFragmentAbsorber;
List<TemplateParameter> parmaeters = GenerateDictionaryParams();
TextFragmentAbsorber searchAbsorber = new TextFragmentAbsorber("(?<=ForEach)(.*?)(?=EndForEach)", new TextSearchOptions(true));
doc.Pages.Accept(searchAbsorber);
foreach (TextFragment textFragment in searchAbsorber.TextFragments)
{
Console.WriteLine(textFragment.Text);
string[] loopItem = textFragment.Text.Split(' ');
if (loopItem.Length > 0)
{
foreach (string item in loopItem)
{
if (!string.IsNullOrEmpty(item))
{
List<TemplateParameter> lstParameter = parmaeters.Where(x => x.Key.Equals(item)).ToList();
textFragmentAbsorber = new TextFragmentAbsorber(item);
doc.Pages.Accept(textFragmentAbsorber);
RepaceFragmentText(textFragmentAbsorber, string.Join(Environment.NewLine, lstParameter[0].Values));
}
}
}
}
// Save resultant PDF
doc.Save(Assembly.GetExecutingAssembly().Location + "ReplacedTemplate.pdf");
}
private static void RepaceFragmentText(TextFragmentAbsorber textFragmentAbsorber, string replacedText)
{
foreach (TextFragment textFragment in textFragmentAbsorber.TextFragments)
{
textFragment.Text = replacedText.Replace("ASPOSENEWLINE", Environment.NewLine);
}
}
private static List<TemplateParameter> GenerateDictionaryParams()
{
List<TemplateParameter> lstParams = new List<TemplateParameter>();
lstParams.Add(new TemplateParameter { Key = "<<[CONTACT_TYPE]>>", Values = new List<string>() { "Contact 1", "Contact 2", "Contact 3"} });
lstParams.Add(new TemplateParameter { Key = "<<[EMPLOYEEFIRSTNAME]>>", Values = new List<string>() { "Jagan 1", "Jagan 2", "Jagan 3"} });
lstParams.Add(new TemplateParameter { Key = "<<[EMAIL]>>", Values = new List<string>() { "test@aspose.com 1", "test@aspose.com 2", "test@aspose.com 3" } });
lstParams.Add(new TemplateParameter { Key = "<<[COMMENTS]>>", Values = new List<string>() { "default 1", "empty 2", "None 3"} });
lstParams.Add(new TemplateParameter { Key = "<<[PRIMARY_SECONDARY]>>", Values = new List<string>() { "Primary 1", "Secondary 2", "Primary 3"} });
lstParams.Add(new TemplateParameter { Key = "<<[ESCALATION_CONTACT]>>", Values = new List<string>() { "Briwnie 1", "Reigns 2", "Kantla 3"} });
lstParams.Add(new TemplateParameter { Key = "<<[ADDED_BY]>>", Values = new List<string>() { "IShant 1", "Cena 2", "Bently 3"} });
return lstParams;
}
class TemplateParameter
{
public string Key { get; set; }
public List<string> Values { get; set; }
}
Template to be Replaced - MergeTemplate.pdf (39.1 KB)
Expected Output Template - ExpectedMerge.pdf (38.1 KB)
Actual Output Template - ActualMerge.pdf (280.9 KB)
Can you please let us if we could get the Expected Output Template
from Template to be Replaced
using Aspose PDF ?