/// <summary> /// Generates the pdf document containing the specified stickers. No specs of the sheet are /// provided with the system. It should be a good idea. /// </summary> /// <param name="pdfPath">The full path to the pdf folder.</param> /// <param name="numberOfStickersLeftInSheet">The number of stickers left on the sheet used.</param> /// <param name="stickers">The stickers to layout in the document.</param> /// <returns></returns> public static string GeneratePreview( string pdfPath, int numberOfStickersLeftInSheet, IEnumerable <StickerInfo> stickers) { var numberOfBlanks = MAX_NUMBER_OF_STICKERS_PER_SHEET - numberOfStickersLeftInSheet; var numberOfStickersLeft = stickers.Count(); var document = new PdfDocument(); var page = document.AddPage(); var gtx = XGraphics.FromPdfPage(page); var nbFormatInfo = new CultureInfo("fr-CA", false).NumberFormat; var firstLeftRect = new XRect( XUnit.FromCentimeter(0), XUnit.FromCentimeter(1.9), XUnit.FromCentimeter(10.2), XUnit.FromCentimeter(3.4) ); page.Size = PdfSharp.PageSize.Letter; page.TrimMargins = new TrimMargins() { Left = XUnit.FromMillimeter(4), Top = XUnit.FromCentimeter(2) + XUnit.FromMillimeter(1), Right = XUnit.FromMillimeter(4), Bottom = XUnit.FromCentimeter(2) + XUnit.FromMillimeter(1) }; // O(n^2) for (int currentColumn = 0; currentColumn < NUMBER_OF_COLUMNS && numberOfStickersLeft > 0; currentColumn++) { var currentXPos = currentColumn * (firstLeftRect.Width + XUnit.FromMillimeter(9)); for (int position = 0; position < MAX_NUMBER_OF_STICKERS_PER_COLUMN && numberOfStickersLeft > 0; position++) { if (numberOfBlanks == 0) { var sticker = stickers.ElementAt(stickers.Count() - numberOfStickersLeft); var LivrETSID = $"{sticker.FairLivrETSID}-{sticker.UserLivrETSID}-{sticker.ArticleLivrETSID}"; var barcode = GenerateLivrETSBarCode(LivrETSID); var padding = XUnit.FromMillimeter(2); var currentYPos = (firstLeftRect.Height + XUnit.FromMillimeter(2.5)) * position; var currentRect = new XRect( currentXPos, currentYPos, firstLeftRect.Width, firstLeftRect.Height ); var fairTextRect = new XRect( currentRect.Left + padding, currentRect.Top + padding, currentRect.Width / 2, XUnit.FromMillimeter(5) ); var livretsIdRect = new XRect( currentRect.Left, currentRect.Bottom - XUnit.FromMillimeter(4), currentRect.Width, XUnit.FromMillimeter(4) ); var barCodeRect = new XRect( currentRect.Left + padding, livretsIdRect.Top - XUnit.FromMillimeter(6.2), currentRect.Width - 2 * padding, XUnit.FromMillimeter(6) ); var priceRect = new XRect( fairTextRect.Right, currentRect.Top + padding, currentRect.Width / 2, fairTextRect.Height ); var titleRect = new XRect( currentRect.Left + padding, fairTextRect.Bottom, currentRect.Width - 2 * padding, barCodeRect.Top - fairTextRect.Bottom ); gtx.DrawString( $"Foire {sticker.FairLivrETSID}", new XFont("Arial", 8, XFontStyle.Regular), XBrushes.Black, fairTextRect, XStringFormats.TopLeft ); gtx.DrawString( sticker.OfferPrice.ToString("C", nbFormatInfo), new XFont("Arial", 12, XFontStyle.Regular), XBrushes.Black, priceRect, XStringFormats.TopLeft ); gtx.DrawString( sticker.ArticleTitle, new XFont("Arial", 10, XFontStyle.Regular), XBrushes.Black, titleRect, XStringFormats.TopLeft ); gtx.DrawImage( XImage.FromGdiPlusImage(barcode), barCodeRect ); gtx.DrawString( LivrETSID, new XFont("Arial", 9, XFontStyle.Regular), XBrushes.Black, livretsIdRect, XStringFormats.TopCenter ); numberOfStickersLeft--; } else { numberOfBlanks--; } } } return(FileSystemFacade.SaveStickersDocument(document, pdfPath)); }