Страница 1 из 1

Отправка на печать одним заданием

Добавлено: 04 окт 2016, 12:14
DmitriyKV
Доброго времени суток!
Помогите, пожалуйста с проблемой:
есть несколько готовых отчётов в массиве. Необходимо отправить их на принтер одним заданием, чтобы никто не успел отправить на принтер свои документы. Заранее спасибо.

Сейчас отправляю на печать так:

Код: Выделить всё

System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
ps.PrinterName = Package.GetPrinter_name();
ps.Copies = 1; 
ps.Collate = true;

foreach (Stimulsoft.Report.StiReport rep in reps)
{
    rep.Print(false, ps);
}

Re: Отправка на печать одним заданием

Добавлено: 05 окт 2016, 09:49
HighAley
Здравствуйте.

Вы можете объединить коллекции отрендеренных страниц (rep.RenderedPages) в один отчёт и потом послать его на печать.

Код: Выделить всё

foreach (StiPage page in rep.RenderedPages)
{
	page.Report = joinedRep;
	page.NewGuid();
	joinedRep.RenderedPages.Add(page);
}
Если единицы измерения отчётов отличаются, то надо их приводить к одному.

Спасибо.

Re: Отправка на печать одним заданием

Добавлено: 05 окт 2016, 12:36
DmitriyKV
Спасибо огромное за ответ. Теперь знаю в какую сторону копать.

Re: Отправка на печать одним заданием

Добавлено: 06 окт 2016, 11:13
HighAley
Здравствуйте, Дмитрий.

Мы всегда рады вам помочь.
Обращайтесь, если ещё нужна будет помощь.

Спасибо.

Re: Отправка на печать одним заданием

Добавлено: 13 окт 2016, 13:47
DmitriyKV
Доброго времени суток!
Помогите победить проблему: не меняется расположение компонентов в отчёте при определённых условиях.

Создаю "объединённый" отчёт из нескольких отчётов приведённым выше способом.
Т.к. отчёты могут быть разной ориентации, то я поворачиваю чётные страницы ландшафтной ориентации на 180 градусов, чтобы правильно печаталось на принтере с дуплексом.

Код: Выделить всё

foreach (StiPage page in report.RenderedPages)
            {
                pageNumber++;
                // We need only EVEN and Landscape pages only!!!
                if ((page.Orientation != StiPageOrientation.Landscape) || (pageNumber % 2 == 1))
                {
                    continue;
                }
                report.RenderedPages.GetPage(page);
                double pageWidth = page.Width;
                double pageHeight = page.Height;

                page.DisplayRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, page.DisplayRectangle.Height, page.DisplayRectangle.Width);
                System.Collections.Hashtable newComps = new System.Collections.Hashtable();

                foreach (StiComponent comp in page.Components)
                {
                    compCount++;
                    Stimulsoft.Base.Drawing.RectangleD compRect = comp.DisplayRectangle;
                    Stimulsoft.Base.Drawing.RectangleD newRect;
                   
                    newRect = new Stimulsoft.Base.Drawing.RectangleD(
                        pageWidth - compRect.Right,         
                        pageHeight - compRect.Bottom,       
                        compRect.Width,
                        compRect.Height
                        );

                    comp.DisplayRectangle = newRect;

                    IStiEnumAngle angleComp = comp as IStiEnumAngle;
                    if (angleComp != null)
                    {
                        StiAngle angle = angleComp.Angle;
                        angle = StiAngle.Angle180;
                        angleComp.Angle = angle;
                    }

                    StiText stiText = comp as StiText;
                    if (stiText != null)
                    {
                        stiText.Angle = 180;
                    }

                    StiImage image = comp as StiImage;
                    if (image != null)
                    {
                        image.ImageRotation = StiImageRotation.Rotate180;
                    }

                    IStiBorder border = comp as IStiBorder;
                    if (border != null)
                    {
                        if (border.Border is Stimulsoft.Base.Drawing.StiAdvancedBorder)
                        {
                            Stimulsoft.Base.Drawing.StiAdvancedBorder advBorder = border.Border as Stimulsoft.Base.Drawing.StiAdvancedBorder;
                            Stimulsoft.Base.Drawing.StiAdvancedBorder newBorder = new Stimulsoft.Base.Drawing.StiAdvancedBorder(
                                new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.BottomSide.Color, advBorder.BottomSide.Size, advBorder.BottomSide.Style),
                                new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.TopSide.Color, advBorder.TopSide.Size, advBorder.TopSide.Style),
                                new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.RightSide.Color, advBorder.RightSide.Size, advBorder.RightSide.Style),
                                new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.LeftSide.Color, advBorder.LeftSide.Size, advBorder.LeftSide.Style),
                                advBorder.DropShadow,
                                advBorder.ShadowSize,
                                advBorder.ShadowBrush);
                            border.Border = newBorder;
                        }
                        else
                        {
                            Stimulsoft.Base.Drawing.StiBorder oldBorder = border.Border;
                            Stimulsoft.Base.Drawing.StiBorder newBorder = (Stimulsoft.Base.Drawing.StiBorder)oldBorder.Clone();
                            newBorder.Side = Stimulsoft.Base.Drawing.StiBorderSides.None;
                            if (oldBorder.IsTopBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Bottom;
                            if (oldBorder.IsBottomBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Top;
                            if (oldBorder.IsRightBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Left;
                            if (oldBorder.IsLeftBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Right;
                            border.Border = newBorder;
                        }
                    }
                    if (comp is StiVerticalLinePrimitive)
                    {
                        StiHorizontalLinePrimitive horLine = new StiHorizontalLinePrimitive();
                        horLine.Parent = comp.Parent;
                        horLine.DisplayRectangle = newRect;
                        newComps[comp] = horLine;
                    }
                    if (comp is StiHorizontalLinePrimitive)
                    {
                        StiVerticalLinePrimitive vertLine = new StiVerticalLinePrimitive();
                        vertLine.Parent = comp.Parent;
                        vertLine.DisplayRectangle = newRect;
                        newComps[comp] = vertLine;
                    }
                }
                if (newComps.Count > 0)
                {
                    foreach (System.Collections.DictionaryEntry de in newComps)
                    {
                        int compIndex = page.Components.IndexOf((StiComponent)de.Key);
                        page.Components[compIndex] = (StiComponent)de.Value;
                    }
                }
            }
Всё работает хорошо, пока не попалось так, что один и тот же отчёт не попал дважды в объединённый отчёт. В этом случае компоненты оказываются перевёрнутыми правильно, но расположение не переворачивается.
Т.е. как бы DisplayRectangle у компонентов не меняется, а StiAngle.Angle180 ставится.

У меня есть предположение, что необходимо подменить ID компонентов, чтобы они не пересекались. Но как это сделать, я не нашёл.
Заранее спасибо.

Re: Отправка на печать одним заданием

Добавлено: 13 окт 2016, 14:28
DmitriyKV
Спасибо, разобрался.
Оказалось, что я хранил массив "отрендареных" отчётов, в котором несколько (в моём случае 2) элементов ссылались на один и тот же объект отчёта.
Решил просто - "разъединением" этих объектов.

Re: Отправка на печать одним заданием

Добавлено: 14 окт 2016, 19:25
Aleksey
Здравствуйте,

Отлично!
Спасибо за информацию. Дайте знать, если будут еще вопросы.