Страница 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
Здравствуйте,
Отлично!
Спасибо за информацию. Дайте знать, если будут еще вопросы.