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

Duplex и альбомная ориентация не совместимы ?

Добавлено: 05 сен 2013, 05:03
EmeJIbka
Здравствуйте.

Мне необходимо создать отчёт, который будет печататься на бумаге формата A5 с двух сторон (в портретной ориентации). Принтер с поддержкой дуплекса имеется, но дуплекс работает только с форматом бумаги A4. Поэтому я создал отчёт с двумя страницами A4 в альбомной ориентации и разместил данные в правой половине, в настройках отчёта я установил режим двусторонней печати. Но дуплекс не работает :( У меня есть другой отчёт, в котором то же используется двусторонняя печать, но там другой формат бумаги - A4, портретная, и с ним всё в порядке, дуплекс работает. Я провёл эксперимент - поменял ориентацию страниц в работающем отчёте и принтер перестал переворачивать станицу :( Я проверил печать из word`а, в нём двусторонняя печать работает не зависимо от ориентации страниц.

Вопрос - Duplex и альбомная ориентация не совместимы или я что то делаю не так ?

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 05 сен 2013, 07:12
HighAley
Здравствуйте.
EmeJIbka писал(а):Мне необходимо создать отчёт, который будет печататься на бумаге формата A5 с двух сторон (в портретной ориентации). Принтер с поддержкой дуплекса имеется, но дуплекс работает только с форматом бумаги A4. Поэтому я создал отчёт с двумя страницами A4 в альбомной ориентации и разместил данные в правой половине, в настройках отчёта я установил режим двусторонней печати. Но дуплекс не работает :( У меня есть другой отчёт, в котором то же используется двусторонняя печать, но там другой формат бумаги - A4, портретная, и с ним всё в порядке, дуплекс работает. Я провёл эксперимент - поменял ориентацию страниц в работающем отчёте и принтер перестал переворачивать станицу :( Я проверил печать из word`а, в нём двусторонняя печать работает не зависимо от ориентации страниц.

Вопрос - Duplex и альбомная ориентация не совместимы или я что то делаю не так ?
Для начала попробуйте установить свойство Duplex(Дуплекс) в Horizontal(Горизонтальный).
Если это не поможет то сожете попробовать задать настройки печати в коде со следующей опцией:

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

StiOptions.Print.UsePrinterSettingsEntirely = true;

PrinterSettings printerSettings = new PrinterSettings();
printerSettings.Duplex = .....
.....
report.Print(printerSettings);
Если и это не поможет, то скорее всего проблема на стороне .Net Framework.

Спасибо.

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 05 сен 2013, 08:24
EmeJIbka
Код
StiOptions.Print.UsePrinterSettingsEntirely = true;

PrinterSettings printerSettings = new PrinterSettings();
printerSettings.Duplex = .....
.....
report.Print(printerSettings);
никак не помогает, дуплекс не работает. Есть возможность перевернуть содержимое отчёта во время построения, так что бы верхний левый угол переместился в верхний правый ? Что бы можно было задать портретную ориентацию страницы.

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 09 сен 2013, 11:23
HighAley
Здравствуйте.

Можем предложить вам следующий код, который используется нашими клиентами для поворота отчёта.

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

  foreach (StiPage page in report.RenderedPages)
                    {
                        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);
                        if (page.Orientation == StiPageOrientation.Landscape)
                        {
                            page.Orientation = StiPageOrientation.Portrait;
                        }
                        else
                        {
                            page.Orientation = StiPageOrientation.Landscape;
                        }

                        System.Collections.Hashtable newComps = new System.Collections.Hashtable();

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

                            comp.DisplayRectangle = newRect;

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

                            StiText stiText = comp as StiText;
                            if (stiText != null)
                            {
                                stiText.Angle += 90;
                                if (stiText.Angle >= 360) stiText.Angle -= 360;
                            }

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

                            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.RightSide.Color, advBorder.RightSide.Size, advBorder.RightSide.Style),
                                        new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.LeftSide.Color, advBorder.LeftSide.Size, advBorder.LeftSide.Style),
                                        new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.TopSide.Color, advBorder.TopSide.Size, advBorder.TopSide.Style),
                                        new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.BottomSide.Color, advBorder.BottomSide.Size, advBorder.BottomSide.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.Left;
                                    if (oldBorder.IsBottomBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Right;
                                    if (oldBorder.IsRightBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Top;
                                    if (oldBorder.IsLeftBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Bottom;
                                    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;
                            }
                        }
                    }
Спасибо.

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 16 май 2014, 02:33
EmeJIbka
Совершенно случайно обнаружили что дуплекс не работает только там, где установлен драйвер pcl 5. С 6-ой версией pcl, отчеты печатаются как надо :) Проверяли на принтере hp laserjet 2055dn

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 16 май 2014, 07:03
Леонид
Доброе утро!

Внесу свои 50 центов в картину, т.к. сталкивался с подобным поведением.
Сразу оговорюсь, что сама отчётная система работает идеально в этом плане, никакие повороты-развороты в принципе не нужны при обычных условиях.

Использую такой код:

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

stiReport.PrinterSettings.Duplex = (isDouble == "Y") ? System.Drawing.Printing.Duplex.Vertical : System.Drawing.Printing.Duplex.Simplex;
Работает идеально.

Однако, действительно, всё, что связано с принтерами очень и очень индивидуально. К примеру, вышеприведённый код работает на всех наших принтерах, кроме нескольких, и дело тут да, именно в драйвере, но даже после установки последней версии драйвера, на некоторых принтерах это всё равно не работает, т.е., тут ещё видимо связка принтер + драйвер + ОС (XP/Win7/W8), т.к. для печати используются стандартные API Windows, а драйвера разные. Ну и разумеется, необходимо убедиться в том, что принтер вообще поддерживает такую функцию (двусторонняя печать), иначе никакие манипуляции не помогут.

Re: Duplex и альбомная ориентация не совместимы ?

Добавлено: 20 май 2014, 10:11
HighAley
Здравствуйте.

Спасибо, Леонид за дополнение.
Мы периодически сталкиваемся с различными проблемами печати. Зачастую они исходят из драйвера или скорее связки .Net Framework - драйвер.
К сожалению, выяснить причину более конкретно, а тем более решить её не представляется возможным.

Спасибо.