SSRS サーバーレポートのレンダリングとコードからの印刷に問題があります。
レンダリングは成功し、レポートは印刷されますが、グラフィックスの品質は低下します。レポート自体には、ロゴ用の高解像度 6kx1k GIF 画像があります。
EMF と PDF を使用したレンダリングの違いを示すために、以下の画像を作成しました。
ご覧のとおり、フォントは見栄えがよく (ピクセル化なし)、PDF ロゴでレンダリングすると見栄えがよくなります。ただし、ロゴの端に見られるように、EMF バージョンは品質が低くなります。
誰かがこれに遭遇して解決しましたか?
SQL Server 2008R2 SP2 (10.50.4000) を実行しています
EMF を使用してレポートを表示するコード
public List<byte[]> Render()
{
// Setting credentials and reporting services uri
ReportExecutionService reportService = new ReportExecutionService
{
Credentials = _credentials,
Url = Settings.Default.ReportingService
};
// Prepare report parameter.
ExecutionHeader execHeader = new ExecutionHeader();
reportService.ExecutionHeaderValue = execHeader;
reportService.LoadReport(_report, null);
reportService.SetExecutionParameters(_parameters.ToArray(), "en-us");
// Render
bool startup = true;
List<byte[]> streams = new List<byte[]>();
int numberOfPages = 0;
byte[] result = null;
while (startup || result.Length > 0)
{
startup = false;
string devInfo = String.Format(@"<DeviceInfo><OutputFormat>EMF</OutputFormat><PrintDpiX>150</PrintDpiX><PrintDpiY>150</PrintDpiY><StartPage>{0}</StartPage></DeviceInfo>", numberOfPages + 1);
string encoding, mimeType, extension;
string[] streamIDs = null;
Warning[] warnings = null;
result = reportService.Render("IMAGE", devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
if (result.Length > 0)
{
streams.Add(result);
}
numberOfPages++;
}
return streams;
}
これがprintdocumentの実装です
public class PrintReport : PrintDocument
{
private int _currentPage;
private List<byte[]> _pages;
public PrintReport()
{
}
public List<byte[]> Pages
{
get { return _pages; }
set { _pages = value; }
}
protected override void OnBeginPrint(PrintEventArgs e)
{
base.OnBeginPrint(e);
_currentPage = 0;
}
protected override void OnPrintPage(PrintPageEventArgs e)
{
base.OnPrintPage(e);
Stream pageToPrint = new MemoryStream(_pages[_currentPage]);
pageToPrint.Position = 0;
// Load each page into a Metafile to draw it.
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);
// Draw a white background for the report
e.Graphics.FillRectangle(Brushes.White, adjustedRect);
// Draw the report content
e.Graphics.DrawImage(pageMetaFile, adjustedRect);
// Prepare for next page. Make sure we haven't hit the end.
_currentPage++;
e.HasMorePages = _currentPage < _pages.Count;
}
}
protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
{
e.PageSettings = (PageSettings)PrinterSettings.DefaultPageSettings.Clone();
}
}