Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 7b157edd authored by Michael KRISPER's avatar Michael KRISPER
Browse files

faster pdf report creation (create pages in parallel), writes with using-statement

parent 3a42b4a6
No related branches found
No related tags found
No related merge requests found
...@@ -36,6 +36,7 @@ using System.Drawing.Imaging; ...@@ -36,6 +36,7 @@ using System.Drawing.Imaging;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms.DataVisualization.Charting; using System.Windows.Forms.DataVisualization.Charting;
using iTextSharp.text; using iTextSharp.text;
using iTextSharp.text.pdf; using iTextSharp.text.pdf;
...@@ -51,8 +52,14 @@ using Rectangle = System.Drawing.Rectangle; ...@@ -51,8 +52,14 @@ using Rectangle = System.Drawing.Rectangle;
namespace TUGraz.VectoCore.OutputData.PDF namespace TUGraz.VectoCore.OutputData.PDF
{ {
/// <summary>
/// Class for writing a PDF Declaration report.
/// </summary>
public class PDFDeclarationReport : DeclarationReport public class PDFDeclarationReport : DeclarationReport
{ {
/// <summary>
/// the writer which actually persists the stream (either to file or somewhere else).
/// </summary>
private readonly IReportWriter _writer; private readonly IReportWriter _writer;
/// <summary> /// <summary>
...@@ -91,12 +98,23 @@ namespace TUGraz.VectoCore.OutputData.PDF ...@@ -91,12 +98,23 @@ namespace TUGraz.VectoCore.OutputData.PDF
protected internal override void DoWriteReport() protected internal override void DoWriteReport()
{ {
ReportDate = DateTime.Now.ToString(CultureInfo.InvariantCulture); ReportDate = DateTime.Now.ToString(CultureInfo.InvariantCulture);
var titlePage = CreateTitlePage(Missions);
var cyclePages = Missions.OrderBy(m => m.Key).Select((m, i) => CreateCyclePage(m.Value, i + 2, Missions.Count + 1));
MergeDocuments(titlePage, cyclePages, _writer.WriteStream(ReportType.DeclarationReportPdf)); var tasks = new List<Task<Stream>> { Task.Run(() => CreateTitlePage(Missions)) };
tasks.AddRange(Missions
.OrderBy(m => m.Key)
.Select((m, i) => Task.Run(() => CreateCyclePage(m.Value, i + 2, Missions.Count + 1))));
Task.WaitAll(tasks.Cast<Task>().ToArray());
var pages = tasks.Select(t => t.Result);
MergeDocuments(pages, _writer.WriteStream(ReportType.DeclarationReportPdf));
} }
/// <summary>
/// Initializes the report with the current date and some general data.
/// </summary>
/// <param name="modelData">the model data.</param>
/// <param name="segment">the current segment of the vehicle.</param>
protected override void DoInitializeReport(VectoRunData modelData, Segment segment) protected override void DoInitializeReport(VectoRunData modelData, Segment segment)
{ {
EngineModel = modelData.EngineData.ModelName; EngineModel = modelData.EngineData.ModelName;
...@@ -182,6 +200,7 @@ namespace TUGraz.VectoCore.OutputData.PDF ...@@ -182,6 +200,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
stamper.Writer.CloseStream = false; stamper.Writer.CloseStream = false;
stamper.Close(); stamper.Close();
stream.Position = 0;
return stream; return stream;
} }
...@@ -253,30 +272,27 @@ namespace TUGraz.VectoCore.OutputData.PDF ...@@ -253,30 +272,27 @@ namespace TUGraz.VectoCore.OutputData.PDF
stamper.Writer.CloseStream = false; stamper.Writer.CloseStream = false;
stamper.Close(); stamper.Close();
stream.Position = 0;
return stream; return stream;
} }
/// <summary> /// <summary>
/// Merges the given stream to one document and writes it to a file on disk. /// Merges the given stream to one document and writes it to a file on disk.
/// </summary> /// </summary>
/// <param name="titlePage"></param>
/// <param name="pages">The pages.</param> /// <param name="pages">The pages.</param>
/// <param name="reportWriter"></param> /// <param name="reportWriter"></param>
private static void MergeDocuments(Stream titlePage, IEnumerable<Stream> pages, Stream reportWriter) private static void MergeDocuments(IEnumerable<Stream> pages, Stream reportWriter)
{ {
var document = new Document(PageSize.A4.Rotate(), 12, 12, 12, 12); using (var document = new Document(PageSize.A4.Rotate(), 12, 12, 12, 12))
var writer = PdfWriter.GetInstance(document, reportWriter); using (var writer = new PdfCopy(document, reportWriter)) {
document.Open();
document.Open(); foreach (var page in pages) {
titlePage.Position = 0; using (var reader = new PdfReader(page)) {
document.Add(Image.GetInstance(writer.GetImportedPage(new PdfReader(titlePage), 1))); writer.AddDocument(reader);
}
foreach (var cyclePage in pages) { }
cyclePage.Position = 0;
document.Add(Image.GetInstance(writer.GetImportedPage(new PdfReader(cyclePage), 1)));
} }
document.Close();
} }
/// <summary> /// <summary>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment