我正在使用ASP.NET附带的Microsoft ReportViewer,并且有一个报表参数,应该在报表中设置图像的值(路径)。我现在提供路径作为完整的URL,从http://开始,但也尝试将其作为应用程序相对路径,站点根路径等等。由于某种原因,图像始终显示为红色X时它导出为PDF。我只是在代码中创建一个控件实例,设置属性并直接导出到响应流,以便进行下载。
我只是不确定图片没有出现会出现什么问题,所以如果有任何想法请告诉我。
更新1
我已经确定我可以使用URL嵌入图像,如果它在我的公共Web服务器上,但是当我在localhost中运行时,图像将不会嵌入。我已经确认localhost,如果我将相同的URL粘贴到我的浏览器中,图像将打开正常。据我所知,我没有代理人。所以我可以解决我的问题,但我仍然不明白localhost的问题是什么。
更新2
忘记提及当从浏览器打开图像的URL时,它可以正常工作。
答案 0 :(得分:14)
PDF不能包含引用外部图像(至少从我的理解中)。为了使图像显示在PDF中,必须将其嵌入到文档中。因此,要使用外部图像,您的应用必须检索图像并将其存储在文档中。报告查看器将尝试为您执行此操作。
两个可能的答案:
首先,为了让您的应用将图片打包成PDF,它必须能够从您指定的网址中检索图片。如果该URL位于代理服务器后面(从应用服务器的角度来看)和/或需要凭据来访问,则会对报表查看器的默认配置提出质询。
如果代理服务器出现问题,请参阅下面的web.config设置。您可能还需要提供网络凭据,以便您的应用可以对代理进行身份验证。有很多方法可以解决这个问题,但最简单的方法之一就是将您的应用程序作为域的服务帐户运行,该帐户有权遍历您的代理。您可以通过临时运行网站来测试这一点(应该是临时的,因为这是一种可怕的安全措施)。
您正在使用的图像可能需要凭据才能访问(尝试在Firefox中使用空cookie提取图像并验证是否需要凭据才能访问它)。如果它需要Windows身份验证,则代理安全性的相同解决方案可能适用于远程映像上所需的身份验证。如果它需要其他形式的身份验证,您最好下载并将图像嵌入到项目中。
也可以使用代码中的其他方法下载图像,并将其转换为字节数组以包含在报告中。网上有很多这方面的例子,包括Stack Overflow 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>
希望其中一项或两项都有所帮助。
杰里
答案 1 :(得分:3)
将外部图像文件名传递给ReportViewer参数时,请传递如下格式:file:// C:\ app \ images \ pic.jpg。其他任何通常在部署时都不能正常工作。
答案 2 :(得分:2)
好的,这是我们的解决方案。 Web服务器无法将自己的合格DNS名称识别为URL,因此我们必须编辑C:\ Windows \ System32 \ drivers \ etc文件夹中的Hosts文件,并将主机名添加为localhost。我们添加到文件的行是:
ourserver.ourdomain.com 127.0.0.1
答案 3 :(得分:1)
您是否尝试过常规文件路径(c:/temp/somefile.bmp)?报告服务本地报告从磁盘读取文件并将其嵌入到生成的pdf文件中。确保IIS中应用程序池的标识对映像文件具有读取权限。
我们正在这样做,我们的图像被放置在网站下的img文件夹中,以及其他网站图像。我们通过使用Server.MapPath(相对路径)来避免对路径进行硬编码。
希望这有帮助
答案 4 :(得分:0)
答案 5 :(得分:0)
我认为Adobe Reader(或者PDF规范本身?)不允许出于安全目的加载外部内容。我依稀记得有一个与报告服务无关的类似问题(我动态生成PDF并使用变量徽标并且必须嵌入它们)。
答案 6 :(得分:0)
我解决了这个问题:
//For local relative paths
string imgUrl = new Uri(HttpContext.Current.Server.MapPath("~/images/mylocalimage.jpg")).AbsoluteUri;
// OR
// For complete URLs
{
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; // This allows reportViewer to download image from url
string imgUrl = /* Your image URL ("http://") */;
}
//Then pass imgUrl parameter as external source of your image.