using System; using System.Collections.Generic; using FastReport.Utils; using System.IO; using System.Drawing; using FastReport.Table; using System.Drawing.Imaging; using System.Windows.Forms; namespace FastReport.Export.PS { /// /// Represents the ps export filter. /// public partial class PSExport : ExportBase { #region Private Fields private string path; private string fileNameWOext; private string extension; private string pageFileName; private int quality; private int currentPage; private int img_nbr; private bool pictures; private bool textInCurves; private bool pagesInDiffFiles; private bool saveImagesSeparately; private float pageLeftMargin; private float pageTopMargin; private Dictionary hashtable; private ImageFormat format; private Dictionary images; private Dictionary imageVariablesNames; private PSDocument ps; #endregion #region Properties /// /// Enable or disable the pictures in PS export /// public bool Pictures { get { return pictures; } set { pictures = value; } } /// /// Enable or disable export text in curves /// public bool TextInCurves { get { return textInCurves; } set { textInCurves = value; } } /// /// Enable or disable export every page in separate file /// public bool PagesInDiffFiles { get { return pagesInDiffFiles; } set { pagesInDiffFiles = value; } } /// /// Enable or disable saving every image in separate file /// public bool SaveImagesSeparately { get { return saveImagesSeparately; } set { saveImagesSeparately = value; } } /// /// Gets or sets quality of JPEG images /// public int Quality { get { return quality; } set { quality = value; } } #endregion #region Private Methods private void ExportObj(Base c) { if (c is ReportComponentBase && (c as ReportComponentBase).Exportable) { ReportComponentBase obj = c as ReportComponentBase; if (obj is CellularTextObject) obj = (obj as CellularTextObject).GetTable(); else if (obj is TableBase) { TableBase table = obj as TableBase; if (table.ColumnCount > 0 && table.RowCount > 0) { using (TextObject tableback = new TextObject()) { tableback.Border = table.Border; tableback.Fill = table.Fill; tableback.FillColor = table.FillColor; tableback.Left = table.AbsLeft; tableback.Top = table.AbsTop; float tableWidth = 0; float tableHeight = 0; for (int i = 0; i < table.ColumnCount; i++) tableWidth += table[i, 0].Width; for (int i = 0; i < table.RowCount; i++) tableHeight += table.Rows[i].Height; tableback.Width = (tableWidth < table.Width) ? tableWidth : table.Width; tableback.Height = tableHeight; AddTextObject(ps, tableback as TextObject, false); // draw cells AddTable(ps, table, true); // draw cells border AddTable(ps, table, false); // draw table border AddBorder(ps, tableback.Border, tableback.AbsLeft, tableback.AbsTop, tableback.Width, tableback.Height); } } } else if (obj is TextObject) AddTextObject(ps, obj as TextObject, false); else if (obj is BandBase) AddBandObject(ps, obj as BandBase); else if (obj is LineObject) AddLine(ps, obj as LineObject); else if (obj is ShapeObject) AddShape(ps, obj as ShapeObject); else if (saveImagesSeparately) AddPictureObject(ps, obj); else AddHexImage(ps, obj); } } private void AddHexImage(PSDocument ps, ReportComponentBase obj) { if (obj.Height <= 0 || obj.Width <= 0) return; byte[] imageBytes; string hex; using (MemoryStream imageStream = new MemoryStream()) { using (System.Drawing.Image image = new Bitmap((int)obj.Width, (int)obj.Height)) { using (Graphics g = Graphics.FromImage(image)) { using (GraphicCache cache = new GraphicCache()) { g.Clear(Color.White); float Left = obj.Width >= 0 ? obj.AbsLeft : obj.AbsLeft + obj.Width; float Top = obj.Height >= 0 ? obj.AbsTop : obj.AbsTop + obj.Height; g.TranslateTransform(-Left, -Top); obj.Draw(new FRPaintEventArgs(g, 1, 1, cache)); } } int[] rawBitmap = GetRawBitmap((Bitmap)image); string hash = CalculateHash(rawBitmap); if (!hashtable.ContainsKey(hash)) { ExportUtils.SaveJpeg(image, imageStream, quality); imageBytes = imageStream.ToArray(); hashtable.Add(hash, ByteArrayToHexString(imageBytes)); hex = hashtable[hash] as string; imageVariablesNames.Add(hash, "PIC" + img_nbr); ps.DeclareImage(imageVariablesNames[hash], hex); } ps.AddImage(imageVariablesNames[hash], (obj.AbsLeft + pageLeftMargin) * 0.75f, (obj.AbsTop + pageTopMargin) * 0.75f, obj.Width, obj.Height); } } img_nbr++; } private string CalculateHash(int[] raw_picture) { byte[] raw_picture_byte = new byte[raw_picture.Length * sizeof(int)]; Buffer.BlockCopy(raw_picture, 0, raw_picture_byte, 0, raw_picture_byte.Length); byte[] hash = new Murmur3().ComputeHash(raw_picture_byte); return Convert.ToBase64String(hash); } private int[] GetRawBitmap(Bitmap image) { int raw_size = image.Width * image.Height; int[] raw_picture = new int[raw_size]; BitmapData bmpdata = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, image.PixelFormat); IntPtr ptr = bmpdata.Scan0; System.Runtime.InteropServices.Marshal.Copy(ptr, raw_picture, 0, raw_size); image.UnlockBits(bmpdata); return raw_picture; } internal static string ByteArrayToHexString(byte[] byteArray) { System.Text.StringBuilder hex = new System.Text.StringBuilder(byteArray.Length * 2); foreach (byte b in byteArray) hex.AppendFormat("{0:x2}", b); return hex.ToString(); } private void AddBitmapWatermark(ReportPage page) { if (page.Watermark.Image != null) { using (PictureObject pictureWatermark = new PictureObject()) { pictureWatermark.Left = page.LeftMargin; pictureWatermark.Top = page.TopMargin; pictureWatermark.Width = ExportUtils.GetPageWidth(page) * Units.Millimeters; pictureWatermark.Height = ExportUtils.GetPageHeight(page) * Units.Millimeters; pictureWatermark.SizeMode = PictureBoxSizeMode.Normal; pictureWatermark.Image = new Bitmap((int)pictureWatermark.Width, (int)pictureWatermark.Height); using (Graphics g = Graphics.FromImage(pictureWatermark.Image)) { g.Clear(Color.Transparent); page.Watermark.DrawImage(new FRPaintEventArgs(g, 1, 1, Report.GraphicCache), new RectangleF(0, 0, pictureWatermark.Width, pictureWatermark.Height), Report, true); } pictureWatermark.Transparency = page.Watermark.ImageTransparency; pictureWatermark.Fill = new SolidFill(Color.Transparent); pictureWatermark.FillColor = Color.Transparent; AddPictureObject(ps, pictureWatermark); } } } private void AddTextWatermark(ReportPage page) { if (!String.IsNullOrEmpty(page.Watermark.Text)) using (TextObject textWatermark = new TextObject()) { textWatermark.HorzAlign = HorzAlign.Center; textWatermark.VertAlign = VertAlign.Center; textWatermark.Left = page.LeftMargin; textWatermark.Top = page.TopMargin; textWatermark.Width = ExportUtils.GetPageWidth(page) * Units.Millimeters; textWatermark.Height = ExportUtils.GetPageHeight(page) * Units.Millimeters; textWatermark.Text = page.Watermark.Text; textWatermark.TextFill = page.Watermark.TextFill; if (page.Watermark.TextRotation == WatermarkTextRotation.Vertical) textWatermark.Angle = 270; else if (page.Watermark.TextRotation == WatermarkTextRotation.ForwardDiagonal) textWatermark.Angle = 360 - (int)(Math.Atan(textWatermark.Height / textWatermark.Width) * (180 / Math.PI)); else if (page.Watermark.TextRotation == WatermarkTextRotation.BackwardDiagonal) textWatermark.Angle = (int)(Math.Atan(textWatermark.Height / textWatermark.Width) * (180 / Math.PI)); textWatermark.Font = page.Watermark.Font; if (page.Watermark.TextFill is SolidFill) textWatermark.TextColor = (page.Watermark.TextFill as SolidFill).Color; textWatermark.Fill = new SolidFill(Color.Transparent); textWatermark.FillColor = Color.Transparent; AddTextObject(ps, textWatermark, false, true); } } private void SaveImgsToFiles() { foreach (KeyValuePair fl_nm_e in hashtable) { foreach (KeyValuePair img_e in images) { if (fl_nm_e.Key == img_e.Key) { string fullImagePath = Path.Combine(path, fl_nm_e.Value) + "." + format.ToString().ToLower(); using (FileStream file = new FileStream(fullImagePath, FileMode.Create)) img_e.Value.WriteTo(file); } } } } private void AddTable(PSDocument ps, TableBase table, bool drawCells) { float y = 0; for (int i = 0; i < table.RowCount; i++) { float x = 0; for (int j = 0; j < table.ColumnCount; j++) { if (!table.IsInsideSpan(table[j, i])) { TableCell textcell = table[j, i]; textcell.Left = x; textcell.Top = y; if (drawCells) { Border oldBorder = textcell.Border.Clone(); textcell.Border.Lines = BorderLines.None; if ((textcell as TextObject) is TextObject) AddTextObject(ps, textcell as TextObject, false); else AddPictureObject(ps, textcell as ReportComponentBase); textcell.Border = oldBorder; } else AddBorder(ps, textcell.Border, textcell.AbsLeft, textcell.AbsTop, textcell.Width, textcell.Height); } x += (table.Columns[j]).Width; } y += (table.Rows[i]).Height; } } private void AddPictureObject(PSDocument ps, ReportComponentBase obj) { int[] rawBitmap; string hash; if (pictures) { MemoryStream imageStream = new MemoryStream(); using (System.Drawing.Image image = new Bitmap((int)obj.Width, (int)obj.Height)) { using (Graphics g = Graphics.FromImage(image)) { using (GraphicCache cache = new GraphicCache()) { g.Clear(Color.White); float Left = obj.Width >= 0 ? obj.AbsLeft : obj.AbsLeft + obj.Width; float Top = obj.Height >= 0 ? obj.AbsTop : obj.AbsTop + obj.Height; g.TranslateTransform(-Left, -Top); obj.Draw(new FRPaintEventArgs(g, 1, 1, cache)); } } ExportUtils.SaveJpeg(image, imageStream, quality); rawBitmap = GetRawBitmap((Bitmap)image); hash = CalculateHash(rawBitmap); } imageStream.Position = 0; string imageFileName = fileNameWOext.Replace(" ", "") + hashtable.Count.ToString(); if (!hashtable.ContainsKey(hash)) { hashtable.Add(hash, imageFileName); if (path != null && path != "") GeneratedFiles.Add(imageFileName); images.Add(hash, imageStream); } else imageFileName = hashtable[hash] as string; // add image ps.AddImage(imageFileName, format.ToString().ToLower(), (obj.AbsLeft + pageLeftMargin) * 0.75f, (obj.AbsTop + pageTopMargin) * 0.75f, obj.Width, obj.Height); img_nbr++; } } private void AddBorder(PSDocument ps, Border border, float Left, float Top, float Width, float Height) { if (border.Lines != BorderLines.None) { using (TextObject emptyText = new TextObject()) { emptyText.Left = Left; emptyText.Top = Top; emptyText.Width = Width; emptyText.Height = Height; emptyText.Border = border; emptyText.Text = String.Empty; emptyText.FillColor = Color.Transparent; AddTextObject(ps, emptyText, true); } } } /// /// Add TextObject. /// private void AddTextObject(PSDocument ps, TextObject text, bool Band, bool isWatermark = false) { Font font = text.Font; float AbsLeft = text.AbsLeft + pageLeftMargin; float AbsTop = text.AbsTop + pageTopMargin; float Width = text.Width; float Height = text.Height; string HorzAlign = Convert.ToString(text.HorzAlign); string VertAlign = Convert.ToString(text.VertAlign); float BorderWidth = text.Border.Width; string BorderLines = Convert.ToString(text.Border.Lines); string Text = text.Text; float FontSize = text.Font.Size; string FontName = Convert.ToString(text.Font.Name); bool Bold = text.Font.Bold; bool Italic = text.Font.Italic; bool Underline = text.Font.Underline; float PaddingLeft = text.Padding.Left; float PaddingTop = text.Padding.Top; float PaddingRight = text.Padding.Right; float PaddingBottom = text.Padding.Bottom; bool WordWrap = text.WordWrap; string BorderBrush; string Background; string Foreground; float Angle = text.Angle; float LeftLine = text.Border.LeftLine.Width; float TopLine = text.Border.TopLine.Width; float RightLine = text.Border.RightLine.Width; float BottomLine = text.Border.BottomLine.Width; //Dash------------------------------------------------ string LeftLineDashStile = Convert.ToString(text.Border.LeftLine.Style); string TopLineDashStile = Convert.ToString(text.Border.TopLine.Style); string RightLineDashStile = Convert.ToString(text.Border.RightLine.Style); string BottomLineDashStile = Convert.ToString(text.Border.BottomLine.Style); string colorLeftLine = ExportUtils.HTMLColor(text.Border.LeftLine.Color); string colorTopLine = ExportUtils.HTMLColor(text.Border.TopLine.Color); string colorRightLine = ExportUtils.HTMLColor(text.Border.RightLine.Color); string colorBottomLine = ExportUtils.HTMLColor(text.Border.BottomLine.Color); //GlassFill bool Glass = false; string colorTop = null; if (text.Fill is GlassFill) { Glass = true; Color color = GetBlendColor((text.Fill as GlassFill).Color, (text.Fill as GlassFill).Blend); colorTop = ExportUtils.HTMLColor(color); } NormalizeBorderBrushColor(text, out BorderBrush); NormalizeForegroundColor(text, out Foreground); NormalizeBackgroundColor(text, out Background); //Shadow---- float ShadowWidth = text.Border.ShadowWidth; string ShadowColor = ExportUtils.HTMLColor(text.Border.ShadowColor); if (Band) { HorzAlign = null; VertAlign = null; Text = null; FontSize = 0; Foreground = null; FontName = null; Bold = false; Italic = false; Underline = false; PaddingLeft = 0; PaddingTop = 0; PaddingRight = 0; PaddingBottom = 0; WordWrap = false; } { ps.AddTextObject(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, HorzAlign, VertAlign, BorderBrush, BorderWidth * 0.75f, LeftLine * 0.75f, TopLine * 0.75f, RightLine * 0.75f, BottomLine * 0.75f, LeftLineDashStile, TopLineDashStile, RightLineDashStile, BottomLineDashStile, colorLeftLine, colorTopLine, colorRightLine, colorBottomLine, text.Border.Shadow, ShadowColor, ShadowWidth * 0.75f, Background, BorderLines, Text, Foreground, PaddingLeft * 0.75f, PaddingTop * 0.75f, PaddingRight * 0.75f, PaddingBottom * 0.75f, WordWrap, Angle, Glass, colorTop, font, isWatermark); } } /// /// Add BandObject. /// private void AddBandObject(PSDocument ps, BandBase band) { using (TextObject newObj = new TextObject()) { newObj.Left = band.AbsLeft; newObj.Top = band.AbsTop; newObj.Width = band.Width; newObj.Height = band.Height; newObj.Fill = band.Fill; newObj.Border = band.Border; AddTextObject(ps, newObj, true); } } /// /// Add Line. /// private void AddLine(PSDocument ps, LineObject line) { float AbsLeft = line.AbsLeft + pageLeftMargin; float AbsTop = line.AbsTop + pageTopMargin; float Width = line.Width; float Height = line.Height; string Fill = Convert.ToString(ExportUtils.GetColorFromFill(line.Fill)); float Border = line.Border.Width; string LineStyle = line.Style; string BorderBrush = ExportUtils.HTMLColor(line.Border.Color); if (line.StartCap.Style == CapStyle.Arrow) { float x3, y3, x4, y4; DrawArrow(line.StartCap, Border, Width + AbsLeft, Height + AbsTop, AbsLeft, AbsTop, out x3, out y3, out x4, out y4); ps.AddLine(AbsLeft * 0.75f, AbsTop * 0.75f, x3 * 0.75f, y3 * 0.75f, BorderBrush, Border * 0.75f); ps.AddLine(AbsLeft * 0.75f, AbsTop * 0.75f, x4 * 0.75f, y4 * 0.75f, BorderBrush, Border * 0.75f); } if (line.EndCap.Style == CapStyle.Arrow) { float x3, y3, x4, y4; DrawArrow(line.EndCap, Border, AbsLeft, AbsTop, Width + AbsLeft, Height + AbsTop, out x3, out y3, out x4, out y4); ps.AddLine((Width + AbsLeft) * 0.75f, (AbsTop + Height) * 0.75f, x3 * 0.75f, y3 * 0.75f, BorderBrush, Border * 0.75f); ps.AddLine((Width + AbsLeft) * 0.75f, (AbsTop + Height) * 0.75f, x4 * 0.75f, y4 * 0.75f, BorderBrush, Border * 0.75f); } ps.AddLine(AbsLeft * 0.75f, AbsTop * 0.75f, (AbsLeft + Width) * 0.75f, (AbsTop + Height) * 0.75f, BorderBrush, Border * 0.75f); } private void DrawArrow(CapSettings Arrow, float lineWidth, float x1, float y1, float x2, float y2, out float x3, out float y3, out float x4, out float y4) { float k1, a, b, c, d; float xp, yp; float wd = Arrow.Width * lineWidth; float ld = Arrow.Height * lineWidth; if (Math.Abs(x2 - x1) > 0) { k1 = (y2 - y1) / (x2 - x1); a = (float)(Math.Pow(k1, 2) + 1); b = 2 * (k1 * ((x2 * y1 - x1 * y2) / (x2 - x1) - y2) - x2); c = (float)(Math.Pow(x2, 2) + Math.Pow(y2, 2) - Math.Pow(ld, 2) + Math.Pow((x2 * y1 - x1 * y2) / (x2 - x1), 2) - 2 * y2 * (x2 * y1 - x1 * y2) / (x2 - x1)); d = (float)(Math.Pow(b, 2) - 4 * a * c); xp = (float)((-b + Math.Sqrt(d)) / (2 * a)); if ((xp > x1) && (xp > x2) || (xp < x1) && (xp < x2)) xp = (float)((-b - Math.Sqrt(d)) / (2 * a)); yp = xp * k1 + (x2 * y1 - x1 * y2) / (x2 - x1); if (y2 != y1) { x3 = (float)(xp + wd * Math.Sin(Math.Atan(k1))); y3 = (float)(yp - wd * Math.Cos(Math.Atan(k1))); x4 = (float)(xp - wd * Math.Sin(Math.Atan(k1))); y4 = (float)(yp + wd * Math.Cos(Math.Atan(k1))); } else { x3 = xp; y3 = yp - wd; x4 = xp; y4 = yp + wd; } } else { xp = x2; yp = y2 - ld; if ((yp > y1) && (yp > y2) || (yp < y1) && (yp < y2)) yp = y2 + ld; x3 = xp - wd; y3 = yp; x4 = xp + wd; y4 = yp; } } /// /// Add Shape. /// private void AddShape(PSDocument ps, ShapeObject shape) { float AbsLeft = shape.AbsLeft + pageLeftMargin; float AbsTop = shape.AbsTop + pageTopMargin; float Width = shape.Width; float Height = shape.Height; float BorderWidth = shape.Border.Width; string BorderLines = Convert.ToString(shape.Border.Lines); string BorderBrush; string Background; NormalizeColor(shape, out BorderBrush, out Background); if (shape.Shape == ShapeKind.Rectangle) ps.AddRectangle(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, BorderBrush, BorderWidth * 0.75f, Background, false); if (shape.Shape == ShapeKind.RoundRectangle) ps.AddRectangle(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, BorderBrush, BorderWidth * 0.75f, Background, true); if (shape.Shape == ShapeKind.Ellipse) ps.AddEllipse(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, BorderBrush, BorderWidth * 0.75f, Background); if (shape.Shape == ShapeKind.Triangle) ps.AddTriangle(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, BorderBrush, BorderWidth * 0.75f, Background); if (shape.Shape == ShapeKind.Diamond) ps.AddDiamond(AbsLeft * 0.75f, AbsTop * 0.75f, Width * 0.75f, Height * 0.75f, BorderBrush, BorderWidth * 0.75f, Background); } private Color GetBlendColor(Color c, float Blend) { return Color.FromArgb(255, (int)Math.Round(c.R + (255 - c.R) * Blend), (int)Math.Round(c.G + (255 - c.G) * Blend), (int)Math.Round(c.B + (255 - c.B) * Blend)); } private void NormalizeBorderBrushColor(TextObject obj, out string BorderBrush) { obj.FillColor = ExportUtils.GetColorFromFill(obj.Fill); BorderBrush = ExportUtils.HTMLColor(obj.Border.Color); } private void NormalizeBackgroundColor(TextObject obj, out string Background) { obj.FillColor = ExportUtils.GetColorFromFill(obj.Fill); if (obj.FillColor.Name == "Transparent") { Background = "none"; } else Background = ExportUtils.HTMLColor(obj.FillColor); } private void NormalizeForegroundColor(TextObject obj, out string Foreground) { obj.FillColor = ExportUtils.GetColorFromFill(obj.Fill); Foreground = ExportUtils.HTMLColor(obj.TextColor); } private void NormalizeColor(ShapeObject obj, out string BorderBrush, out string Background) { obj.FillColor = ExportUtils.GetColorFromFill(obj.Fill); BorderBrush = ExportUtils.HTMLColor(obj.Border.Color); if (obj.FillColor.Name == "Transparent") { Background = "none"; } else Background = ExportUtils.HTMLColor(obj.FillColor); } #endregion #region Protected Methods /// protected override void Start() { //init hashtable = new Dictionary(); img_nbr = 0; images = new Dictionary(); imageVariablesNames = new Dictionary(); if (!pagesInDiffFiles) { ps = new PSDocument(); ps.TextInCurves = textInCurves; } currentPage = 0; if (FileName != "" && FileName != null) { path = Path.GetDirectoryName(FileName); fileNameWOext = Path.GetFileNameWithoutExtension(FileName); extension = Path.GetExtension(FileName); } else fileNameWOext = "xamlreport"; GeneratedFiles.Clear(); hashtable.Clear(); } /// /// Begin exporting of page /// /// protected override void ExportPageBegin(ReportPage page) { base.ExportPageBegin(page); if (pagesInDiffFiles) { ps = new PSDocument(ExportUtils.GetPageWidth(page) * Units.Millimeters * 0.75f, ExportUtils.GetPageHeight(page) * Units.Millimeters * 0.75f); ps.TextInCurves = textInCurves; } else ps.CreateWindow(); pageLeftMargin = page.LeftMargin * Units.Millimeters; pageTopMargin = page.TopMargin * Units.Millimeters; // bitmap watermark on bottom if (page.Watermark.Enabled && !page.Watermark.ShowImageOnTop) AddBitmapWatermark(page); // text watermark on bottom if (page.Watermark.Enabled && !page.Watermark.ShowTextOnTop) AddTextWatermark(page); // page borders if (page.Border.Lines != BorderLines.None) { using (TextObject pageBorder = new TextObject()) { pageBorder.Border = page.Border; pageBorder.Left = 0; pageBorder.Top = 0; pageBorder.Width = (ExportUtils.GetPageWidth(page) - page.LeftMargin - page.RightMargin); pageBorder.Height = (ExportUtils.GetPageHeight(page) - page.TopMargin - page.BottomMargin); AddTextObject(ps, pageBorder, true); } } if (path != null && path != "") pageFileName = Path.Combine(path, fileNameWOext + currentPage.ToString() + extension); else pageFileName = null; } /// /// Export of Band /// /// protected override void ExportBand(BandBase band) { base.ExportBand(band); ExportObj(band); foreach (Base c in band.ForEachAllConvectedObjects(this)) { ExportObj(c); } } /// /// End exporting /// /// protected override void ExportPageEnd(ReportPage page) { base.ExportPageEnd(page); // bitmap watermark on top if (page.Watermark.Enabled && page.Watermark.ShowImageOnTop) AddBitmapWatermark(page); // text watermark on top if (page.Watermark.Enabled && page.Watermark.ShowTextOnTop) AddTextWatermark(page); ps.Finish(); if (PagesInDiffFiles) { if (Directory.Exists(path) && !string.IsNullOrEmpty(FileName)) { // desktop mode if (currentPage == 0) { // save first page in parent Stream ps.Save(Stream); Stream.Position = 0; GeneratedFiles.Add(FileName); } else { // save all page after first in files ps.Save(pageFileName); GeneratedFiles.Add(pageFileName); } } else if (string.IsNullOrEmpty(path)) { if (currentPage == 0) { // save first page in parent Stream ps.Save(Stream); Stream.Position = 0; GeneratedFiles.Add(FileName); } else { // server mode, save in internal stream collection using (MemoryStream pageStream = new MemoryStream()) { ps.Save(pageStream); pageStream.Position = 0; GeneratedFiles.Add(pageFileName); } } } } // increment page number currentPage++; } /// protected override void Finish() { if (Directory.Exists(path) && !string.IsNullOrEmpty(FileName) && SaveImagesSeparately) SaveImgsToFiles(); if (!pagesInDiffFiles) ps.Save(Stream); ps = null; } /// protected override string GetFileFilter() { return new MyRes("FileFilters").Get("PSFile"); } #endregion /// public override void Serialize(FRWriter writer) { base.Serialize(writer); writer.WriteBool("TextInCurves", TextInCurves); writer.WriteBool("PagesInDiffFiles", PagesInDiffFiles); writer.WriteBool("SaveImagesSeparately", SaveImagesSeparately); writer.WriteInt("JpegQuality", quality); } /// /// Initializes a new instance of the class. /// public PSExport() { saveImagesSeparately = false; HasMultipleFiles = true; PagesInDiffFiles = false; pictures = true; quality = 100; format = System.Drawing.Imaging.ImageFormat.Jpeg; } } }