auto.bus_razor/TicketOffice/Services/PdfService.cs

147 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.Route.Number}",
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);
page.AddText(
"Ціна:",
14,
firstParagraphPoint.Translate(0, 4 * -lineHeight),
roboto);
page.AddText(
$"{ticket.GetTotalCost()}",
14,
firstParagraphPoint.Translate(250, 4 * -lineHeight),
roboto);
page.AddText(
"Дата придбання квитка:",
14,
firstParagraphPoint.Translate(0, 6 * -lineHeight),
roboto);
page.AddText(
$"{ticket.OderDate.ToString("dd.MM.yyyy, HH:mm:ss")}",
14,
firstParagraphPoint.Translate(250, 6 * -lineHeight),
roboto);
page.AddText(
"Дата генерації квитка:",
14,
firstParagraphPoint.Translate(0, 7 * -lineHeight),
roboto);
page.AddText(
$"{DateTime.Now.ToString("dd.MM.yyyy, HH:mm:ss")}",
14,
firstParagraphPoint.Translate(250, 7 * -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;
}
}