Делаем PDF документы на Raspberry PI с .NET Core

26.05.2020

Raspberry PI - миниатюрный одноплатный компьютер, работающий на процессоре ARM. Этот микрокомпьютер часто используется в качестве учебной платформы, в разработках встроенных решений, а также в качестве простой рабочей станции при подключении к нему монитора и клавиатуры.

Raspberry PI 3B

Для экспериментов используем плату Raspberry PI 3B c 1ГБ оперативной памяти и установленной операционной системой Linux Raspbian Buster with desktop. Я опущу процесс установки и настройки системы - будем считать, что у вас уже всё установлено и работает.

Несмотря на его крохотные размеры, мы имеем дело с полноценным компьютером со взрослыми возможностями. Попробуем установить на него фреймворк .NET Core и написать простое приложение на языке C#, которое будет формировать PDF документ.

Для начала нам нужно подключиться к плате через SSH или открыть приложение терминала на десктопе, если вы подключили плату к монитору и клавиатуре. Само собой, плата должна быть подключена к сети Internet для установки необходимых нам компонентов.
 
Операционная система Raspbian поддерживает выполнение .NET Core приложений для архитектуры ARM32. Ссылку на соответствующий файл можно найти на сайте .NET Core.

Выполняем команды для скачивания и распаковки архива в терминале:

1
2
$ sudo wget https://download.visualstudio.microsoft.com/download/pr/f2e1cb4a-0c70-49b6-871c-ebdea5ebf09d/acb1ea0c0dbaface9e19796083fe1a6b/dotnet-sdk-3.1.300-linux-arm.tar.gz
$ mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.1.300-linux-arm.tar.gz -C $HOME/dotnet

Затем добавляем путь к папке с .NET Core в переменную окружения PATH, а также создаем переменную DOTNET_ROOT:

1
2
$ export DOTNET_ROOT=$HOME/dotnet
$ export PATH=$PATH:$HOME/dotnet

Эти строки лучше всего добавить в конфигурационный файл профайла пользователя: ~/.bash_profile, ~/.bashrc, ~/.kshrc, ~/.profile, ~/.zshrc, ~/.zprofile, чтобы их не вводить после каждого логина.

Правильность установки .NET Core SDK можно проверить следующей командой:

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
$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version: 3.1.300
 Commit: b2475c1295
 
Runtime Environment:
 OS Name: raspbian
 OS Version: 10
 OS Platform: Linux
 RID: linux-arm
 Base Path: /home/pi/dotnet/sdk/3.1.300/
 
Host (useful for support):
 Version: 3.1.4
 Commit: 0c2e69caa6
 
.NET Core SDKs installed:
 3.1.300 [/home/pi/dotnet/sdk]
 
.NET Core runtimes installed:
 Microsoft.AspNetCore.App 3.1.4 [/home/pi/dotnet/shared/Microsoft.AspNetCore.App]
 Microsoft.NETCore.App 3.1.4 [/home/pi/dotnet/shared/Microsoft.NETCore.App]
 
To install additional .NET Core runtimes or SDKs:
 https://aka.ms/dotnet-download

Для дальнейшей работы нужно установить недостающие пакеты (все остальные уже установлены в составе с Linux Raspbian Buster with desktop):

1
2
3
$ sudo apt-get install libgdiplus
$ sudo wget http://ftp.de.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.6_all.deb
$ sudo apt-get install -y ttf-mscorefonts-installer_3.6_all.deb

Мы установили набор шрифтов, который поставляется в системе Windows, поэтому приложения будут выглядеть похоже и в Windows и в Linux.
Теперь можно приступать к созданию нашего приложения. Для этого выполним команду:

1
$ dotnet new console -o testpdf

В папке testpdf будет создана заготовка консольного приложения с файлами testpdf.csproj и Program.cs.

Заменим содержимое файла testpdf.csproj:

1
2
3
4
5
6
7
8
9
10
11
12
<Project Sdk="Microsoft.NET.Sdk">
 <PropertyGroup>
 <OutputType>Exe</OutputType>
 <TargetFramework>netcoreapp3.1</TargetFramework>
 </PropertyGroup>
 
 <ItemGroup>
 <PackageReference Include="FastReport.Compat" Version="2020.3.2" />
 <PackageReference Include="FastReport.Core" Version="2020.3.1-demo" />
 </ItemGroup>
 
</Project>

В файле содержатся ссылки на Nuget пакеты FastReport.Core и FastReport.Compat. Они будут скачаны в процессе сборки программы и помещены в папку ~/.nuget/packages.

Содержимое файла Program.cs заменим на следующий код:

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
using System;
using FastReport;
using FastReport.Export.Pdf;
using FastReport.Utils;
 
