This example shows how to view forms and parse results.

First, import scripts:
import { Component, ElementRef, ViewChild } from '@angular/core';
import { StimulsoftFormsComponent, StimulsoftFormsService } from 'stimulsoft-forms';
import { StiForm } from 'stimulsoft-forms/lib/elements/StiForm';
import { StiInterfaceEvent } from 'stimulsoft-forms/lib/services/objects';

Next, define URL template, properties, form and interface event:
<stimulsoft-forms *ngIf="mode=='online-form'"
      #fromComponent
      [requestUrl]="'http://localhost:9429/Forms/Action'"
      [properties]="properties"
      [viewerMode]="true"
      [form]="form"
      (interfaceEvent)="interfaceEvent($event)"
>
</stimulsoft-forms>

After that, create AppComponent class. Specify form name and create constructor with properties.
export class AppComponent {

	public properties = {};
	public form!: any;
	public mode = "online-form"

	private formName = "Order.mrt";

	constructor(public formService: StimulsoftFormsService) {
		this.properties = { formName: this.formName };
	}
	
...

Now, create interface event. In this interface create Loaded, FormSubmitted, and FormSubmittedError events:
...

	interfaceEvent(event: StiInterfaceEvent) {
		switch (event.name) {
			case "Loaded":
				let form: StiForm = this.formService.createElement("Form");
				form.loadFormJsonString(atob(event.data.form));
				this.form = form;
				break;
			case "FormSubmitted":
				alert(event.data.message);
				break;
			case "FormSubmittedError":
				alert(event.data);
				break;
	}
}

Next, in the FormsController create Action method with action cases:
public IActionResult Action()
{
	try
	{
		var data = JObject.Parse(this.HttpContext.Request.Form["data"]);
		var action = data["action"].ToString();
		switch (action)
		{
			case "Initialize":
				var initData = StiWebForm.Initialize(data, Initialize(data));
				return Json(initData.Content);

			case "GetFonts":
				if (data["fonts"] != null &&  (data["fonts"] as JArray).Count> 0 && (data["fonts"] as JArray)[0]["fontFamily"].ToString() == "Mrs. Monster")
				{
					List<Hashtable> fontResources = new List<Hashtable>();
                            
					/*Hashtable fontResourceItem = new Hashtable();
					var content = System.IO.File.ReadAllBytes("Fonts/mrsmonster.ttf");
					fontResourceItem["contentForCss"] = String.Format("data:{0};base64,{1}", "application/x-font-ttf", Convert.ToBase64String(content));
					fontResourceItem["originalFontFamily"] = "Mrs. Monster";
					fontResources.Add(fontResourceItem);*/

					return Json(fontResources);
				}
				return Json("{}");

			default:
				var result = StiWebForm.ProcessRequest(data);
				return result.ContentType switch
				{
					"application/pdf" => new FileContentResult(result.Content as byte[], result.ContentType),

					_ => Json(result.Content),
				};
			}
		}catch (Exception e)
		{
			return new ContentResult()
			{
				Content = e.Message,
				ContentType = "text/plain"
			};    
		}
	}
}

After that, create Initialize method. In this method, specify options and properties. Next, load localization and form files, if needed. In the end, apply font families.
private Hashtable Initialize(JObject data)
{
	var options = new Hashtable();
	var properties = data["properties"] as JObject;

	if (properties != null)
	{
		if (properties["localization"] != null)
		options["localization"] = GetFileString("Localization", $"{properties["localization"]}.xml");

		if (properties["formName"] != null)
		{
			var form = GetForm(properties["formName"].ToString());
                    
			options["form"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(form.SaveToString()));
		}                    
	}

	options["fontFamilies"] = StiWebFormHelper.GetSystemFontFamilies();

	return options;
}

