Кто-нибудь придумал, как сделать отчет служб Reporting Services с разрешением выше 96ppi?
Я перепробовал все, что мог придумать, чтобы изменить параметры рендеринга для отчета, который мне нужно представить как TIFF 300ppi.
Вот одна из нескольких попыток с использованием подхода URL. При переходе с 96ppi на 300ppi размер изображения 8,5 x 11 резко увеличивается, но разрешение остается на уровне 96ppi.
//s0550284/ReportServer?/ERecordingReports/Report1&rs:Format=IMAGE&rc:DpiX=300&rc:DpiY=300&rc:PageHeight=11in&rc:PageWidth=8.5in&rs:Command=Render
Мы попытались изменить файлы конфигурации SSRS, чтобы изменить значение по умолчанию с 96ppi на 300ppi, но это изменение игнорируется.
Это начинает выглядеть как кто-то жестко закодированный 96ppi где-то, где это не может быть переопределено.
Мы работаем с SQL Server 2008 R2.
Любые мысли о том, как обойти эту проблему, будут очень благодарны.
-Том
6 ответов
С помощью респондентов здесь и на других форумах я нашел простой взлом, который, похоже, решил мою проблему. Это пришло ко мне после того, как я бросил борьбу с SSRS. Я уверен, что существует множество совершенно веских причин того, почему SSRS обрабатывает различные параметры разрешения так же, как и он. Честно говоря, я не кричу. Мне просто нужно, чтобы мой документ был сгенерирован с указанным размером и разрешением.
Вот соответствующие фрагменты кода (обработка ошибок удалена для краткости). Я вызываю SSRS через интерфейс веб-службы, генерирую отчет и отображаю его как TIFF размером 300 x 300. Результаты временно сохранены. Он будет сгенерирован как TIFF 96ppi и увеличен. Затем я читаю его в BitMap, меняю разрешение на 300 x 300 и снова записываю. Готово.
string deviceInfo = "<DeviceInfo> <OutputFormat>TIFF</OutputFormat> <DpiX>300</DpiX> <DpiY>300</DpiY> <PrintDpiX>300</PrintDpiX> <PrintDpiY>300</PrintDpiY> </DeviceInfo>";
string format = "IMAGE";
Byte[] results;
string mimeType = "image/tiff";
// Generate the report as a TIF
ExecutionInfo ei = new ExecutionInfo();
ei = rsExec.LoadReport(_reportName, historyID);
results = rsExec.Render(format, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
string TempFileRSGeneratedTIFF = TempPath + "RSGeneratedTIFF.TIF";
// Save tiff file returned by RS
using (FileStream stream = File.OpenWrite(TempFileRSGeneratedTIFF))
{
stream.Write(results, 0, results.Length);
}
// Read tif file into bitmap
Bitmap image = new Bitmap(TempFileRSGeneratedTIFF);
// Change the resolution to what it was supposed to be in the first place..
image.SetResolution(300, 300);
// Save the final version of the file
image.Save(DestFileName, System.Drawing.Imaging.ImageFormat.Tiff);
image.Dispose();
Я смог легко сделать это в SSRS 2008 R2, отредактировав файл rsreportserver.config:
<Extension Name="IMAGE" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering" />
<Extension Name="TIFF 200 DPI" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering">
<OverrideNames>
<Name Language="en-US">TIFF 200 DPI</Name>
</OverrideNames>
<Configuration>
<DeviceInfo>
<ColorDepth>32</ColorDepth>
<DpiX>200</DpiX>
<DpiY>200</DpiY>
<OutputFormat>TIFF</OutputFormat>
</DeviceInfo>
</Configuration>
</Extension>
<Extension Name="TIFF 300 DPI" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering">
<OverrideNames>
<Name Language="en-US">TIFF 300 DPI</Name>
</OverrideNames>
<Configuration>
<DeviceInfo>
<ColorDepth>32</ColorDepth>
<DpiX>300</DpiX>
<DpiY>300</DpiY>
<OutputFormat>TIFF</OutputFormat>
</DeviceInfo>
</Configuration>
</Extension>
Обратите внимание, что я оставил оригинальное расширение IMAGE нетронутым (хотя мне это и не нужно было) и добавил еще две ссылки на это расширение - одно с разрешением 200 DPI и одно с разрешением 300 DPI. Все три теперь отображаются в раскрывающемся списке экспорта в диспетчере отчетов и работают правильно. Обратите внимание, что (следуя примеру Micorsoft) я включил атрибут ColorDepth, хотя SSRS его игнорирует. Также обратите внимание, что я использовал параметр Language в атрибуте Name. В статье, на которую я смотрел, говорится, что конфигурация переопределения будет игнорироваться, если она не включает параметр Language (не проверял).
Я попробовал метод @Chuck Brevitt, но службы Reporting Services из Web API, похоже, не учитывали настройки DPI для настроек PDF. Я нашел экспериментальным путем и некоторые намеки в заметках Microsoft, что это работает:
Чтобы улучшить качество рендеринга изображений в формате PDF, передайте информацию об устройстве следующим образом:
http://serverName/ReportServer?/pathtoReport/ReportName&InvoiceIdOrOtherParameter=24013&rs:Command=Render&rs:Format=PDF&rs:DeviceInfo=<DpiX>300<%2FDpiX><DpiY>300<%2FDpiY>
Попробуйте перезапустить свой ReportServer после внесения изменений в файл конфигурации. Перейдите по ссылке ниже.
Я не совсем уверен, пытаясь изменить разрешение, как только вы экспортируете изображение.
Я попробовал все под солнцем для SSRS 2012, и я имею в виду все. Но в конце концов я тоже отказался от этого. В том же духе Том и куча поисков я нашел http://csharphelper.com/blog/2017/09/change-image-resolution-c/
Это рабочая модель:
public static string BumpUpResolution(string filename, float dpiX, float dpiY, string processID)
{
int oldWidth = 0, oldHeight = 0;
Bitmap image = new Bitmap(filename);
oldWidth = image.Width;
oldHeight = image.Height;
using (Bitmap bm = new Bitmap(oldWidth, oldHeight))
{
Point[] points = {
new Point(0,0),
new Point(oldWidth, 0),
new Point(0, oldHeight),
};
using (Graphics gr = Graphics.FromImage(bm))
{
gr.DrawImage(image, points);
}
bm.SetResolution(dpiX, dpiY);
bm.Save(Path.Combine(Path.GetDirectoryName(filename), string.Format("{0}{1}", processID, Path.GetExtension(filename))), System.Drawing.Imaging.ImageFormat.Tiff);
}
image.Dispose();
return Path.Combine(Path.GetDirectoryName(filename), string.Format("{0}{1}", processID, Path.GetExtension(filename)));
}
Настройте объект изображения как внешний (ссылка на сервере отчетов) или в базе данных, а не встроенный в отчет.