【问题标题】:SSRS can't properly render *some* images within PDFSSRS 无法在 PDF 中正确渲染 *一些* 图像
【发布时间】:2013-03-17 07:03:01
【问题描述】:

我有一个呈现从各种来源收集的图像 (jpg) 的报告。这在报表查看器中以及通过 Excel 导出时都可以正常工作。

但是,当导出为 PDF 时,大约 5% 的图像渲染不正确,如下图所示,左侧是原始图像,右侧是渲染的内容;

我发现,如果我在 mspaint 中打开其中一张图像,然后单击保存,则在下一次运行报告时,图像现在可以正确呈现。

对于 SSRS 在 PDF 中正确呈现图像的有效图像属性/格式是否有任何规则?本质上,我想以某种方式找到这些在报告运行之前会错误呈现的图像并提前修复它们......

【问题讨论】:

    标签: image pdf reporting-services ssrs-2008


    【解决方案1】:

    由于输出看起来的方式,我会说那些 JPEG 图像具有 CMYK 色彩空间,但 SSRS 假定它们使用 RGB 色彩空间并在 PDF 中设置错误的色彩空间。
    如果您可以发布 JPEG 图像和示例 PDF,我可以为您提供更多详细信息。

    【讨论】:

    • 当时它不能。 SSRS 使用 GDI+ 处理图像,而 GDI+ 不能正确支持 CMYK。
    【解决方案2】:

    这是向 Microsoft Connect 报告的问题。
    来自SSRS 2008 How to get the best image quality possible?

    您在 PDF 中看到的图像行为是 PDF 渲染器执行的某些图像转换的结果,基于 PDF 规范要求将图像序列化为 PDF 的方式。

    我们知道这并不理想,因此我们将图像质量下降归类为产品问题。因此,很难真正说出如何才能获得最佳质量的图像。

    有趣的是,我听说当原始图像是 BMP 时,客户的效果很好

    【讨论】:

      【解决方案3】:

      我在屏幕上正确渲染图像时遇到了完全相同的问题,但是当我将报告导出为 PDF 时,它看起来就像问题中的问题一样。这是我解决它的方法。

      问题

      第一个线索是this article 我在 MSDN 上遇到的。似乎无论原始图像密度如何,SSRS 中的 PDF 渲染器都会将所有图像的大小调整为 96 DPI。如果图片的原始大小大于页面(或容器)的大小,那么就会出现这个问题。

      解决方案

      解决方案是调整源图像的大小,使其适合您的页面。这需要根据您的页面大小和边距设置进行一些计算。

      就我而言,我使用的是 A4 纸尺寸,即 21 厘米 x 29.7 厘米。但是,我的左边距为 1.5 厘米,右边距为 0.5 厘米,总内宽为 19 厘米。我允许额外的 0.5 厘米作为误差范围,所以我使用 18.5 厘米的内宽。

      21 cm - 1.5 cm - 0.5 cm - 0.5 cm = 18.5 cm
      

      如前所述,PDF 渲染器生成的分辨率为 96 DPI(每英寸点数)。对于我们这些不在美国或利比里亚共和国的人来说,这是 37.79 DPC(每厘米点数)。所以,要得到我们的宽度:

      18.5 cm * 37.79 dpc = 699 pixels
      

      您的结果可能会有所不同,具体取决于 (1) 您使用的纸张尺寸,以及 (2) 左右边距。

      由于页面高于宽度,我们只需要调整宽度,同时保持图像比例。如果您使用的纸张尺寸比它的高宽,您可以使用长度。

      现在在 Paint(或您选择的图像编辑器)中打开源图像,并按比例将图像大小调整为所需的宽度(或长度)(以像素为单位),保存,将其导入容器中,并直观地调整图像大小相对于容器。它在屏幕上应该看起来一样,现在可以正确呈现为 PDF。

      【讨论】:

      • 不要与您的幽默感抗衡,但 DPI 在世界各地的平面艺术中得到广泛使用。不,我不是美国人,也不是利比里亚人(尽管后者中的一些人一直坚称他们有钱给我)。
      • 确实如此,但就我的计算而言,将 DPI 转换为公制比将其他所有内容转换为英制更容易。
      • 您是否试图解决像 OP 一样严重的问题? IE。图像会变成灰色+白色并且全部混合?因为我遇到了类似的问题——唯一的解决办法是痛苦地/无论如何打开文件并将其保存为 rgb(默认情况下,paint 会这样做)
      【解决方案4】:

      当前的解决方法

      我从来没有最终让 SSRS 按原样显示问题图像,但是,在运行报告之前确定哪些图像将包含在不可显示集中,以便可以将它们转换为支持的格式(自动)是也是一个解决方案。

      就我而言,所有图片都是通过用户上传到网站提供的,因此我能够在图片到达时对其进行识别和转换。对于所有现有图像,我能够运行一个脚本来识别问题图像并进行转换。

      识别问题图像

      从我拥有的数千张图像中,我能够确定无法正确渲染的图像具有以下属性:

      1. 图像具有 CMYK 颜色空间或;
      2. 图像具有扩展的颜色配置文件或;
      3. 以上两者

      转换图像

      我最初使用标准 .NET GDI (System.Drawing) 来处理图像,但是在处理具有额外数​​据的图像时,API 经常容易崩溃 (OutOfMemoryException)。因此,我转而使用ImageMagick,对于每个已识别的图像,我:

      1. 剥离颜色配置文件和;
      2. 转换为 RGB

      请注意,从 CMYK 到 RGB 的转换没有剥离颜色配置文件不足以让所有图像正确渲染。

      在将上传的图像保存到磁盘之前,我最终只是对从用户那里收到的每个图像字节流执行了这些项目(没有首先确定问题)。之后,我再也没有遇到过渲染问题。

      【讨论】:

      • 谢谢!我今天自己也遇到了这个问题,这帮助我摆脱了困境。对于像我这样使用 GIMP 的用户,只需“导出为”,然后取消选中“保存颜色配置文件”选项即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多