gehgassi_backend/gehGassi.Web/Helper/ControllerPdfExtensions.cs

107 lines
4.7 KiB
C#

using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Extensions.FileProviders;
using Syncfusion.Drawing;
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
namespace gehGassi.Web.Helper
{
/// <summary>
/// Erweiterungen um aus einem View ein PDF zu erstellen
/// </summary>
public static class ControllerPdfExtensions
{
public static byte[] GetPdf(this ControllerContext context, IUrlHelperFactory factory, IWebHostEnvironment env, string controller, string action, object routeValues)
{
var urlHelper = factory.GetUrlHelper(context);
var address = urlHelper.Action(action, controller, routeValues);
address = $"{context.HttpContext.Request.Scheme}://{context.HttpContext.Request.Host}{address}";
var htmlConverter = new HtmlToPdfConverter(HtmlRenderingEngine.WebKit)
{
ConverterSettings = new WebKitConverterSettings()
{
WebKitPath = Path.Combine(env.ContentRootPath, "QtBinariesWindows"),
PdfPageSize = PdfPageSize.A4,
Margin = new PdfMargins() { All = 36f },
WebKitViewPort = new Size(896, 0),
DisableWebKitWarning = true
}
};
var pdfDocument = htmlConverter.Convert(address);
var outputStream = new MemoryStream();
pdfDocument.Save(outputStream);
outputStream.Position = 0;
return outputStream.ToArray();
}
public static byte[] GetPdfWithHeaderAndFooter(this ControllerContext context, IUrlHelperFactory factory, IWebHostEnvironment env, string controller, string action, object routeValues)
{
var urlHelper = factory.GetUrlHelper(context);
var address = urlHelper.Action(action, controller, routeValues);
address = $"{context.HttpContext.Request.Scheme}://{context.HttpContext.Request.Host}{address}";
var htmlConverter = new HtmlToPdfConverter(HtmlRenderingEngine.WebKit)
{
ConverterSettings = new WebKitConverterSettings()
{
WebKitPath = Path.Combine(env.ContentRootPath, "QtBinariesWindows"),
PdfPageSize = PdfPageSize.A4,
Margin = new PdfMargins() { All = 36f },
WebKitViewPort = new Size(896, 0),
PdfHeader = AddPdfHeader(PdfPageSize.A4.Width, env),
PdfFooter = AddPdfFooter(PdfPageSize.A4.Width, env),
DisableWebKitWarning = true
}
};
var pdfDocument = htmlConverter.Convert(address);
var outputStream = new MemoryStream();
pdfDocument.Save(outputStream);
outputStream.Position = 0;
return outputStream.ToArray();
}
private static PdfPageTemplateElement AddPdfHeader(float width, IWebHostEnvironment env)
{
RectangleF rect = new RectangleF(0, 0, width, 75);
//Create a new instance of PdfPageTemplateElement class.
PdfPageTemplateElement header = new PdfPageTemplateElement(rect);
PdfGraphics g = header.Graphics;
var fileName = Path.Combine(env.WebRootPath, "images", "invoice_logo.png");
using var fileStram = File.OpenRead(fileName);
var image = new PdfBitmap(fileStram);
g.DrawImage(image, 214,0, 167, 50);
return header;
}
private static PdfPageTemplateElement AddPdfFooter(float width, IWebHostEnvironment env)
{
RectangleF rect = new RectangleF(0, 0, width, 50);
//Create a new instance of PdfPageTemplateElement class.
PdfPageTemplateElement footer = new PdfPageTemplateElement(rect);
PdfGraphics g = footer.Graphics;
var fileName = Path.Combine(env.WebRootPath, "images", "invoice_icon.png");
using var fileStram = File.OpenRead(fileName);
var image = new PdfBitmap(fileStram);
g.DrawImage(image, 0, 0, 22, 25);
g.DrawImage(image, 570, 0, 22, 25);
PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 8);
g.DrawString("gehgassi GmbH | c/o frebels | Judengasse 12/2 | 5020 Salzburg | office@gehgassi.com | www.gehgassi.com\n\rFN 580181h | UID: ATU77335634 | Sparkasse Kufstein | IBAN: AT39 2050 6077 0015 5083 | BIC: SPKUAT22XXX", font, PdfBrushes.Black, new RectangleF(0,0,595,50), new PdfStringFormat(PdfTextAlignment.Center));
return footer;
}
}
}