5

我已经尝试了我能想到的一切来更改我需要呈现为 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。

任何关于如何解决这个问题的想法都将不胜感激。

-汤姆

4

6 回答 6

8

在此处和其他论坛的响应者的帮助下,我发现了一个似乎可以解决我的问题的简单技巧。在我放弃了与 SSRS 的斗争后,它来了。我敢肯定,为什么 SSRS 处理不同的分辨率参数有很多完全正当的理由。坦率地说,我并不在乎。我只需要以我指定的大小和分辨率生成文档。

这是相关的代码片段(为简洁起见,删除了错误处理)。我通过 Web 服务接口调用 SSRS,生成报告,并将其呈现为 300 x 300 TIFF。结果暂时保存。它将生成为 96ppi TIFF 并按比例放大。然后我将其读入位图,将分辨率更改为 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();
于 2010-08-27T15:16:19.993 回答
5

通过编辑 rsreportserver.config 文件,我可以在 SSRS 2008 R2 中轻松做到这一点:

      <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 忽略了它。另请注意,我在 Name 属性中使用了 Language 参数。我正在查看的文章说,如果覆盖配置不包含 Language 参数(未测试),它将被忽略。

于 2013-08-01T21:17:07.980 回答
2

我尝试了@Chuck Brevitt 的方法,但来自 Web API 的 Reporting Services 似乎没有遵守 PDF 设置的 DPI 设置。我通过实验和微软的一些提示发现这很有效:

为了获得更好的图像 PDF 渲染,像这样传递设备信息:

http://serverName/ReportServer?/pathtoReport/ReportName&InvoiceIdOrOtherParameter=24013&rs:Command=Render&rs:Format=PDF&rs:DeviceInfo=<DpiX>300<%2FDpiX><DpiY>300<%2FDpiY>
于 2017-05-19T11:53:48.810 回答
1

在配置文件中进行更改后尝试重新启动您的 ReportServer。按照下面的链接。

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

导出图像后,我不太确定是否尝试更改分辨率。

于 2014-02-03T16:54:19.733 回答
0

将图像对象设置为外部(报表服务器上的链接)或数据库中,而不是嵌入报表中。

于 2015-08-19T16:37:44.630 回答
0

我为 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)));
    }
于 2017-11-10T22:32:31.450 回答