114 lines
3.9 KiB
C#
114 lines
3.9 KiB
C#
using System.Globalization;
|
||
using TicketOffice.Models;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using UglyToad.PdfPig.Content;
|
||
using UglyToad.PdfPig.Core;
|
||
using UglyToad.PdfPig.Writer;
|
||
|
||
namespace TicketOffice.Services;
|
||
|
||
public class PdfService
|
||
{
|
||
// Generates and returns PDF representation of some ticket
|
||
public FileStreamResult GetTicketPdf(Ticket ticket)
|
||
{
|
||
// Set culture info to be able to correctly convert date To String
|
||
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("uk-UA");
|
||
|
||
PdfDocumentBuilder builder = new PdfDocumentBuilder();
|
||
|
||
byte[] robotoBytes = File.ReadAllBytes(
|
||
$"{AppDomain.CurrentDomain.BaseDirectory}" +
|
||
$"/wwwroot/fonts/Roboto-Regular.ttf");
|
||
|
||
PdfDocumentBuilder.AddedFont roboto =
|
||
builder.AddTrueTypeFont(robotoBytes);
|
||
|
||
PdfPageBuilder page = builder.AddPage(PageSize.A4);
|
||
|
||
PdfPoint topCenter = new PdfPoint(
|
||
page.PageSize.Width / 2,
|
||
page.PageSize.Top - 25);
|
||
PdfPoint firstParagraphPoint =
|
||
new PdfPoint(15, page.PageSize.Top - 50);
|
||
int lineHeight = 25;
|
||
|
||
page.AddText(
|
||
$"auto.bus – Квиток №{ticket.Id}",
|
||
16,
|
||
topCenter.Translate(-75,0),
|
||
roboto);
|
||
|
||
page.AddText(
|
||
$"Номер рейсу:",
|
||
14,
|
||
firstParagraphPoint,
|
||
roboto);
|
||
page.AddText(
|
||
$"№ {ticket.RouteId}",
|
||
14,
|
||
firstParagraphPoint.Translate(250, 0),
|
||
roboto);
|
||
|
||
page.AddText(
|
||
"Пасажир, місце:",
|
||
14,
|
||
firstParagraphPoint.Translate(0, -lineHeight),
|
||
roboto);
|
||
page.AddText(
|
||
$"{ticket.PassengerLastName} {ticket.PassengerFirstName}," +
|
||
$" № {ticket.PassengerPlace}",
|
||
14,
|
||
firstParagraphPoint.Translate(250, -lineHeight),
|
||
roboto);
|
||
|
||
page.AddText(
|
||
"Дата й місто відправлення:",
|
||
14,
|
||
firstParagraphPoint.Translate(0, 2 * -lineHeight),
|
||
roboto);
|
||
page.AddText(
|
||
$"{ticket.Cities.First().Name}," +
|
||
$" {ticket.Cities.First().DepartureTime?.ToString("f").Split(",")[0].ToLower()}," +
|
||
$" {ticket.Cities.First().DepartureTime?.ToString("dd.MM.yyyy")}," +
|
||
$" {ticket.Cities.First().DepartureTime?.ToString("HH:mm")}",
|
||
14,
|
||
firstParagraphPoint.Translate(250, 2 * -lineHeight),
|
||
roboto);
|
||
|
||
page.AddText(
|
||
"Дата й місто прибуття:",
|
||
14,
|
||
firstParagraphPoint.Translate(0, 3 * -lineHeight),
|
||
roboto);
|
||
page.AddText(
|
||
$"{ticket.Cities.Last().Name}," +
|
||
$" {ticket.Cities.Last().ArrivalTime?.ToString("f").Split(",")[0].ToLower()}," +
|
||
$" {ticket.Cities.Last().ArrivalTime?.ToString("dd.MM.yyyy")}," +
|
||
$" {ticket.Cities.Last().ArrivalTime?.ToString("HH:mm")}",
|
||
14,
|
||
firstParagraphPoint.Translate(250, 3 * -lineHeight),
|
||
roboto);
|
||
|
||
byte[] document = builder.Build();
|
||
|
||
//Saving the PDF to the MemoryStream
|
||
MemoryStream stream = new MemoryStream();
|
||
|
||
stream.Write(document);
|
||
|
||
//Set the position as '0'.
|
||
stream.Position = 0;
|
||
|
||
//Download the PDF document in the browser
|
||
FileStreamResult fileStreamResult =
|
||
new FileStreamResult(stream, "application/pdf");
|
||
|
||
fileStreamResult.FileDownloadName =
|
||
$"auto.bus – Квиток №{ticket.Id}." +
|
||
$" Рейс №{ticket.RouteId}.pdf." +
|
||
$" {ticket.Cities.First().DepartureTime?.ToString("dd.MM.yyyy")}";
|
||
|
||
return fileStreamResult;
|
||
}
|
||
} |