First version of the report generating engine finished, Both front and back pages are merged into one PDF. Seems the user's screen resolution and/or size affect the size of the PDF document, I feel this is a sort of bug that must be fixed at some point.

This commit is contained in:
2017-05-08 19:51:45 -05:00
parent 15abab5f50
commit 718562222d
10 changed files with 170 additions and 143 deletions
+2 -2
View File
@@ -117,11 +117,11 @@
this.Controls.Add(this.tableLayoutPanel);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.Margin = new System.Windows.Forms.Padding(6);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutBox1";
this.Padding = new System.Windows.Forms.Padding(17, 17, 17, 17);
this.Padding = new System.Windows.Forms.Padding(17);
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+1 -1
View File
@@ -13,7 +13,7 @@ namespace AdvertsingProfitControl
var db = new AdvertisingProfitControlModel();
var version = db.Versions.SingleOrDefault(x => x.Id == 1);
databaseVersionLabel.Text = version == null ? @"Database Version: N/A" : $@"Database Version: {version.VersionNumber}";
reportGeneratingVersionLabel.Text = @"Report Generating Engine Version: 0.5.0.0 Alpha";
reportGeneratingVersionLabel.Text = @"Report Generating Engine Version: " + ReportGenerator.Version;
}
}
}
@@ -99,6 +99,12 @@
<Reference Include="Pechkin, Version=0.5.8.1, Culture=neutral, processorArchitecture=x86">
<HintPath>..\packages\Pechkin.0.5.8.1\lib\net40\Pechkin.dll</HintPath>
</Reference>
<Reference Include="Spire.License, Version=1.3.2.40, Culture=neutral, PublicKeyToken=b1144360237c8b3f, processorArchitecture=MSIL">
<HintPath>..\packages\FreeSpire.PDF.3.2\lib\net40\Spire.License.dll</HintPath>
</Reference>
<Reference Include="Spire.Pdf, Version=3.2.52.56040, Culture=neutral, PublicKeyToken=663f351905198cb3, processorArchitecture=MSIL">
<HintPath>..\packages\FreeSpire.PDF.3.2\lib\net40\Spire.Pdf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
+32 -38
View File
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Web.UI;
using Pechkin;
@@ -10,34 +10,28 @@ namespace AdvertsingProfitControl
{
internal class BackPageGenerator
{
FrmLogConsole _console = FrmLogConsole.GetStaticInstance;
public byte[] RenderHtmlCodeToImage(string path, string targetPath)
/// <summary>
/// Generates the back page of the report, Weekly Inventory Control, as a single PDF file.
/// </summary>
/// <param name="date"></param>
public void GenerateBackPage(DateTime date)
{
var htmlCode = File.ReadAllLines(path);
var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
try
var stringWriter = new StringWriter();
var writer = new HtmlTextWriter(stringWriter);
BuildReportBackPage(date, ref writer);
var backPage = new SimplePechkin(new GlobalConfig().SetPaperOrientation(false).SetPaperSize(PaperKind.A4)).Convert(stringWriter.ToString());
//
using (var fs = new FileStream(GlobalClasses.LogFilePath + "Back.pdf", FileMode.Create, FileAccess.Write))
{
var config = new GlobalConfig().SetPaperSize(PaperKind.A4).SetPaperOrientation(true);
var pdfBuf = new SimplePechkin(config).Convert(code);
using (var fs = new FileStream(targetPath, FileMode.Create, FileAccess.ReadWrite))
{
fs.Write(pdfBuf, 0, pdfBuf.Length);
}
return pdfBuf;
fs.Write(backPage, 0, backPage.Length);
}
catch (Exception e)
{
_console.WriteToLog(FrmLogConsole.Level.Critical,
"Failed to generate an updated image for the back page of Advertising Profit Control.");
_console.WriteToLog(FrmLogConsole.Level.Debug, e.Message);
_console.WriteToLog(FrmLogConsole.Level.Info, "This is most likely a screw you from the GDI+ subsystem of Windows.");
}
return new byte[1];
}
public void BuildReportBackPage(DateTime date, ref HtmlTextWriter writer)
/// <summary>
/// Generates the HTML code for the back page, Weekly Inventory Control.
/// </summary>
/// <param name="date"></param>
/// <param name="writer"></param>
private void BuildReportBackPage(DateTime date, ref HtmlTextWriter writer)
{
var db = new AdvertisingProfitControlModel();
var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
@@ -46,18 +40,18 @@ namespace AdvertsingProfitControl
var taxable = db.Taxables.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
var costAnylsis = db.CostAnalysis.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
//writer.Write("<!DOCTYPE html>\n");
//writer.RenderBeginTag(HtmlTextWriterTag.Html);
//writer.RenderBeginTag(HtmlTextWriterTag.Head);
//writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
//writer.RenderBeginTag(HtmlTextWriterTag.Style);
//writer.Write("td{margins:0px; padding:2px; border:1px solid black; text-align:left; vertical-align:bottom}");
//writer.RenderEndTag();//style
//writer.RenderEndTag();//Head
//writer.RenderBeginTag(HtmlTextWriterTag.Body);
writer.AddAttribute(HtmlTextWriterAttribute.Style, "page-break-inside: avoid; page-break-before:always");
writer.RenderBeginTag(HtmlTextWriterTag.Div);//div
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-collapse: collapse; width:50%; -webkit-transform: rotate(270deg)");
writer.Write("<!DOCTYPE html>\n");
writer.RenderBeginTag(HtmlTextWriterTag.Html);
writer.RenderBeginTag(HtmlTextWriterTag.Head);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
writer.RenderBeginTag(HtmlTextWriterTag.Style);
writer.Write("td{margins:0px; padding:2px; border:1px solid black; text-align:left; vertical-align:bottom; font-size:20px}");
writer.RenderEndTag();//style
writer.RenderEndTag();//Head
writer.RenderBeginTag(HtmlTextWriterTag.Body);
//writer.AddAttribute(HtmlTextWriterAttribute.Style, "page-break-inside: avoid; page-break-before:always");
//writer.RenderBeginTag(HtmlTextWriterTag.Div);//div
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-collapse: collapse; width:100%; height:100%");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
//Create the header as the first row.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
@@ -372,7 +366,7 @@ namespace AdvertsingProfitControl
writer.RenderEndTag();//tr
}
writer.RenderEndTag();//table
writer.RenderEndTag();//div
//writer.RenderEndTag();//div
writer.RenderEndTag();//body
writer.RenderEndTag();//html
}
+11 -11
View File
@@ -45,8 +45,8 @@
this.manageSuppliersToolsMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.adSpecialKeyWordsToolsMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.helpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.showHideConsoleHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.dbVersionHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.showHideConsoleHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.examineLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.debugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.rawViewDebugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
@@ -135,11 +135,11 @@
//
// printPreviewButton
//
this.printPreviewButton.Location = new System.Drawing.Point(16, 273);
this.printPreviewButton.Location = new System.Drawing.Point(180, 271);
this.printPreviewButton.Name = "printPreviewButton";
this.printPreviewButton.Size = new System.Drawing.Size(138, 49);
this.printPreviewButton.Size = new System.Drawing.Size(174, 49);
this.printPreviewButton.TabIndex = 4;
this.printPreviewButton.Text = "Print Preview";
this.printPreviewButton.Text = "Generate Report";
this.printPreviewButton.UseVisualStyleBackColor = true;
this.printPreviewButton.Click += new System.EventHandler(this.DisplayPrintPreview);
//
@@ -272,13 +272,6 @@
this.helpMainMenu.Size = new System.Drawing.Size(68, 34);
this.helpMainMenu.Text = "&Help";
//
// showHideConsoleHelpMainMenu
//
this.showHideConsoleHelpMainMenu.Name = "showHideConsoleHelpMainMenu";
this.showHideConsoleHelpMainMenu.Size = new System.Drawing.Size(288, 34);
this.showHideConsoleHelpMainMenu.Text = "Sh&ow/Hide Console";
this.showHideConsoleHelpMainMenu.Click += new System.EventHandler(this.ShowHideLogConsole);
//
// dbVersionHelpMainMenu
//
this.dbVersionHelpMainMenu.Name = "dbVersionHelpMainMenu";
@@ -286,6 +279,13 @@
this.dbVersionHelpMainMenu.Text = "&Verison Information";
this.dbVersionHelpMainMenu.Click += new System.EventHandler(this.DisplayProductVersionNumbers);
//
// showHideConsoleHelpMainMenu
//
this.showHideConsoleHelpMainMenu.Name = "showHideConsoleHelpMainMenu";
this.showHideConsoleHelpMainMenu.Size = new System.Drawing.Size(288, 34);
this.showHideConsoleHelpMainMenu.Text = "Sh&ow/Hide Console";
this.showHideConsoleHelpMainMenu.Click += new System.EventHandler(this.ShowHideLogConsole);
//
// examineLogsToolStripMenuItem
//
this.examineLogsToolStripMenuItem.Name = "examineLogsToolStripMenuItem";
+7 -52
View File
@@ -327,55 +327,10 @@ namespace AdvertsingProfitControl
private void DisplayPrintPreview(object sender, EventArgs e)
{
//Build and render the front and back forms of the document.
//var test = new FrontPageGenerator();
//var backPageTest = new BackPageGenerator();
//var printTestPage = new PrintDocument();
//var printDialog = new PrintPreviewDialog();
//if (!usePreRenderedFilesCheckbox.Checked)
//{
// //var databaseTracker = new DatabaseTracker();
// //var databaseReader = new DatabaseReader();
// //var dateId =
// // databaseReader.RetrieveDateIdByDateString(monthCalendar.SelectionStart.ToShortDateString(),
// // databaseTracker.DatabaseConnectionString);
// //var remaingingSales = _departmentSales - _salesProducedByAdItems;
// //var totalProfitReturnFromReminaingSales = remaingingSales * .3m;
// //var totalProfitReturn = _totalProfitReturnFromAdItems + totalProfitReturnFromReminaingSales;
// ////test.BuildFormFrontCompressedLayout(dateId, _departmentSales, _salesProducedByAdItems, remaingingSales,
// // //_totalProfitReturnFromAdItems, totalProfitReturnFromReminaingSales, totalProfitReturn,
// // //commentsTextBox.Text);
// //test.RenderHtmlToImage();
// //backPageTest.GenerateWeeklyInventoryControlPage(dateId);
// //backPageTest.RenderHtmlToImage();
//}
//else
//{
// if (File.Exists(Application.StartupPath + "\\" + "FrontPage.html") &&
// File.Exists(Application.StartupPath + "\\" + "Backpage.html"))
// {
// test.RenderHtmlToImage();
// backPageTest.RenderHtmlToImage();
// }
//}
//var margin = new Margins(50, 50, 0, 0);
//printDoc.DefaultPageSettings.Margins = margin;
//printTestPage.PrintPage += PrintPage;
//printDialog.Document = printTestPage;
//printDialog.ShowDialog();
//printDialog.Document = new PrintDocument();
//var dialog = new FolderBrowserDialog();
//dialog.ShowDialog();
//var path = dialog.SelectedPath;
//var pdf = gen.RenderHtmlCodeToImage(path + "\\FrontPage.html", path + "\\Image.pdf");
//var doc = new PrintDocument();
//doc.PrintPage += RenderPage;
//var spam = new PrintPreviewDialog {Document = doc};
//spam.ShowDialog();
//var form = new Test();
//form.ShowDialog();
printPreviewButton.Enabled = false;
var report = new ReportGenerator();
report.GeneratePdfReport(_currentActiveDate);
printPreviewButton.Enabled = true;
}
private void RenderPage(object sender, PrintPageEventArgs e)
@@ -910,6 +865,7 @@ namespace AdvertsingProfitControl
clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = string.Empty;
clearCurrentActiveYearTools.Enabled = true;
clearCurrentActiveYearTools.ToolTipText = string.Empty;
printPreviewButton.Enabled = true;
}
else
{
@@ -920,6 +876,7 @@ namespace AdvertsingProfitControl
clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = @"There is no date to clear.";
clearCurrentActiveYearTools.Enabled = false;
clearCurrentActiveYearTools.ToolTipText = @"There are no records to clear.";
printPreviewButton.Enabled = false;
}
}
@@ -1139,9 +1096,7 @@ namespace AdvertsingProfitControl
private void testToolStripMenuItem_Click(object sender, EventArgs e)
{
var page = new ReportGenerator();
page.GeneratePdfReport(_currentActiveDate);
page.RenderHtmlCodeToImage("C:\\Users\\Crypto\\Desktop\\Full.html", "C:\\Users\\Crypto\\Desktop\\Full.pdf");
MessageBox.Show(@"Nothing to debug here!", @"Debug Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
+30 -8
View File
@@ -10,9 +10,28 @@ namespace AdvertsingProfitControl
{
internal class FrontPageGenerator
{
FrmLogConsole _console = FrmLogConsole.GetStaticInstance;
public void BuildReportFrontPage(DateTime date, ref HtmlTextWriter writer)
/// <summary>
/// Generates the front page of the report, Advertising Profit Control, as a single PDF file.
/// </summary>
/// <param name="date"></param>
public void GenerateFrontPage(DateTime date)
{
var stringWriter = new StringWriter();
var writer = new HtmlTextWriter(stringWriter);
BuildReportFrontPage(date, ref writer);
var frontPage = new SimplePechkin(new GlobalConfig().SetPaperOrientation(true).SetPaperSize(PaperKind.A4)).Convert(stringWriter.ToString());
//
using (var fs = new FileStream(GlobalClasses.LogFilePath + "Front.pdf", FileMode.Create, FileAccess.Write))
{
fs.Write(frontPage, 0, frontPage.Length);
}
}
/// <summary>
/// Generates the HTML code for the front page, Advertising Profit Control.
/// </summary>
/// <param name="date"></param>
/// <param name="writer"></param>
private void BuildReportFrontPage(DateTime date, ref HtmlTextWriter writer)
{
var db = new AdvertisingProfitControlModel();
var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
@@ -27,15 +46,16 @@ namespace AdvertsingProfitControl
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
//Set the global style for the data cells.
writer.RenderBeginTag(HtmlTextWriterTag.Style);
writer.Write("td{margins:0; padding:2px; border:1px solid black; font-size:20px; text-align:center; vertical-align:bottom}");
writer.Write("td{margins:0; padding:2px; border:1px solid black; font-size:14px; text-align:center; vertical-align:bottom}");
writer.RenderEndTag();// end style
writer.RenderEndTag(); // end Head
//writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:11in; height:8in");
writer.RenderBeginTag(HtmlTextWriterTag.Body);
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; width:100%"); //style for the table
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; margin-top:1in; width:100%; height:100%"); //style for the table
writer.RenderBeginTag(HtmlTextWriterTag.Table);
//Begin rendering the top rows, the form name, store, department and date fields.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);//begin first row
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; font-size:40px");
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; font-size:30px");
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "20");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("<b>Advertising Profit Control v" + Application.ProductVersion + "</b>");
@@ -291,6 +311,8 @@ namespace AdvertsingProfitControl
writer.RenderEndTag();//end totals row
//end totals row
writer.RenderEndTag();//table
writer.RenderEndTag();//body
writer.RenderEndTag();//html
}
private void RenderCostsAnalysisCell(CostAnalysisCells cell, ref HtmlTextWriter writer, decimal? value, string rowSpan)
@@ -318,11 +340,11 @@ namespace AdvertsingProfitControl
break;
case CostAnalysisCells.ProfitReturnFromRemainingSales:
number = "5";
labelText = "Total $ Profit Return<br>From Remaining Sales<br><br>Going-in Gross % x Remaining Sales";
labelText = "Total $ Profit Return<br>From Remaining Sales";
break;
case CostAnalysisCells.TotalProfitReturn:
number = "6";
labelText = "Total $ Profit<br>Return<br><br>Line 4 Plus Line 5";
labelText = "Total $ Profit<br>Return<br>Line 4 Plus Line 5";
break;
case CostAnalysisCells.CrossProfitInfoCell:
break;
+43 -28
View File
@@ -1,50 +1,65 @@
using System;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Web.UI;
using Pechkin;
using Spire.Pdf;
namespace AdvertsingProfitControl
{
internal class ReportGenerator
{
public readonly string Version = "1.0.0.0";
public static readonly string Version = "0.5.0.0";
/// <summary>
/// Generates a full report, and places the file on the user's desktop for later viewing.
/// </summary>
/// <param name="date"></param>
public void GeneratePdfReport(DateTime date)
{
var stringWriter = new StringWriter();
var writer = new HtmlTextWriter(stringWriter);
//Check to see if the report already exists.
var reportFileName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + date.ToString("yyyy MMMM dd") + " Report.pdf";
if (File.Exists(reportFileName))
{
var argument = "/select, \"" + reportFileName + "\"";
System.Diagnostics.Process.Start("explorer.exe", argument);
return;
}
var front = new FrontPageGenerator();
var back = new BackPageGenerator();
front.BuildReportFrontPage(date, ref writer);
back.BuildReportBackPage(date, ref writer);
using (var streamWriter = new StreamWriter("C:\\Users\\Crypto\\Desktop\\Full.html"))
{
streamWriter.WriteLine(stringWriter.ToString());
}
front.GenerateFrontPage(date);
back.GenerateBackPage(date);
//Merge the PDFs
GenerateFullReport(reportFileName);
}
public void RenderHtmlCodeToImage(string path, string targetPath)
/// <summary>
/// Merges the front and back PDF files into one and places the new file on the user's desktop.
/// Deletes the front and back pages when done.
/// </summary>
/// <param name="targetPath"></param>
private static void GenerateFullReport(string targetPath)
{
var htmlCode = File.ReadAllLines(path);
var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
try
{
var pechkin = new SimplePechkin(new GlobalConfig().SetMargins(50,0,0,0).SetPaperSize(PaperKind.A4).SetPaperOrientation(true).SetCopyCount(1));
var pdf = pechkin.Convert(new ObjectConfig().SetZoomFactor(1.25), code);
//var config = new GlobalConfig().SetPaperSize(PaperKind.A4).SetPaperOrientation(true);
//var pdfBuf = new SimplePechkin(config).Convert(code);
using (var fs = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
{
fs.Write(pdf, 0, pdf.Length);
}
var pdfdocs = new PdfDocument[2];
pdfdocs[0] = new PdfDocument();
pdfdocs[0].LoadFromFile(GlobalClasses.LogFilePath + "Front.pdf", FileFormat.PDF);
pdfdocs[1] = new PdfDocument();
pdfdocs[1].LoadFromFile(GlobalClasses.LogFilePath + "Back.pdf", FileFormat.PDF);
pdfdocs[0].AppendPage(pdfdocs[1]);
pdfdocs[0].SaveToFile(targetPath);
pdfdocs[0].Close();
pdfdocs[1].Close();
File.Delete(GlobalClasses.LogFilePath + "Front.pdf");
File.Delete(GlobalClasses.LogFilePath + "Back.pdf");
var argument = "/select, \"" + targetPath + "\"";
System.Diagnostics.Process.Start("explorer.exe", argument);
}
finally
catch (IOException e)
{
}
}
finally
{
}
}
}
}
+1
View File
@@ -3,5 +3,6 @@
<package id="Common.Logging" version="3.3.1" targetFramework="net45" />
<package id="Common.Logging.Core" version="3.3.1" targetFramework="net45" />
<package id="EntityFramework" version="6.1.3" targetFramework="net45" />
<package id="FreeSpire.PDF" version="3.2" targetFramework="net45" />
<package id="Pechkin" version="0.5.8.1" targetFramework="net45" />
</packages>
+37 -3
View File
@@ -90,17 +90,51 @@
<Component Id="AppConfig">
<File Name="AdvertsingProfitControl.exe.config" Source="$(var.SolutionDir)\AdvertsingProfitControl\App.config"/>
</Component>
<Component Id="HTMLRender">
<!--<Component Id="HTMLRender">
<File Source="$(var.SolutionDir)\packages\HtmlRenderer.WinForms.1.5.0.6\lib\net45\HtmlRenderer.WinForms.dll"/>
</Component>
<Component Id="HTMLRenderCore">
<File Source="$(var.SolutionDir)\packages\HtmlRenderer.Core.1.5.0.6\lib\net45\HtmlRenderer.dll"/>
</Component>
<Component Id="EntityFrameworkDll">
</Component>-->
<Component Id="EntityFrameworkDll">
<File Source="$(var.SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll"/>
</Component>
<Component Id="EntityFrameworkSqlDll">
<File Source="$(var.SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll"/>
</Component>
<!--PDF generator library files-->
<Component Id="libeay32">
<File Source="$(var.SolutionDir)AdvertsingProfitControl\libeay32.dll"/>
</Component>
<Component Id="libgcc_s_dw2">
<File Source="$(var.SolutionDir)AdvertsingProfitControl\libgcc_s_dw2-1.dll"/>
</Component>
<Component Id="mingwm10">
<File Source="$(var.SolutionDir)AdvertsingProfitControl\mingwm10.dll"/>
</Component>
<Component Id="ssleay32">
<File Source="$(var.SolutionDir)AdvertsingProfitControl\ssleay32.dll"/>
</Component>
<Component Id="wkhtmltox0">
<File Source="$(var.SolutionDir)AdvertsingProfitControl\wkhtmltox0.dll"/>
</Component>
<Component Id="Spire">
<File Source="$(var.SolutionDir)\packages\FreeSpire.PDF.3.2\lib\net40\Spire.License.dll"/>
</Component>
<Component Id="SpirePdf">
<File Source="$(var.SolutionDir)\packages\FreeSpire.PDF.3.2\lib\net40\Spire.Pdf.dll"/>
</Component>
<!--Pechkin-->
<Component Id="Pechkin">
<File Source="$(var.SolutionDir)packages\Pechkin.0.5.8.1\lib\net40\Pechkin.dll"/>
</Component>
<!--Common logging -->
<Component Id="CommonCore">
<File Source="$(var.SolutionDir)\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll"/>
</Component>
<Component Id="Logging">
<File Source="$(var.SolutionDir)\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll"/>
</Component>
</ComponentGroup>
</Fragment>