代码之家  ›  专栏  ›  技术社区  ›  Jarrett Widman

带有外部图像的ASP.NET RDLC不以PDF格式显示图像

  •  7
  • Jarrett Widman  · 技术社区  · 15 年前

    我使用的是与ASP.NET一起提供的Microsoft ReportViewer,它具有一个报表参数,该参数应设置报表中图像的值(路径)。我现在提供的路径是一个完整的URL,从http://开始,但也尝试将其作为应用程序的相对路径、站点根路径等。出于某种原因,当导出到PDF时,图像总是显示为红色X。我只是在代码中创建一个控件的实例,设置属性并直接导出到响应流,以便它执行下载。

    我只是不确定图片不显示会有什么问题,所以如果有人有任何想法,请告诉我。

    更新1

    我已经确定,如果图像在我的公共Web服务器上,我可以将它嵌入到一个URL中,但是当我在localhost中运行时,图像将不会嵌入。我已经为localhost确认,如果我将相同的URL粘贴到浏览器中,图像将正常打开。据我所知,我没有代理人。所以我可以解决我的问题,但我仍然不理解本地主机的问题。

    更新2

    忘了提一下,当从浏览器打开图像的URL时,它可以正常工作。

    6 回复  |  直到 8 年前
        1
  •  14
  •   Community CDub    8 年前

    PDF不可能包含引用外部图像(至少从我的理解来看)。为了在PDF中显示图像,必须将其嵌入到文档中。因此,要使用外部图像,应用程序必须检索图像并将其存储在文档中。报表查看器将尝试为您执行此操作。

    两个可能的答案:

    弗斯特 ,为了让应用程序将图像打包到PDF中,它必须能够从指定的URL中检索图像。如果该URL位于代理服务器后面(从应用服务器的角度看),并且/或者需要凭据才能访问,那么使用报表查看器的默认配置将面临挑战。

    如果出现代理服务器问题,请参阅下面可以添加的web.config设置。您可能还需要提供网络凭据,以便应用程序可以对代理进行身份验证。有很多方法可以解决这个问题,但最简单的方法之一是在您的域中以服务帐户的形式运行您的应用程序,该帐户有权遍历您的代理。您可以通过临时运行站点来测试这一点(应该是临时的,因为这是一种可怕的安全实践)。

    您正在使用的映像可能需要凭据才能访问(请尝试使用空cookie在firefox中提取映像,并验证是否需要凭据才能访问它)。如果它需要Windows身份验证,代理安全性的相同解决方案也可以应用于远程映像上所需的身份验证。如果它需要其他形式的身份验证,您最好下载图像并将其嵌入到项目中。

    也可以使用代码中的其他方法下载图像,并将其转换为字节数组以包含在报告中。在Web上有很多这样的例子,包括堆栈溢出 here .

    第二 ,请看下页:

    http://msdn.microsoft.com/en-us/library/ms251715%28VS.80%29.aspx

    在中使用外部图像 ReportViewer报表未由启用 违约。要使用外部图像,请 必须设置EnableExternalImages 属性。取决于 您的网络配置,您可以 还需要绕过代理设置 允许显示外部图像。 可以将以下设置添加到 要绕过的web.config文件 本地代理。修改您的 web.config文件,请确保指定 代理服务器的名称 在您的网络中使用:

    <system.net>
    <defaultProxy>
    <proxy usesystemdefault = "false" bypassonlocal = "true" proxyaddress = "http://< proxyservername >:80/" />
    <defaultProxy>
    </system.net>
    

    希望其中一个或两个都有帮助。

    杰瑞

        2
  •  2
  •   Flexo - Save the data dump sunny moon    13 年前

    将外部图像文件名传递给ReportViewer参数时,请按如下格式传递:file://c:\app\images\pic.jpg。其他任何东西在部署时通常都不起作用。

        3
  •  2
  •   pebcakcity    8 年前

    好吧,这就是我们的解决方案。Web服务器没有将其自己的限定DNS名称识别为URL,因此我们必须编辑c:\windows\system32\drivers\etc文件夹中的主机文件,并将主机名添加为localhost。我们添加到文件中的行是:

    ourserver.ourdomain.com 127.0.0.1版

        4
  •  1
  •   Andre    15 年前

    您是否尝试过常规文件路径(c:/temp/somefile.bmp)?ReportingServices本地报告从磁盘读取文件并将其嵌入到生成的PDF文件中。确保IIS中应用程序池的标识对映像文件具有读取权限。

    我们这样做,我们的图像和其他网站图像一起放在网站下的img文件夹中。我们避免使用server.mappath(相对路径)对路径进行硬编码。

    希望这有帮助

        5
  •  0
  •   Will    15 年前
    1. 报表查看器能否从相对URL获取图像?我从来没有用过,所以最好检查一下这个假设。
    2. 是否尝试使用html.content()帮助程序设置URL?每当我的URL有问题时,它是因为我没有使用它为视图生成正确的URL。
        6
  •  0
  •   Chris    15 年前

    我不认为AdobeReader(或者可能是PDF规范本身?)允许出于安全目的加载外部内容。我隐约记得有一个与ReportingServices无关的类似问题(我动态生成PDF并使用变量徽标,必须嵌入它们)。