Как избежать растягивания и сжатия при печати ReportServer в ландшафтном режиме? - PullRequest
0 голосов
/ 09 февраля 2019

Я использую свой класс ReportPrinting (который наследует класс PrintDocument) для печати ServerReport без предварительного просмотра.Отчет печатается нормально, когда я печатаю его в портретном режиме.Но когда я установил ландшафтный режим (PageSettings.Landscape установлен в true), напечатанный отчет растягивается по горизонтали и сжимается по вертикали.

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

Мои вопросы:

1) Что может вызвать растяжение и сжатие печатного отчета?

2) Как я могу решить это?

Я не уверен, важно ли это, но есть еще одна проблема: хотя ServerReport.GetDefaultPageSettings (). IsLandscape возвращает true, и я использовал это свойство для инициализации m_pageSettings.Landscape, когда отчет печатается в портретном режиме.В качестве временного решения я установил для этого свойства значение true жестким способом.

Фон:

  • Windows Server 2012 R2 Standard

  • .NET Framework 4

  • MS SQL Server 2016 (SP1-CU8)

  • MS Visual Studio 2010

ЧтоЯ уже пробовал

Я изменил значение тега OutputFormat (в CreateEMFDeviceInfo ()) на TIFF, JPEG и TIFF, но отчет не был напечатан.Я изменил значение параметра формата (в ServerReport.Render ()) на PDF и EXCEL, но это не решило проблему растяжения и сжатия.

using System;

class ReportPrinting : PrintDocument
{
    private PageSettings m_pageSettings;
    private int m_currentPage;
    private List<Stream> m_pages = new List<Stream>();

    public ReportPrinting(ServerReport serverReport)
        : this((Report)serverReport)
    {
        RenderAllServerReportPages(serverReport);

        PrintController = new System.Drawing.Printing.StandardPrintController();
    }

    public ReportPrinting(LocalReport localReport)
        : this((Report)localReport)
    {
        RenderAllLocalReportPages(localReport);
    }

    private ReportPrinting(Report report)
    {
        ReportPageSettings reportPageSettings = report.GetDefaultPageSettings();

        m_pageSettings = new PageSettings();
        m_pageSettings.PaperSize = reportPageSettings.PaperSize;
        m_pageSettings.Margins = reportPageSettings.Margins;

        m_pageSettings.Landscape = true; 
        //m_pageSettings.Landscape =  reportPageSettings.IsLandscape;     }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        if (disposing)
        {
            foreach (Stream s in m_pages)
            {
                s.Dispose();
            }

            m_pages.Clear();
        }
    }

    protected override void OnBeginPrint(PrintEventArgs e)
    {
        base.OnBeginPrint(e);

        m_currentPage = 0;
    }

    protected override void OnPrintPage(PrintPageEventArgs e)
    {
        base.OnPrintPage(e);

        Stream pageToPrint = m_pages[m_currentPage];
        pageToPrint.Position = 0;

        using (Metafile pageMetaFile = new Metafile(pageToPrint))
        {
            Rectangle adjustedRect = new Rectangle(
                    e.PageBounds.Left - (int)e.PageSettings.HardMarginX,
                    e.PageBounds.Top - (int)e.PageSettings.HardMarginY,
                    e.PageBounds.Width,
                    e.PageBounds.Height);

            e.Graphics.FillRectangle(Brushes.White, adjustedRect);

            e.Graphics.DraDrawImage(pageMetaFile, adjustedRect);

            m_currentPage++;
            e.HasMorePages = m_currentPage < m_pages.Count;
        }
    }

    protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
    {
        e.PageSettings = (PageSettings)m_pageSettings.Clone();
    }

    private void RenderAllServerReportPages(ServerReport serverReport)
    {

            string deviceInfo = CreateEMFDeviceInfo();

            NameValueCollection firstPageParameters = new NameValueCollection();
            firstPageParameters.Add("rs:PersistStreams", "True");

            NameValueCollection nonFirstPageParameters = new NameValueCollection();
            nonFirstPageParameters.Add("rs:GetNextStream", "True");

            string mimeType;
            string fileExtension;


            Stream pageStream = serverReport.Render("IMAGE", deviceInfo, firstPageParameters, out mimeType, out fileExtension);

            while (pageStream.Length > 0)
            {
                m_pages.Add(pageStream);

                pageStream = serverReport.Render("IMAGE", deviceInfo, nonFirstPageParameters, out mimeType, out fileExtension);
            }
    }

    private void RenderAllLocalReportPages(LocalReport localReport)
    {
        string deviceInfo = CreateEMFDeviceInfo();

        Warning[] warnings;

        localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback, out warnings);
    }

    private Stream LocalReportCreateStreamCallback(
        string name,
        string extension,
        Encoding encoding,
        string mimeType,
        bool willSeek)
    {
        MemoryStream stream = new MemoryStream();
        m_pages.Add(stream);

        return stream;
    }

    private string CreateEMFDeviceInfo()
    {
        PaperSize paperSize = m_pageSettings.PaperSize;
        Margins margins = m_pageSettings.Margins;

        return string.Format(
            CultureInfo.InvariantCulture,
            "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>",
            ToInches(margins.Top),
            ToInches(margins.Left),
            ToInches(margins.Right),
            ToInches(margins.Bottom),
            ToInches(paperSize.Height),
            ToInches(paperSize.Width));
    }

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