我已经尝试了一切我能想到的更改报表的渲染参数,我需要将其渲染为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。
对于如何解决这个问题的任何想法都将非常感激。
- 汤姆
答案 0 :(得分:8)
在这里和其他论坛的回复者的帮助下,我发现了一个似乎可以解决我的问题的简单黑客。在我放弃与SSRS的斗争后,它来到我身边。我确信SSRS处理不同分辨率参数的原因有很多完全正确的理由。坦率地说,我不会发出声音。我只需要以我指定的大小和分辨率生成我的文档。
这是相关的代码片段(为简洁起见,删除了错误处理)。我通过Web服务接口调用SSRS,生成报告,并将其呈现为300 x 300 TIFF。结果暂时保存。它将以96ppi TIFF生成并按比例放大。然后我将其读入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();
答案 1 :(得分:4)
我可以通过编辑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参数(没有测试它),覆盖配置将被忽略。
答案 2 :(得分: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>
答案 3 :(得分:1)
尝试在配置文件中进行更改后重新启动ReportServer。请点击以下链接。
我不太确定在导出图像后尝试更改分辨率。
答案 4 :(得分:0)
将图像对象设置为外部(报表服务器上的链接)或数据库中,而不是嵌入在报表中。
答案 5 :(得分: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)));
}