7

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

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

更新 1

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

更新 2

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

4

7 回答 7

14

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

两个可能的答案:

首先,为了让您的应用程序将图像打包成 PDF,它必须能够从您指定的 URL 中检索图像。如果该 URL 位于代理后面(从您的应用服务器的角度来看)和/或需要凭据才能访问,这将对报表查看器的默认配置提出挑战。

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

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

也可以在代码中使用其他方式下载图像并将其转换为字节数组以包含在报告中。网上有很多这样的例子,包括这里的 Stack Overflow 。

其次,看看下面的页面:

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>

希望其中一项或两项有所帮助。

杰瑞

于 2009-08-15T21:02:30.687 回答
3

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

于 2012-05-04T20:50:01.393 回答
2

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

我们的服务器.ourdomain.com 127.0.0.1

于 2017-01-25T06:51:04.877 回答
1

我不认为 Adob​​e Reader(或者可能是 PDF 规范本身?)出于安全目的而允许加载外部内容。我隐约记得有一个与报告服务无关的类似问题(我正在动态生成 PDF 并使用可变徽标并且必须嵌入它们)。

于 2009-08-14T23:54:31.767 回答
1

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

我们正在这样做,我们的图像与其他网站图像一起放置在网站下的 img 文件夹中。我们避免使用 Server.MapPath(relative path) 对路径进行硬编码。

希望这可以帮助

于 2009-08-15T02:36:01.623 回答
1

我解决了这个问题:

//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. 
于 2019-07-03T10:18:23.483 回答
0
  1. 报表查看器可以从相对 url 获取图像吗?我从来没有使用过它,所以最好检查一下这个假设。
  2. 您是否尝试过使用 Html.Content() 帮助程序来设置 URL?每当我的网址出现问题时,因为我没有使用它来为视图生成正确的网址。
于 2009-08-12T22:04:10.457 回答