Печать отчета SSRS в альбомном режиме из приложения Windows Forms

У меня есть приложение Windows Forms, которое имеет textbox, buttonи 3 ReportViewer, 3 ReportViewer коробки спрятаны. Когда вы вводите ShopOrder в текстовое поле и нажмите на кнопку, он автоматически передаст значение заказа магазина в качестве параметра всем трем отчетам, отобразит отчет, и после его завершения отобразит отчет в виде файла EMF, распечатает отчет.

Я использую эту ссылку в качестве руководства для автоматической печати отчетов SSRS из приложения Windows Forms.

У меня есть несколько отклонений в моем приложении, потому что я использую ServerReports в моем ReportViewer и не LocalReport, Но после всех этих изменений мое приложение печатает их все без проблем.

Но единственная проблема, с которой я столкнулся, заключается в том, что я не могу установить ориентацию страницы на Landscape, хотя ориентация в моем отчете - Пейзаж.

Поэтому я подумал, может быть, мне нужно установить deviceInfo переменной PageWidth а также PageHeight переменные соответственно, так что это то, что deviceInfo переменная имеет:

string deviceInfo =
    @"<DeviceInfo>
        <OutputFormat>EMF</OutputFormat>
        <PageWidth>11in</PageWidth>
        <PageHeight>8.5in</PageHeight>
        <MarginTop>0.25in</MarginTop>
        <MarginLeft>0.25in</MarginLeft>
        <MarginRight>0.25in</MarginRight>
        <MarginBottom>0.25in</MarginBottom>
    </DeviceInfo>";

У меня два Export функции: Export а также ExportLandscape, Приведенный выше фрагмент кода является частью ExportLandscape, Когда я звоню ExportLandscapeМой отчет все еще печатает в портрете.

Я попытался просто полностью удалить параметры настройки страницы из моего DeviceInfo переменная и сделал это просто сказать OutputFormat, Это тоже не делало.

Есть ли еще что-то, что мне нужно изменить, чтобы мой отчет печатался в альбомной ориентации? Что мне не хватает?

Также стоит отметить, что из 3 моих докладов 2 из них печатаются в альбомной ориентации, а 1 - в портретной. Поэтому мне бы очень хотелось, чтобы мое приложение просто распечатывало его при любых настройках страницы, в которых находится отчет. Я просто попытался получить размер страницы отчета и поля отчета и установить их для своего DeviceInfo переменная, как предлагается здесь. ВСЕМ НЕ УДАЧИ!!

Я просто попытался добавить точку останова на Export(ReportViewer report) функционировать и перешагнул. Когда я получу report.ServerReport.GetDefaultPageSettings().PaperSize в ближайшем окне я вижу это:

{[PaperSize Letter Kind=Letter Height=1100 Width=850]}
    Height: 1100
    Kind: Letter
    PaperName: "Letter"
    RawKind: 1
    Width: 850

Это заставляет меня чувствовать, что, хотя мой отчет настроен на альбомную ориентацию (высота = 8,5 дюйма и ширина = 11 дюймов), мое приложение, похоже, не распознает его.

Важное обновление:

Принтер, на котором я печатаю, имеет 2 лотка для бумаги. Когда я печатаю портретный отчет, он берется из лотка по умолчанию с размером бумаги по умолчанию (лоток 2). Но когда мое приложение отправляет отчет о горизонтальной ориентации на печать, принтер пытается вытащить бумагу из лотка 1. Когда я загружаю в лоток 1 ту же бумагу, что и в лотке 2, он просит ввести ширину и высоту бумаги., Кажется, принтер не понимает, когда я говорю, чтобы он печатал в альбомной ориентации. Или, скорее, принтер думает, что это какая-то новая настройка, о которой он не знает. Когда я ввожу 11 для ширины и 8,5 для высоты, он печатает данные ландшафта на портретной бумаге.

Для большей ясности данные печатаются шириной 11 и высотой 8,5. АКА, только 75% данных печатаются. Остальное выталкивается со страницы, потому что страница все еще ориентирована в портретной ориентации.

1 ответ

Решение

Вам нужно использовать подходящий PageSettings для PrintDocument который используется для печати. Вам необходимо внести некоторые изменения в код этой статьи, чтобы иметь возможность печатать на бумаге другого размера или разметки страницы.

Для начала нужно создать подходящий PageSettingsНапример, если вы установили настройку страницы по умолчанию для своего отчета в альбомной ориентации:

var report = reportViewer1.LocalReport;
var pageSettings = new PageSettings();
pageSettings.PaperSize = report.GetDefaultPageSettings().PaperSize;
pageSettings.Landscape = report.GetDefaultPageSettings().IsLandscape;
pageSettings.Margins = report.GetDefaultPageSettings().Margins;

или если вы хотите создать новый параметр страницы:

var pageSettings = new PageSettings();
pageSettings.Landscape = true;
pageSettings.PaperSize = reportViewer1.PrinterSettings.PaperSizes.Cast<PaperSize>()
    .Where(x => x.Kind == PaperKind.A4).First();

Затем используйте pageSetting при создании deviceInfo:

string deviceInfo =
    $@"<DeviceInfo>
        <OutputFormat>EMF</OutputFormat>
        <PageWidth>{pageSettings.PaperSize.Width * 100}in</PageWidth>
        <PageHeight>{pageSettings.PaperSize.Height * 100}in</PageHeight>
        <MarginTop>{pageSettings.Margins.Top * 100}in</MarginTop>
        <MarginLeft>{pageSettings.Margins.Left * 100}in</MarginLeft>
        <MarginRight>{pageSettings.Margins.Right * 100}in</MarginRight>
        <MarginBottom>{pageSettings.Margins.Bottom * 100}in</MarginBottom>
    </DeviceInfo>";

И наконец, используйте те же настройки страницы с PrintDocument:

PrintDocument printDoc = new PrintDocument();
printDoc.DefaultPageSettings = pageSettings;

Я создал метод расширения, чтобы упростить печать отчета путем вызова Print() или же Print(PageSettings), Вы можете найти его здесь: Печать отчета RDLC без отображения ReportViewer

Другие вопросы по тегам