Finally, create Pdf, Results, ResultPdf, Submit, GetForm and GetFilePath methods:
public IActionResult Pdf(string name, string submit)
{
	StiForm form = GetForm(name);
	var settings = new StiPdfExporterSettings
	{
		UsePdfA = false,
		ReadOnly = false
	};

	if (submit == "pdf")
	{
		var button = form.GetAllItems().FirstOrDefault(i => (i as StiFormElement)?.Name == "Button") as StiButtonElement;
		button.ButtonSendType = StiButtonSendType.PDF;
		var numberBox = form.GetAllItems().FirstOrDefault(i => (i as StiFormElement)?.Name == "OrderNumber") as StiNumberBoxElement;
		button.FormSendURL += $"?type=pdf&guid={form.Guid}&order={numberBox.Value}";

		Response.Headers.Add("Content-Type", new string[] { "application/octet-stream", "application/octet-stream", "application/download" });
		Response.Headers.Add("Content-Disposition", "attachment; filename=\"Order.pdf\"");
	}

	var content = new StiPdfExporter(settings).ExportForm(form);

	return new FileContentResult(content, "application/pdf");
}

public IActionResult Results(string name)
{
	ViewData["Submits"] = Submits;
	return View("Results");
}

public IActionResult ResultPdf(int id) 
{
	var content = Submits[id]["pdf"] as byte[];
	return new FileContentResult(content, "application/pdf");
}

public IActionResult Submit(string type, string guid, string order)
{
	HttpRequest request = this.HttpContext.Request;
	var isFromAcrobat = request.Headers.Keys.Any(k => k.IndexOf("Acrobat") >= 0);
	request.EnableBuffering();

	byte[] buffer;
	using (BinaryReader reader = new BinaryReader(request.Body))
	{
		buffer = reader.ReadBytes(Convert.ToInt32(request.ContentLength));
	}

	if (type == "pdf")
	{
		var submit = new Hashtable
		{
			["guid"] = guid,
			["orderNumber"] = order,
			["pdf"] = buffer,
			["id"] = Submits.Count.ToString()
		};

		Submits.Add(submit);
	}
	else
	{
		StiPdfFormResult result = new StiPdfFormResult();
		result.ParseXFDF(buffer);
		var formGuid = result.GetValue("StiFormGuid");
		order = result.GetValue("OrderNumber");
		var tableName = "OrderItems";
		var total = result.GetTableTotalFieldValue(tableName, 2);

		var items = new List<string>();
		for (int i = 0; i < result.GetTableRowsCount(tableName); i++)
		{
			var item = result.GetTableFieldValue(tableName, 0, i);
			if (!string.IsNullOrEmpty(item))
			items.Add(item);
		}

		var submit = new Hashtable
		{
			["guid"] = formGuid,
			["orderNumber"] = order,
			["total"] = total,
			["items"] = String.Join(", ", items)
		};

		Submits.Add(submit);
	}

	if (isFromAcrobat)
	{
			StiForm form = GetForm("ThankYou.mrt");
			var orderLabel = form.GetAllItems().FirstOrDefault(i => (i as StiFormElement)?.Name == "Order") as StiTextBoxElement;
			orderLabel.Text = order;

			var settings = new StiPdfExporterSettings
			{
				UsePdfA = false,
				ReadOnly = false
			};
			var content = new StiPdfExporter(settings).ExportForm(form);

			return new FileContentResult(content, "application/pdf");
	}
	else
	{
		return Json(new Hashtable
		{
			["message"] = "Thank you!"
		});
	}
}

private StiForm GetForm(string name)
{
	var formStr = GetFileString("Forms", name);
	var form = new StiForm();
	form.LoadFromJson(formStr);

	var numberBox = form.GetAllItems().FirstOrDefault(i => (i as StiFormElement)?.Name == "OrderNumber") as StiNumberBoxElement;

	if (numberBox != null)
	{
		var rand = new Random();
		numberBox.Value = rand.Next(1000000);//set 'unique' number
	}
	return form;
}

private string GetFilePath(string folder, string fileName)
{
		var assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
		return Path.Combine(assemblyDirectory, folder, fileName);
}

private string GetFileString(string folder, string fileName)
{
		var filePath = GetFilePath(folder, fileName);
		using (var reader = new StreamReader(filePath))
		{
			return reader.ReadToEnd();
		}
}

Используя этот сайт, вы соглашаетесь на использование файлов Cookie для аналитики и персонализированного контента. Файлы Cookie хранят полезную информацию на вашем компьютере, чтобы помочь нам повысить эффективность и удобство использования. Для получения дополнительной информации, пожалуйста, прочтите Конфиденциальность и Использование Cookie.