Печать альбомной/книжной ориентации в rdlc без предварительного просмотра

Я пытаюсь распечатать локальный отчет в альбомной или портретной ориентации.

private void Export(LocalReport report)
{
    Warning[] warnings;
    m_streams = new List<Stream>();

    var deviceInfo = new StringBuilder();
    deviceInfo.AppendLine("<DeviceInfo>");
    deviceInfo.AppendLine("<OutputFormat>EMF</OutputFormat>");
    //"11.7in", "8.3in"
    deviceInfo.AppendLine("<PageWidth>11.7in</PageWidth>");
    deviceInfo.AppendLine("<PageHeight>8.3in</PageHeight>");

    deviceInfo.AppendLine("</DeviceInfo>");

    report.Render("Image", deviceInfo.ToString(), CreateStream, out warnings);            
    foreach (var stream in m_streams) { stream.Position = 0; }
}

У меня есть 2 разных отчета: один в портретном режиме, а другой в ландшафтном, но не имеет значения, какие значения я меняю для PageWidth и PageSize, он всегда печатается в портретном режиме. Я поменял местами ширину и высоту между 11,7 дюйма и 8,3 дюйма, но он всегда печатается в портретном режиме.


person wakthar    schedule 30.01.2014    source источник


Ответы (2)


Можно использовать свойство ReportPageSettings.IsLandscape для проверьте, определен ли отчет как альбомный (Свойства отчета > Параметры страницы > Ориентация).

Если альбомный формат, вам нужно поменять местами ширину и высоту бумаги в объявлении DeviceInfo.

Dim rdlLocalReport As New LocalReport
Dim strDeviceInfo As String

With rdlLocalReport.GetDefaultPageSettings

    Dim intPaperSizeWidth As Integer = 0
    Dim intPaperSizeHeight As Integer = 0

    If .IsLandscape Then
        intPaperSizeWidth = .PaperSize.Height
        intPaperSizeHeight = .PaperSize.Width
    Else
        intPaperSizeWidth = .PaperSize.Width
        intPaperSizeHeight = .PaperSize.Height
    End If

    strDeviceInfo = "<DeviceInfo>" _
        & "<OutputFormat>EMF</OutputFormat>" _
        & "<PageWidth>" & Strings.Replace(intPaperSizeWidth / 100, ",", ".") & "in</PageWidth>" _
        & "<PageHeight>" & Strings.Replace(intPaperSizeHeight / 100, ",", ".") & "in</PageHeight>" _
        & "<MarginTop>" & Strings.Replace(.Margins.Top / 100, ",", ".") & "in</MarginTop>" _
        & "<MarginLeft>" & Strings.Replace(.Margins.Left / 100, ",", ".") & "in</MarginLeft>" _
        & "<MarginRight>" & Strings.Replace(.Margins.Right / 100, ",", ".") & "in</MarginRight>" _
        & "<MarginBottom>" & Strings.Replace(.Margins.Bottom / 100, ",", ".") & "in</MarginBottom>" _
        & "</DeviceInfo>"

End With

Если вы используете PrintDocument, вам также необходимо соответствующим образом изменить PageSettings.Landscape.

Dim printDoc As New PrintDocument
printDoc.DefaultPageSettings.Landscape = rdlLocalReport.GetDefaultPageSettings.IsLandscape
person tezzo    schedule 01.03.2018

Вы можете сделать это, используя «GetDefaultPageSettings()» из «Отчета» (LocalReport/ServerReport) и украв этот код из внутренностей средства просмотра отчетов:

private string CreateEMFDeviceInfo(int startPage, int endPage)
{
    string text = "";
    PageSettings pageSettings = PageSettings;
    int hundrethsOfInch = pageSettings.Landscape ? pageSettings.PaperSize.Height : pageSettings.PaperSize.Width;
    int hundrethsOfInch2 = pageSettings.Landscape ? pageSettings.PaperSize.Width : pageSettings.PaperSize.Height;
    text = string.Format(CultureInfo.InvariantCulture, "<MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth>", ToInches(pageSettings.Margins.Top), ToInches(pageSettings.Margins.Left), ToInches(pageSettings.Margins.Right), ToInches(pageSettings.Margins.Bottom), ToInches(hundrethsOfInch2), ToInches(hundrethsOfInch));
    return string.Format(CultureInfo.InvariantCulture, "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>{0}</StartPage><EndPage>{1}</EndPage>{2}</DeviceInfo>", startPage, endPage, text);
}

private static string ToInches(int hundrethsOfInch)
{
    return ((double)hundrethsOfInch / 100.0).ToString(CultureInfo.InvariantCulture) + "in";
}

Таким образом вы получите ориентацию страницы и поля, заданные в определении отчета.

person Roger Willcocks    schedule 23.05.2019
comment
LocalReport не имеет свойства PageSettings - откуда вы это взяли? У него есть метод GetDefaultPageSettings, но данные, возвращаемые этим методом, доступны только для чтения. - person ekolis; 30.10.2019
comment
@ekolis Я украл его из внутренних компонентов ReportViewer, как я уже сказал. Microsoft.Reporting.WinForms.ReportViewer имеет PageSettings как частное свойство. Ваш объект должен где-то иметь такое свойство для работы. - person Roger Willcocks; 01.11.2019