This example shows how to load a form and edit it in the designer.

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, interface event and id:
<stimulsoft-forms
      #fromComponent
      [requestUrl]="'http://localhost:7536/Forms/Action'"
      [properties]="properties"
      [form]="form"
      (interfaceEvent)="interfaceEvent($event)"
      id="sti-form"
>
</stimulsoft-forms>

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

	public properties = {};
	public form!: any;

	private formName = "Order.mrt";

	constructor(public formService: StimulsoftFormsService) {
		this.properties = { formName: this.formName, localization: "en" };
	}
	
...

Now, create interface event. In this interface create FormNew, FormSave, FormSaveAs and Loaded events:
...
	interfaceEvent(event: StiInterfaceEvent) {
		switch (event.name) {
			case "FormNew":
				this.form = this.formService.createElement("Form");
				break;

			case "FormSave":
			case "FormSaveAs":
				this.formService.postData({ action: "FormSave", formName: event.data.name ?? this.formName, form: this.form.saveToReportJsonObject().serialize() }, (data: any) => {
					console.log(data);
				});
				break;

			case "Loaded":
				let form: StiForm = this.formService.createElement("Form");
				if (event.data.form) {
					form.loadFormJsonString(atob(event.data.form));
				}
			this.form = form;
			break;
	}
}

Next, in the FormController 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("{}");

			case "FormSave":
				var formName = data["formName"].ToString();
				SaveFileString("Forms", formName, data["form"].ToString());
				return Json("{result: \"ok\"}");

			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)
	{
		// Load localization file
		if (properties["localization"] != null)
		{
			var localizationName = properties["localization"];
			options["localization"] = GetFileString("Localization", $"{localizationName}.xml");
		}

		// Load form file
		if (properties["formName"] != null)
		{
			var formName = properties["formName"].ToString();
			var formContent = GetFileString("Forms", formName);
			options["form"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(formContent));
		}
	}

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

	return options;
}

Finally, create GetFilePath, GetFileString and SaveFileString methods:
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();
	}
}

private void SaveFileString(string folder, string fileName, string content)
{
	var filePath = GetFilePath(folder, fileName);
	using (var writer = new StreamWriter(filePath))
	{
		writer.Write(content);
	}
}

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