Забыли пароль?

Как использовать FastReport Core в Linux

Dmitriy Fedyashov

В предыдущей статье мы рассмотрели простейший пример использования нового продукта от FastReport – FastReport Core. Это был пример для Windows. Теперь же, мы рассмотрим пример для Linux.

Прежде всего для Linux нам потребуются дополнительные библиотеки, которые могут быть не установлены по умолчанию:

  • Libgdiplus;
  • libx11-dev.

На серверных ОС Linux обычно не установлен xserver, который необходим для обработки графики FastReport Core. Поэтому придется его установить. Это может быть, например: Xvfb, VcXsrv или любой другой.

Далее мы еще вернемся к вопросу XServer, а пока создаем приложение ASP.Net Core:

Выбираем Web Application:

Подключаем FastReport Core к проекту посредством NuGet.

Добавляем локальный репозиторий в качестве источника пакетов в настройках NuGet:

Задаем ссылку на локальный репозиторий или папку с пакетом FastReport.2017.4.0-release.nupkg:

Выбираем в выпадающем списке локальный источник пакетов и устанавливаем FastReport.

Открываем на редактирование файл HomeController.cs из папки Controllers. Добавляем несколько дополнительных библиотек в секцию uses:

1
2
3
4
using FastReport;
using FastReport.Export.Html;
using System.IO;
using System.Text;

Редактируем метод Index:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public IActionResult Index()
 {
 Report report = new Report();
 
 string report_path = ”Reports”;
 System.Data.DataSet dataSet = new System.Data.DataSet();
 dataSet.ReadXml(report_path + "nwind.xml");
 report.Report.RegisterData(dataSet, "NorthWind");
 report.Report.Load(Path.Combine(report_path, "Simple List.frx"));
 report.Prepare();
 HTMLExport export = new HTMLExport();
 export.Layers = true;
 using (MemoryStream ms = new MemoryStream())
 {
 export.EmbedPictures = true;
 export.Export(report, ms);
 ms.Flush();
 ViewData["Report"] = Encoding.UTF8.GetString(ms.ToArray());
 ViewData["ReportName"] = "Simple List.frx";
 }
 return View();

Так как объект WebReport пока еще не доступен нам в FastReport Core, то используем обычный объект Report. Создаем источник данных и регистрируем его в объекте Report. Загружаем шаблон отчета. Подготавливаем отчет с помощью метода Prepare(). Далее создаем экспорт готового отчета в HTML. Выполняем экспорт в потоке MemoryStream (или в файл). Затем передаем отчет в представление с помощью ViewData или ViewBag.

Теперь переходим к редактированию представления Views -> Index.chtml.

Тут все крайне просто – выводим отчет в формате HTML:

1
2
3
4
5
6
7
@{
 ViewData["Title"] = "Home Page";
}
@if (ViewData.ContainsKey("Report"))
{
 @Html.Raw(ViewData["Report"])
}

Как я говорил уже ранее, для работы FRCore нужен xserver, которого нет в серверных Linux.[ВЕ1] 

Настройка Linux на примере debian server:

 

1. Открыть консоль;
2. Обновить apt-get и установить пакеты:

  • sudo apt-get update;
  • sudo apt-get install -y xvfb x11vnc x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps libgdiplus libx11-dev.

3. Изменить переменную окружающей среды DISPLAY=:99.

 В классе Program добавляем два метода. Метод LinuxStart проверяет запущен ли xserver, если да, то закрывает его и создает новый.

Метод StopLinux просто останавливает виртуальный сервер.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Program
 {
 static Process xvfb;
 const string xvfb_pid = "pid.xvfb.fr";
 public static void Main(string[] args)
 {
 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
 LinuxStart();
 BuildWebHost(args).Run();
 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
 LinuxStop();
 }
 
 private static void LinuxStop()
 {
 xvfb.Kill();
 if (File.Exists(xvfb_pid))
 File.Delete(xvfb_pid);
 }
 
 public static void LinuxStart()
 {
 if (File.Exists(xvfb_pid))
 {
 string pid = File.ReadAllText(xvfb_pid);
 try
 {
 xvfb = Process.GetProcessById(int.Parse(pid));
 xvfb.Kill();
 xvfb = null;
 }
 catch { }
 File.Delete(xvfb_pid);
 }
 string display = Environment.GetEnvironmentVariable("DISPLAY");
 if (String.IsNullOrEmpty(display))
 {
 Environment.SetEnvironmentVariable("DISPLAY", ":99");
 display = ":99";
 }
 ProcessStartInfo info = new ProcessStartInfo();
 info.FileName = "/usr/bin/Xvfb";
 info.Arguments = display + " -ac -screen 0 1024x768x16 +extension RANDR -dpi 96";
 info.CreateNoWindow = true;
 xvfb = new Process();
 xvfb.StartInfo = info;
 xvfb.Start();
 File.WriteAllText(xvfb_pid, xvfb.Id.ToString());
 }
 
 public static IWebHost BuildWebHost(string[] args) =>
 WebHost.CreateDefaultBuilder(args)
 .UseStartup<Startup>()
 .UseUrls("http://[::]:5000")
 .Build();
 } 

 Приложение готово. Запускаем:

Как и в случае с Windows приложением, приложение для Linux получилось таким же простым. Однако требуются некоторые предварительные настройки самой операционной системы для работы с .Net Core.

Похожие статьи:

назад