Files
kreta/Kreta.BusinessLogic/Helpers/AsposeHelperNemzetisegiDokumentumok.cs
2024-03-13 00:33:46 +01:00

779 lines
37 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Text;
using System.Xml.Linq;
using Aspose.Pdf.Operators;
using Aspose.Pdf.Optimization;
using Kreta.BusinessLogic.Classes.AsposeHelpers;
using Kreta.BusinessLogic.HelperClasses.Dokumentum.TorzslapEsBizonyitvany;
using Kreta.BusinessLogic.HelperClasses.NemzetisegiDokumentumokCOs;
using Kreta.BusinessLogic.Helpers.DokumentumHelpers;
using Kreta.Enums.ManualEnums;
using Kreta.Resources;
using AsposePdf = Aspose.Pdf;
using AsposeWords = Aspose.Words;
namespace Kreta.BusinessLogic.Helpers
{
public partial class AsposeHelper
{
public (string szorgalom, string magatartas) GetSzorgalomMagatartasNev()
{
var rm = new ResourceManager(typeof(SzorgalomEsMagatartas));
var resourceSet = rm.GetResourceSet(options.Culture, true, true);
var szorgalom = resourceSet.GetString("Szorgalom");
var magatartas = resourceSet.GetString("Magatartas");
return (szorgalom, magatartas);
}
public MemoryStream GetTorzslap(Stream sablonStream, int formatumId)
{
var rm = new ResourceManager(typeof(NemzetisegiTorzslap24));
var resourceSet = rm.GetResourceSet(options.Culture, true, true);
string nyomtatvanyTemplate;
object resultDoc;
object htmlOptions;
if (formatumId == (int)NyomtatvanyFormatumEnum.PDF)
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposePdf.Document pdfDoc, out AsposePdf.HtmlLoadOptions pdfHtmlOptions);
resultDoc = pdfDoc;
htmlOptions = pdfHtmlOptions;
}
else
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposeWords.Document wordDoc, out AsposeWords.HtmlLoadOptions wordHtmlOptions);
resultDoc = wordDoc;
htmlOptions = wordHtmlOptions;
}
XDocument xDoc = XDocument.Parse(nyomtatvanyTemplate);
if (!options.DocumentParameters.SNIMegjelenites)
{
RemoveTrDokumentumElem(xDoc, "sniadatok");
}
if (!options.DocumentParameters.FelmentesekMegjelenitese)
{
RemoveTrDokumentumElem(xDoc, "felmentesadatok");
}
if (!options.DocumentParameters.FeljegyzesekMegjelenitese)
{
RemoveTrDokumentumElem(xDoc, "feljegyzesadatok");
}
if (!options.DocumentParameters.KozossegiSzolgalatMegjelenitese)
{
RemoveTrDokumentumElem(xDoc, "kozossegiszolgalatadatok");
}
if (!options.DocumentParameters.OKJMegjelenitese)
{
RemoveDivDokumentumElem(xDoc, "okjadat");
}
if (!options.DocumentParameters.TorvenyesKepviseloMegjelenites)
{
RemoveDivDokumentumElem(xDoc, "torvenyeskepviseloadat");
}
if (!options.DocumentParameters.AdatokMegjelenitese)
{
RemoveDivDokumentumElem(xDoc, "adatok");
}
if (!options.DocumentParameters.FejlecMegjelenitese)
{
var hideFejlecCss = @"#fejlec {
color: white;
}
#fejlec td
{
border: 0;
}
";
var styleElemHtml = xDoc.Descendants("style").FirstOrDefault();
if (styleElemHtml != null)
{
styleElemHtml.Value += hideFejlecCss;
}
}
var idegenDiv = xDoc.Element("html").Element("body").Elements("div").FirstOrDefault(e => e.Attribute("data-lang").Value == "idegen");
var helyettesitettTextNyomtatvany = new StringBuilder(idegenDiv.ToString());
var textCo = new NemzetisegiTorzslapTextCo(resourceSet);
ReplaceSubtitutions(helyettesitettTextNyomtatvany, textCo, isLower: true);
idegenDiv.ReplaceWith(XElement.Parse(helyettesitettTextNyomtatvany.ToString()));
var huDiv = xDoc.Element("html").Element("body").Elements("div").FirstOrDefault(e => e.Attribute("data-lang").Value == "hu-HU");
helyettesitettTextNyomtatvany = new StringBuilder(huDiv.ToString());
textCo = new NemzetisegiTorzslapTextCo(rm.GetResourceSet(CultureInfo.GetCultureInfo("hu-HU"), true, true));
ReplaceSubtitutions(helyettesitettTextNyomtatvany, textCo, isLower: true);
huDiv.ReplaceWith(XElement.Parse(helyettesitettTextNyomtatvany.ToString()));
var helyettesitettNyomtatvany = xDoc.ToString();
if (options.DocumentParameters.BetuMeret != BetuMeretEnum.Normal)
{
helyettesitettNyomtatvany = PotlapBetumeretAllitas(helyettesitettNyomtatvany);
}
var rootCo = new TorzslapEsBizonyitvanyCo(_ds);
var (szorgalom, magatartas) = GetSzorgalomMagatartasNev();
var dokumentumNyelvesitesHelper = new DokumentumNyelvesitesHelper();
foreach (var tanuloDetails in rootCo.TanuloDetailsList)
{
dokumentumNyelvesitesHelper.SetErtekelesek(tanuloDetails.TanuloErtekelesDetailsList, szorgalom, magatartas);
var nyomtatvany = new StringBuilder(helyettesitettNyomtatvany);
ReplaceSubtitutions(nyomtatvany, tanuloDetails, isLower: true);
GenerateDocument(resultDoc, htmlOptions, nyomtatvany.ToString());
}
return FinalizeDocument(resultDoc);
}
private string PotlapBetumeretAllitas(string helyettesitettNyomtatvany)
{
var matches = System.Text.RegularExpressions.Regex.Matches(helyettesitettNyomtatvany, @"(?<teljes>font-size: ?(?<meret>\d{1,2})px;)", System.Text.RegularExpressions.RegexOptions.Singleline);
var sb = new StringBuilder(helyettesitettNyomtatvany.Length);
int pos = 0; // position in original string
foreach (System.Text.RegularExpressions.Match match in matches)
{
sb.Append(helyettesitettNyomtatvany, pos, match.Index - pos); // Append the portion of the original we skipped
pos = match.Index;
sb.Append(match.Groups["teljes"].Value.Replace(match.Groups["meret"].Value, (int.Parse(match.Groups["meret"].Value) - (options.DocumentParameters.BetuMeret == BetuMeretEnum.Small ? 1 : 2)).ToString()));
pos += match.Value.Length;
}
sb.Append(helyettesitettNyomtatvany, pos, helyettesitettNyomtatvany.Length - 1 - pos);
helyettesitettNyomtatvany = sb.ToString();
return helyettesitettNyomtatvany;
}
private static void RemoveTrDokumentumElem(XDocument xDoc, string elemId)
{
RemoveCommonDokumentumElem(xDoc, "tr", elemId);
}
private static void RemoveDivDokumentumElem(XDocument xDoc, string elemId)
{
RemoveCommonDokumentumElem(xDoc, "div", elemId);
}
private static void RemoveSpanDokumentumElem(XDocument xDoc, string elemId)
{
RemoveCommonDokumentumElem(xDoc, "span", elemId);
}
private static void RemoveCommonDokumentumElem(XDocument xDoc, string elem, string elemId)
{
foreach (var a in xDoc.Descendants(elem).Where(x => x.Attribute("id")?.Value == elemId).ToList())
{
a.Remove();
}
}
public MemoryStream GetBizonyitvany(Stream sablonStream, int formatumId)
{
string nyomtatvanyTemplate;
object resultDoc;
object htmlOptions;
if (formatumId == (int)NyomtatvanyFormatumEnum.PDF)
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposePdf.Document pdfDoc, out AsposePdf.HtmlLoadOptions pdfHtmlOptions);
resultDoc = pdfDoc;
htmlOptions = pdfHtmlOptions;
}
else
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposeWords.Document wordDoc, out AsposeWords.HtmlLoadOptions wordHtmlOptions);
resultDoc = wordDoc;
htmlOptions = wordHtmlOptions;
}
XDocument xDoc = XDocument.Parse(nyomtatvanyTemplate);
foreach (var notNeeded in xDoc.Element("html").Element("body").Elements("div").Where(e => e.Attribute("id").Value != options.BizonyitvanypotlapEvfolyamDivId.ToString()).ToList())
{
notNeeded.Remove();
}
var evfolyamDivElem = xDoc.Element("html").Element("body").Element("div");
var szuksegesNyelvek = new List<string>() { "hu-HU", options.Culture.Name };
foreach (var notNeeded in evfolyamDivElem.Elements("div").Where(e => !szuksegesNyelvek.Contains(e.Attribute("data-lang")?.Value)).ToList())
{
notNeeded.Remove();
}
if (options.DocumentParameters.ErtekelesMegjelenitesFormatum == (int)NyomtatvanyErtekelesMegjelenitesEnum.FolyamatosSzoveggel)
{
RemoveTrDokumentumElem(xDoc, "ertekelestablazatos");
RemoveTrDokumentumElem(xDoc, "tantargyfejlec");
}
else
{
RemoveTrDokumentumElem(xDoc, "ertekelesfolyamatos");
}
if (!options.DocumentParameters.IsEvesOraszamMegjelenites)
{
RemoveSpanDokumentumElem(xDoc, "evesoraszam");
}
if (!options.DocumentParameters.IsAtlagMegjelenites)
{
RemoveTrDokumentumElem(xDoc, "atlag");
}
else
{
RemoveTrDokumentumElem(xDoc, "nincsatlag");
}
if (options.DocumentParameters.IsMulasztasokUjLapra)
{
switch (options.BizonyitvanypotlapEvfolyamDivId)
{
case BizonyitvanypotlapEvfolyamDivIdEnum.masodiknegyedikosztaly:
foreach (var mulasztasok in xDoc.Descendants("tr").Where(x => x.Attribute("id")?.Value == "mulasztasoksor"))
{
if (options.DocumentParameters.IsAtlagMegjelenites)
{
var atlagsorclassattrib = (mulasztasok.PreviousNode as XElement).Attributes().FirstOrDefault(x => x.Name == "class");
if (atlagsorclassattrib != null)
{
atlagsorclassattrib.Value += " utolsosor";
}
}
else
{
mulasztasok.PreviousNode.AddAfterSelf(new XElement("tr", new XAttribute("class", "utolsosor"), new XElement("td"), new XElement("td"), new XElement("td")));
}
XElement divPagebreak = new XElement("div", new XAttribute("class", "pagebreak"));
divPagebreak.Add("\r\n");
XElement divKeret = new XElement("div", new XAttribute("class", "keret"));
XElement table = new XElement("table", new XAttribute("class", "osztalyzatosszesito"));
var atrakandok = mulasztasok.NodesAfterSelf();
mulasztasok.Parent.Parent.AddAfterSelf(divKeret);
mulasztasok.Parent.Parent.AddAfterSelf(divPagebreak);
var hosszubelyegzomegj = mulasztasok.Parent.Parent.Parent.Elements("div").FirstOrDefault(x => x.Attribute("id")?.Value == "hosszubelyegzomegj");
hosszubelyegzomegj.Remove();
divPagebreak.AddBeforeSelf(hosszubelyegzomegj);
divKeret.Add(table);
foreach (var atrakando in atrakandok.ToList())
{
atrakando.Remove();
table.Add(atrakando);
}
mulasztasok.Remove();
table.AddFirst(mulasztasok);
}
break;
case BizonyitvanypotlapEvfolyamDivIdEnum.felsoosztalyok:
foreach (var hosszubelyegzomegj in xDoc.Descendants("div").Where(x => x.Attribute("id")?.Value == "hosszubelyegzomegj"))
{
XElement divPagebreak = new XElement("div", new XAttribute("class", "pagebreak"));
divPagebreak.Add("\r\n");
hosszubelyegzomegj.AddAfterSelf(divPagebreak);
}
break;
default:
break;
}
}
var helyettesitettNyomtatvany = xDoc.ToString();
if (options.DocumentParameters.BetuMeret != BetuMeretEnum.Normal)
{
helyettesitettNyomtatvany = PotlapBetumeretAllitas(helyettesitettNyomtatvany);
}
var rootCo = new TorzslapEsBizonyitvanyCo(_ds);
rootCo.FejlecDetails.Keltezes = options.DocumentParameters.Kelt;
AlairoKitoltese(rootCo);
var (szorgalom, magatartas) = GetSzorgalomMagatartasNev();
var dokumentumNyelvesitesHelper = new DokumentumNyelvesitesHelper();
foreach (var tanuloDetails in rootCo.TanuloDetailsList)
{
dokumentumNyelvesitesHelper.SetErtekelesek(tanuloDetails.TanuloErtekelesDetailsList, szorgalom, magatartas);
var nyomtatvany = new StringBuilder(helyettesitettNyomtatvany);
ReplaceSubtitutions(nyomtatvany, tanuloDetails);
GenerateDocument(resultDoc, htmlOptions, nyomtatvany.ToString());
}
return FinalizeDocument(resultDoc);
}
public MemoryStream GetGimnaziumiBizonyitvany(Stream sablonStream, int formatumId)
{
string nyomtatvanyTemplate;
object resultDoc;
object htmlOptions;
if (formatumId == (int)NyomtatvanyFormatumEnum.PDF)
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposePdf.Document pdfDoc, out AsposePdf.HtmlLoadOptions pdfHtmlOptions);
resultDoc = pdfDoc;
htmlOptions = pdfHtmlOptions;
}
else
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposeWords.Document wordDoc, out AsposeWords.HtmlLoadOptions wordHtmlOptions);
resultDoc = wordDoc;
htmlOptions = wordHtmlOptions;
}
XDocument xDoc = XDocument.Parse(nyomtatvanyTemplate);
var szuksegesNyelvek = new List<string>() { "hu-HU", options.Culture.Name };
foreach (var notNeeded in xDoc.Element("html").Element("body").Elements("div").Where(e => !szuksegesNyelvek.Contains(e.Attribute("data-lang")?.Value)).ToList())
{
notNeeded.Remove();
}
if (options.DocumentParameters.ErtekelesMegjelenitesFormatum == (int)NyomtatvanyErtekelesMegjelenitesEnum.FolyamatosSzoveggel)
{
RemoveTrDokumentumElem(xDoc, "ertekelestablazatos");
RemoveTrDokumentumElem(xDoc, "tantargyfejlec");
}
else
{
RemoveTrDokumentumElem(xDoc, "ertekelesfolyamatos");
}
if (!options.DocumentParameters.IsEvesOraszamMegjelenites)
{
RemoveSpanDokumentumElem(xDoc, "evesoraszam");
}
if (!options.DocumentParameters.IsAtlagMegjelenites)
{
RemoveTrDokumentumElem(xDoc, "atlag");
}
var helyettesitettNyomtatvany = xDoc.ToString();
if (options.DocumentParameters.BetuMeret != BetuMeretEnum.Normal)
{
helyettesitettNyomtatvany = PotlapBetumeretAllitas(helyettesitettNyomtatvany);
}
var rootCo = new TorzslapEsBizonyitvanyCo(_ds);
rootCo.FejlecDetails.Keltezes = options.DocumentParameters.Kelt;
AlairoKitoltese(rootCo);
var (szorgalom, magatartas) = GetSzorgalomMagatartasNev();
var dokumentumNyelvesitesHelper = new DokumentumNyelvesitesHelper();
foreach (var tanuloDetails in rootCo.TanuloDetailsList)
{
dokumentumNyelvesitesHelper.SetErtekelesek(tanuloDetails.TanuloErtekelesDetailsList, szorgalom, magatartas);
var nyomtatvany = new StringBuilder(helyettesitettNyomtatvany);
ReplaceSubtitutions(nyomtatvany, tanuloDetails);
GenerateDocument(resultDoc, htmlOptions, nyomtatvany.ToString());
}
return FinalizeDocument(resultDoc);
}
public MemoryStream GetErettsegiBizonyitvany(Stream sablonStream, int formatumId)
{
string nyomtatvanyTemplate;
object resultDoc;
object htmlOptions;
if (formatumId == (int)NyomtatvanyFormatumEnum.PDF)
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposePdf.Document pdfDoc, out AsposePdf.HtmlLoadOptions pdfHtmlOptions);
resultDoc = pdfDoc;
htmlOptions = pdfHtmlOptions;
}
else
{
InitializeDocument(sablonStream, out nyomtatvanyTemplate, out AsposeWords.Document wordDoc, out AsposeWords.HtmlLoadOptions wordHtmlOptions);
resultDoc = wordDoc;
htmlOptions = wordHtmlOptions;
}
XDocument xDoc = XDocument.Parse(nyomtatvanyTemplate);
var szuksegesNyelvek = new List<string>() { "hu-HU", options.Culture.Name };
foreach (var notNeeded in xDoc.Element("html").Element("body").Elements("div").Where(e => !szuksegesNyelvek.Contains(e.Attribute("data-lang")?.Value)).ToList())
{
notNeeded.Remove();
}
var helyettesitettNyomtatvany = xDoc.ToString();
if (options.DocumentParameters.BetuMeret != BetuMeretEnum.Normal)
{
helyettesitettNyomtatvany = PotlapBetumeretAllitas(helyettesitettNyomtatvany);
}
var rootCo = new TorzslapEsBizonyitvanyCo(_ds);
rootCo.FejlecDetails.Keltezes = options.DocumentParameters.Kelt;
AlairoKitoltese(rootCo);
var (szorgalom, magatartas) = GetSzorgalomMagatartasNev();
var dokumentumNyelvesitesHelper = new DokumentumNyelvesitesHelper();
foreach (var tanuloDetails in rootCo.TanuloDetailsList)
{
dokumentumNyelvesitesHelper.SetErtekelesek(tanuloDetails.TanuloErtekelesDetailsList, szorgalom, magatartas);
var nyomtatvany = new StringBuilder(helyettesitettNyomtatvany);
ReplaceSubtitutions(nyomtatvany, tanuloDetails);
GenerateDocument(resultDoc, htmlOptions, nyomtatvany.ToString());
}
return FinalizeDocument(resultDoc);
}
private void AlairoKitoltese(TorzslapEsBizonyitvanyCo rootCo)
{
if (options.DocumentParameters.AlairoSzemely != null)
{
rootCo.FejlecDetails.AlairoNev = options.DocumentParameters.AlairoSzemely["Nev"];
rootCo.FejlecDetails.AlairoNevIdegenNyelven = options.DocumentParameters.AlairoSzemely["NevIdegenNyelven"];
rootCo.FejlecDetails.AlairoBeosztas = options.DocumentParameters.AlairoSzemely["Beosztas"];
rootCo.FejlecDetails.AlairoBeosztasIdegenNyelven = options.DocumentParameters.AlairoSzemely["BeosztasIdegennNyelven"];
}
}
private void ReplaceSubtitutions<T>(StringBuilder nyomtatvany, T adat, string prefix = "", bool isLower = false)
{
foreach (var pi in adat.GetType().GetProperties())
{
var phrase = string.Format("{{{0}{1}}}", prefix, (isLower) ? pi.Name.ToLower() : pi.Name);
if (pi.PropertyType == typeof(DateTime))
{
ReplaceDateTime(nyomtatvany, (DateTime)pi.GetValue(adat), pi, phrase);
}
else if (pi.PropertyType == typeof(DateTime?))
{
var datum = (DateTime?)pi.GetValue(adat);
if (datum.HasValue)
{
ReplaceDateTime(nyomtatvany, datum.Value, pi, phrase);
}
}
else if (typeof(IEnumerable<object>).IsAssignableFrom(pi.PropertyType))
{
var listaElemHtmlMatches = System.Text.RegularExpressions.Regex.Matches(nyomtatvany.ToString(), string.Format(@"<tr data-{0}(.*?)</tr>", pi.Name.ToLower()), System.Text.RegularExpressions.RegexOptions.Singleline);
if (listaElemHtmlMatches.Count == 0)
{
continue;
}
foreach (System.Text.RegularExpressions.Match listaElemHtml in listaElemHtmlMatches)
{
var listaElemReplaceHtml = new StringBuilder();
var lista = (IEnumerable<object>)(pi.GetValue(adat));
var minrowcount = System.Text.RegularExpressions.Regex.Match(listaElemHtml.Value, "(?<=data-minrownumber=\")\\d{1,2}(?!=\")", System.Text.RegularExpressions.RegexOptions.Singleline)?.Value;
if (minrowcount != "")
{
var imax = lista.Count();
for (int i = 0; i < (int.Parse(minrowcount) - imax); i++)
{
lista = lista.Append(Activator.CreateInstance(pi.PropertyType.GenericTypeArguments[0]));
}
}
for (int i = 0; i < lista.Count(); i++)
{
var elemCo = lista.ElementAt(i);
var listaElemFilledHTML = new StringBuilder(listaElemHtml.Value);
var rowspanHtml = System.Text.RegularExpressions.Regex.Match(listaElemHtml.Value, string.Format(@"<td rowspan=""{{db}}""(.*?)</td>", pi.Name.ToLower()), System.Text.RegularExpressions.RegexOptions.Singleline).Value;
if (!string.IsNullOrWhiteSpace(rowspanHtml))
{
if (i == 0)
{
listaElemFilledHTML.Replace("{db}", lista.Count().ToString());
}
else
{
listaElemFilledHTML.Replace(rowspanHtml, "");
}
}
ReplaceSubtitutions(listaElemFilledHTML, elemCo, prefix, isLower);
listaElemReplaceHtml.Append(listaElemFilledHTML);
}
listaElemReplaceHtml.Replace(string.Format(" data-{0}=\"{0}adat\"", pi.Name.ToLower()), "");
nyomtatvany.Replace(listaElemHtml.Value, listaElemReplaceHtml.ToString() + Environment.NewLine);
}
}
else if (pi.PropertyType.IsClass && (pi.PropertyType != typeof(string)))
{
if (pi.GetValue(adat) != null)
{
ReplaceSubtitutions(nyomtatvany, pi.GetValue(adat), prefix, isLower);
}
}
else
{
nyomtatvany.Replace(phrase, (pi.GetValue(adat) == null) ? "" : pi.GetValue(adat).ToString().Replace(Environment.NewLine, "<br/>"));
}
}
}
private void ReplaceDateTime(StringBuilder nyomtatvany, DateTime datum, PropertyInfo pi, string phrase)
{
nyomtatvany.Replace(phrase.Insert(phrase.Length - 1, "IdegenNyelven"), datum.ToString(options.Culture.DateTimeFormat.ShortDatePattern));
nyomtatvany.Replace(phrase, datum.ToString(CultureInfo.GetCultureInfo("hu-HU").DateTimeFormat.ShortDatePattern));
nyomtatvany.Replace(phrase.Insert(phrase.Length - 1, "ev"), datum.ToString("yyyy"));
nyomtatvany.Replace(phrase.Insert(phrase.Length - 1, "hoIdegenNyelven"), options.Culture.DateTimeFormat.GetMonthName(datum.Month));
nyomtatvany.Replace(phrase.Insert(phrase.Length - 1, "ho"), CultureInfo.GetCultureInfo("hu-HU").DateTimeFormat.GetMonthName(datum.Month));
nyomtatvany.Replace(phrase.Insert(phrase.Length - 1, "nap"), datum.ToString("dd"));
}
private void GenerateDocument<T, U>(T resultDoc, U htmlOptions, string nyomtatvany)
{
if (resultDoc is AsposePdf.Document)
{
GeneratePDF(resultDoc as AsposePdf.Document, htmlOptions as AsposePdf.HtmlLoadOptions, nyomtatvany);
}
else
{
GenerateWord(resultDoc as AsposeWords.Document, htmlOptions as AsposeWords.HtmlLoadOptions, nyomtatvany);
}
}
private void GeneratePDF(AsposePdf.Document resultDoc, AsposePdf.HtmlLoadOptions htmlOptions, string nyomtatvany)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
{
writer.Write(nyomtatvany);
writer.Flush();
stream.Position = 0;
using (var document = new AsposePdf.Document(stream, htmlOptions))
{
var start2 = 1;
if (options.PageNumbering != PageNumberingEnum.None)
{
for (int i = start2; i <= document.Pages.Count; i++)
{
var textStamp = new AsposePdf.TextStamp((i - start2 + 1).ToString())
{
BottomMargin = 10,
HorizontalAlignment = AsposePdf.HorizontalAlignment.Center,
VerticalAlignment = AsposePdf.VerticalAlignment.Bottom
};
//textStamp.TextState.Font = resultDoc.Pages[i].Resources.Fonts["Times New Roman"];
//textStamp.TextState.FontSize = 20;
if ((i == start2) && (options.PageNumbering == PageNumberingEnum.AllExceptFirst))
{
continue;
}
document.Pages[i].AddStamp(textStamp);
//resultDoc.Pages[i].Footer = new HeaderFooter();
//resultDoc.Pages[i].Footer.Paragraphs.Add(new TextFragment((i - start).ToString()));
}
}
if (options?.DocumentParameters?.KotesmargoTipus >= KotesmargoTipusEnum.Ketoldalas)
{
var startPage = options.DocumentParameters.KotesmargoTipus == KotesmargoTipusEnum.Ketoldalas ? 2 : 1;
for (int i = startPage; i <= document.Pages.Count; i += 2)
{
var pageFirstGIndex = document.Pages[i].Contents.First(x => (x.GetType() == typeof(ConcatenateMatrix))
&& ((x as ConcatenateMatrix).Matrix.A == 1)
&& ((x as ConcatenateMatrix).Matrix.B == 0)
&& ((x as ConcatenateMatrix).Matrix.C == 0)
&& ((x as ConcatenateMatrix).Matrix.D == -1)
&& ((x as ConcatenateMatrix).Matrix.E == 0)
&& ((x as ConcatenateMatrix).Matrix.F == options.PageSize.Height)
).Index;
document.Pages[i].Contents.Insert(pageFirstGIndex + 1, new ConcatenateMatrix(1, 0, 0, 1, -options.Margins.Left, 0));
}
}
// Az utolsó oldalon a generált kép 6 pixelllel feljebb csúszik, enneke a korrekciója van ebben a blokkban
if (document.Pages.Count > 1)
{
var lastPageFirstGIndex = document.Pages[document.Pages.Count].Contents.First(x => (x.GetType() == typeof(ConcatenateMatrix))
&& ((x as ConcatenateMatrix).Matrix.A == 1)
&& ((x as ConcatenateMatrix).Matrix.B == 0)
&& ((x as ConcatenateMatrix).Matrix.C == 0)
&& ((x as ConcatenateMatrix).Matrix.D == -1)
&& ((x as ConcatenateMatrix).Matrix.E == 0)
&& ((x as ConcatenateMatrix).Matrix.F == options.PageSize.Height)
).Index;
document.Pages[document.Pages.Count].Contents.Insert(lastPageFirstGIndex + 1, new ConcatenateMatrix(1, 0, 0, 1, 0, 6));
}
resultDoc.Pages.Add(document.Pages.ToArray());
}
}
}
private void GenerateWord(AsposeWords.Document resultDoc, AsposeWords.LoadOptions htmlOptions, string nyomtatvany)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
{
writer.Write(nyomtatvany);
writer.Flush();
stream.Position = 0;
var document = new AsposeWords.Document(stream, htmlOptions);
{
resultDoc.AppendDocument(document, AsposeWords.ImportFormatMode.KeepSourceFormatting);
}
}
}
private void InitializeDocument<T, U>(Stream sablonStream, out string nyomtatvanyTemplate, out T document, out U htmlOptions)
{
var reader = new StreamReader(sablonStream);
nyomtatvanyTemplate = reader.ReadToEnd();
reader.Dispose();
if (typeof(T) == typeof(AsposePdf.Document))
{
var dataDir = System.Web.Hosting.HostingEnvironment.MapPath("/Resources/AsposeSablonok/");
var pdfHtmlOptions = new AsposePdf.HtmlLoadOptions(dataDir);
pdfHtmlOptions.PageInfo.Margin.Bottom = options.Margins.Bottom;
pdfHtmlOptions.PageInfo.Margin.Left = options.Margins.Left * (options.DocumentParameters?.KotesmargoTipus != KotesmargoTipusEnum.Nincs ? 2 : 1);
pdfHtmlOptions.PageInfo.Margin.Right = options.Margins.Right;
pdfHtmlOptions.PageInfo.Margin.Top = options.Margins.Top;
pdfHtmlOptions.PageInfo.Height = options.PageSize.Height;
pdfHtmlOptions.PageInfo.Width = options.PageSize.Width;
htmlOptions = (U)Convert.ChangeType(pdfHtmlOptions, typeof(U));
var pdfDoc = new AsposePdf.Document();
pdfDoc.PageInfo.Width = options.PageSize.Width;
pdfDoc.PageInfo.Height = options.PageSize.Height;
document = (T)Convert.ChangeType(pdfDoc, typeof(T));
}
else
{
var wordDoc = new AsposeWords.Document();
document = (T)Convert.ChangeType(wordDoc, typeof(T));
var wordHtmlOptions = new AsposeWords.HtmlLoadOptions();
htmlOptions = (U)Convert.ChangeType(wordHtmlOptions, typeof(U));
}
}
private MemoryStream FinalizeDocument<T>(T document)
{
return document is AsposePdf.Document ? FinalizePDF(document as AsposePdf.Document) : FinalizeWord(document as AsposeWords.Document);
}
private static MemoryStream FinalizePDF(AsposePdf.Document resultDoc)
{
foreach (var page in resultDoc.Pages)
{
if (page.Resources.Fonts != null)
{
foreach (var pageFont in page.Resources.Fonts)
{
if (!pageFont.IsEmbedded)
{
pageFont.IsEmbedded = true;
}
}
}
}
var ms = new MemoryStream();
var optimizationOptions = new OptimizationOptions
{
RemoveUnusedObjects = true,
RemoveUnusedStreams = true,
AllowReusePageContent = true,
LinkDuplcateStreams = true,
UnembedFonts = true
};
optimizationOptions.ImageCompressionOptions.CompressImages = true;
optimizationOptions.ImageCompressionOptions.ImageQuality = 50;
optimizationOptions.ImageCompressionOptions.ResizeImages = true;
resultDoc.OptimizeResources(optimizationOptions);
resultDoc.Optimize();
resultDoc.Save(ms, AsposePdf.SaveFormat.Pdf);
resultDoc.Dispose();
return ms;
}
private MemoryStream FinalizeWord(AsposeWords.Document document)
{
document.Sections.RemoveAt(0);
for (int i = 0; i < document.Sections.Count; i++)
{
Aspose.Words.Section section = document.Sections[i];
section.PageSetup.PaperSize = ConvertPdfPageSizeToWordPaperSize(options.PageSize);
double left, right;
left = options.Margins.Left;
right = options.Margins.Right;
if (options?.DocumentParameters?.KotesmargoTipus != KotesmargoTipusEnum.Nincs)
{
section.PageSetup.Gutter = options.Margins.Left;
if (options.DocumentParameters.KotesmargoTipus >= KotesmargoTipusEnum.Ketoldalas)
{
if (options.DocumentParameters.KotesmargoTipus == KotesmargoTipusEnum.ForditottKetoldalas)
{
section.PageSetup.RtlGutter = true;
}
section.PageSetup.MultiplePages = Aspose.Words.Settings.MultiplePagesType.MirrorMargins;
}
}
section.PageSetup.PaperSize = ConvertPdfPageSizeToWordPaperSize(options.PageSize);
section.PageSetup.LeftMargin = left;
section.PageSetup.RightMargin = right;
section.PageSetup.TopMargin = options.Margins.Top;
section.PageSetup.BottomMargin = options.Margins.Bottom;
}
var ms = new MemoryStream();
document.Save(ms, Aspose.Words.SaveFormat.Docx);
return ms;
}
private static AsposeWords.PaperSize ConvertPdfPageSizeToWordPaperSize(AsposePdf.PageSize pageSize)
{
int temp = (pageSize == AsposePdf.PageSize.A5) ? 0 : 1;
switch (temp)
{
case 0:
return AsposeWords.PaperSize.A5;
default:
return AsposeWords.PaperSize.A4;
}
}
private void SetWordDocumentKotesMargo(AsposeWords.Document document)
{
for (int i = 0; i < document.Sections.Count; i++)
{
AsposeWords.Section section = document.Sections[i];
double left, right;
left = options.Margins?.Left ?? section.PageSetup.LeftMargin;
right = options.Margins?.Right ?? section.PageSetup.RightMargin;
if (options?.DocumentParameters?.KotesmargoTipus != KotesmargoTipusEnum.Nincs)
{
section.PageSetup.Gutter = left / 2;
right -= left / 2;
if (options.DocumentParameters.KotesmargoTipus >= KotesmargoTipusEnum.Ketoldalas)
{
if (options.DocumentParameters.KotesmargoTipus == KotesmargoTipusEnum.ForditottKetoldalas)
{
section.PageSetup.RtlGutter = true;
var temp = left;
left = right;
right = temp;
}
section.PageSetup.MultiplePages = Aspose.Words.Settings.MultiplePagesType.MirrorMargins;
}
}
section.PageSetup.LeftMargin = left;
section.PageSetup.RightMargin = right;
section.PageSetup.TopMargin = options.Margins?.Top ?? section.PageSetup.TopMargin;
section.PageSetup.BottomMargin = options.Margins?.Bottom ?? section.PageSetup.BottomMargin;
}
}
}
}