Кто-нибудь придумал, как сделать отчет Службы Reporting Services с разрешением больше 96ppi?


Я перепробовал все, что мог придумать, чтобы изменить параметры отрисовки для отчета, который мне нужно отрисовывать как 300ppi TIFF.

Вот одна из нескольких попыток, использующих подход 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 4

6 ответов:

С помощью респондентов здесь и на других форумах, я нашел простой хак, который, кажется, решает мою проблему. Это пришло ко мне после того, как я отказался от борьбы с SSRS. Я уверен, что есть много совершенно обоснованных причин, почему SSRS обрабатывает различные параметры разрешения, как это делает. Честно говоря, мне на это наплевать. Мне просто нужно, чтобы мой документ был сгенерирован в указанном размере и разрешении.

Вот соответствующие фрагменты кода (обработка ошибок удалена для краткости). Я вызовите SSRS через интерфейс веб-службы, сгенерируйте отчет и визуализируйте его как 300 x 300 TIFF. Результаты временно сохраняются. Он будет сгенерирован как 96PPI TIFF и масштабирован. Затем я считываю его в растровое изображение, изменяю разрешение до 300 х 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.конфигурационный файл:

      <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>
Обратите внимание, что я оставил исходное расширение изображения нетронутым (хотя мне и не пришлось этого делать) и добавил еще две ссылки на это расширение - одну с разрешением 200 DPI и одну с разрешением 300 DPI. Все три теперь отображаются в раскрывающемся списке экспорт в Диспетчере отчетов и работают правильно. Обратите внимание, что (следуя примеру Micorsoft) я включил атрибут ColorDepth, хотя SSRS игнорирует его. Также обратите внимание, что я использовал параметр языка в атрибуте Name. В статье, которую я просматривал, говорится, что конфигурация переопределения будет проигнорирована, если она не включает параметр Language (не тестировал его).

Я попробовал метод @Chuck Brevitt, но Службы Reporting Services из Web API, похоже,не соблюдали настройки DPI для параметров PDF. Я нашел путем экспериментов и некоторых подсказок в Microsoft notes, что это работает:

Чтобы получить лучший PDF-рендеринг изображений, передайте информацию об устройстве следующим образом:

http://serverName/ReportServer?/pathtoReport/ReportName&InvoiceIdOrOtherParameter=24013&rs:Command=Render&rs:Format=PDF&rs:DeviceInfo=<DpiX>300<%2FDpiX><DpiY>300<%2FDpiY>

Попробуйте перезапустить сервер отчетов после внесения изменений в файл конфигурации. Перейдите по ссылке ниже.

Http://social.msdn.microsoft.com/Forums/sqlserver/en-US/2b1379e1-cbc5-4764-8f39-f043b334244d/rendering-a-report-in-tiff-at-300ppi?forum=sqlreportingservices

Я не совсем уверен, стоит ли пытаться изменить разрешение после экспорта изображения.

Установите внешний объект изображения (ссылка на сервере отчетов) или в базе данных, а не встроенный в отчет.

Я перепробовал все под солнцем для 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)));
    }