namespace testpdf
{
class Program
 {
 static void Main()
 {
 Console.WriteLine("Test FastReport Core"); 
 // create report object
 using Report report = new Report();
 // create page
 using ReportPage page = new ReportPage();
 // add page in report
 report.Pages.Add(page);
 // create band
 page.ReportTitle = new ReportTitleBand()
 {
 Height = Units.Centimeters * 10
 };
 // create text object placed on band
 using TextObject text = new TextObject()
 {
 Left = Units.Centimeters * 7,
 Top = Units.Centimeters * 5,
 Font = new System.Drawing.Font("Arial", 24),
 CanGrow = true,
 AutoWidth = true,
 Text = "Hello Raspberry!",
 Parent = page.ReportTitle
 };
 
 // make the document
 report.Prepare();
 // save the document as PDF file
 using PDFExport pdf = new PDFExport();
 report.Export(pdf, "file.pdf");
 }
 }
}

Программа создает экземпляр отчёта, добавляет в него страницу, а на неё бэнд. Затем создается текстовый объект по координатам Left и Top. Свойства CanGrow и AutoWidth позволяют объекту автоматически рассчитать высоту и ширину в зависимости от размера текста. Свойство Parent указывает на принадлежность нужному бэнду.

Создание объектов в коде программы не единственный способ формирования документов. Можно использовать поставляющийся в комплекте с FastReport .NET редактор шаблонов Designer.exe. Сформированный с его помощью файл с расширением *.frx можно затем загрузить с помощью метода Report.Load. В XML шаблоне можно указать привязки к данным пользователя, переменные, использовать встроенные и пользовательские функции. Подробнее о возможностях FastReport .NET можно узнать на официальном сайте.

После формирования документа он сохраняется в файл PDF. Все объекты использованные в программе содержат множество свойств, которые влияют на их поведение в документе. Подробнее с ними можно ознакомиться в документации к продукту FastReport .NET.

Запускаем программу командой:

1
$ dotnet run

Если всё сделано правильно и все нужные пакеты установлены, мы получим файл file.pdf. В противном случае нужно прочесть текст выданных ошибок и устранить их.

Полученный PDF файл полностью соответствует стандарту, содержит текст и внедренный шрифт. Текст можно выделить и скопировать в другой документ.


PDF Raspberry

В верхнем левом углу страницы присутствует текст означающий, что мы использовали демо-версию FastReport .NET Core. Максимальное количество страниц в демо-версии ограничено пятью. Коммерческая версия FastReport .NET не содержит этих ограничений, её можно приобрести на сайте Fast Reports.

Существует способ получить аналогичный PDF файл без надписи DEMO VERSION абсолютно бесплатно. Для этого можно использовать продукт FastReport Open Source.

Изменим файл csproj, а именно секцию ItemGroup:

1
2
3
4
5
 <ItemGroup>
 <PackageReference Include="FastReport.Compat" Version="2020.3.2" />
 <PackageReference Include="FastReport.OpenSource" Version="2020.3.1" />
 <PackageReference Include="FastReport.OpenSource.Export.PdfSimple" Version="2020.3.1" />
 </ItemGroup>

The file Program.cs needs to be changed as follows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using FastReport;
using FastReport.Export.PdfSimple;
using FastReport.Utils;
 
namespace testpdf
{
 class Program
 {
 static void Main()
 {
 Console.WriteLine("Test FastReport Open Source");
 
 // ...
 // same code here ...
 // ...
 
 // save the document as PDF file
 using PDFSimpleExport pdf = new PDFSimpleExport();
 report.Export(pdf, "file.pdf");
 }
 }
}

Затем запускаем программу командой dotnet run и получаем PDF без текста об использовании демо-версии и каких-либо ограничений по количеству страниц.

К сожалению, есть существенный недостаток Open Source версии - файлы PDF содержат внутри изображения вместо текста. Скопировать такой текст не получится и размер файлов будет существенно больше. Для простых применений этого должно хватить.

При создании PDF с помощью FastReport Open Source может возникнуть проблема отрисовки символов в виде пустых квадратов. Этот баг .NET Core уже давно исправлен для платформ x86 и x64. В таком случае нужно ждать исправления в последних сборках .NET Core или использовать .NET Core SDK 2.2.

Очень радует возможность исполнения .NET Core приложений на платформах ARM32 / ARM64. Производители серверов уже начали продажи аппаратных платформ на ARM процессорах. Не исключено, что в самое ближайшее время мы увидим рост  популярности предложений ARM Bare-Metal на хостинговых площадках.

GIGABYTE ARM Server

Ну, а сейчас у нас есть возможность потренироваться на Raspberry PI с заделом на сервера.

Примеры описанные в статье можно найти в моем профиле на GitHub.

9 апреля 2024

Как работать с FastReport Avalonia на .NET 8 в Visual Studio Code for Linux

В этой статье мы разберем, как запустить FastReport Avalonia на .NET 8 в операционной системе Linux с использованием Visual Studio.
1 ноября 2023

PDF/X, PDF/A, PDF/E: В чем разница и зачем так много форматов?

Попробуем разобраться в многообразии PDF форматов, сравниваем плюсы и минусы стандартов для различных отраслей и их потребностей.
4 октября 2023

Как из приложения ASP.NET Core сформировать отчет с использованием FastReport.Core.Skia

Рассказываем как сформировать отчет на Windows и Linux с использованием FastReport.Core.Skia и приватного NuGet сервера.