Как избежать растягивания и сжатия при печати ReportServer в ландшафтном режиме?
Я использую свой класс 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";
}
}