1

我有一个 SSRS 2008 报告,其中包含一个包含并配置为呈现为 HTML 的字段。此字段中的某些文本可能包含 IMG 标签,并且 IMG 标签不在 SSRS 在其 HTML 呈现扩展中原生支持的标签中。

我正在尝试找到一种方法来编写一个自定义处理程序来挂钩该字段的处理,这将让我在 SSRS 处理程序处理它之前查看原始 HTML,以期获取 IMG 标签,提取 SRC URL 并获取以 SSRS 将接受的方式动态插入的图像的原始字节,但保留 HTML SSRS 将呈现。

从到目前为止我所阅读和看到的内容来看,如果一个字段被标记为呈现为 HTML,SSRS 处理器会在任何处理程序修改它之前抓取它并完全解析它,这意味着 IMG 标记在我可以之前被(将)丢弃用它做任何事情(甚至知道它存在)。我看到的唯一选择是完全关闭 HTML 渲染,从而失去了 SSRS可以识别的标签的好处。

编辑:根据 Jamie 在下面的回复,我开始认为这个问题的“第二部分”可能比我意识到的更难:是否甚至可以在运行时以编程方式将图像添加到 SSRS 报告中(显然是通过代码/自定义程序集)? 也就是说,我想编写一些看起来像这样的代码(伪代码)

'Conceptual Pseudocode I'd like to be able to write
'for dynamic addition of Image element in SSRS report
'Is this even possible?? Is there a documented Report 
'object model??

Public Function AddImage(imageBytes() as Byte) as Image

    Dim newImage as New Image()
    newImage.SetBytes(imageBytes)
    Report.Add(newImage)

    return newImage

End Function

我希望我只是忽略了一些简单的东西,它阻止我获取原始的、未处理的 HTML,并且其他人可能能够指出我如何获取它的正确方向。

4

2 回答 2

2

编辑我已经在 SSRS 开发环境中创建并实现了这个解决方案并且它可以工作。WOOHOO :) 创建单线程单元线程来托管 WebBrowser 控件并创建消息泵确实需要一些跳跃,但它确实有效!* *

当我在向一位同事输入信息时,说这个问题不是首发的,我确实对解决这个问题的方法有了一点启发。我知道这篇文章没有引起很大的反响,但以防万一其他人发现自己遇到类似的问题,我将分享我在“培养皿”场景中实现的内容,只要我得到所有代码权限问题都解决了,应该可以让我很好地解决这个问题。

由于 SSRS 无法处理无法克服的 IMG 标签,我实际上想到了一个将 HTML 渲染完全脱离 SSRS 的想法。为此,我创建了自定义代码,将 HTML 呈现交给 WebBrowser 控件,然后将呈现的结果复制为图像。它执行以下操作:

  1. 实例化给定宽度和高度的 WebBrowser 控件。
  2. 将该控件的 DocumentText 属性设置为来自 TinyMCE 的 HTML
  3. 等待 DocumentText 完全呈现。
  4. 创建一个与控件大小相等的位图。
  5. 使用 WebBrowser 的未记录且可能不受支持的 DrawToBitmap 方法将呈现的 HTML 绘制到位图。
  6. 将位图复制到图像
  7. 将图像另存为 .png 文件
  8. 作为函数的结果返回 .png 的路径。

在 SSRS 中,我计划用外部 Image 控件替换以前的 HTML 文本字段,然后该控件将调用上述方法并呈现图像文件。我可能会更改它以直接将图像绘制到 SSRS Image 控件,但这是我稍后会解决的最后一个细节。我认为这个基本设计会奏效。它有点笨拙,但我认为它会起作用。

我有一些权限问题需要解决 SSRS 允许我在运行时调用的代码,但我相信我会解决这些问题(即使我最终将代码移动到单独的程序集)。一旦经过测试和工作,我计划将其标记为答案。

感谢那些提供建议的人。

于 2013-11-14T22:52:47.243 回答
1

我已经成功地完成了类似的事情:我们有一个收集在 Web 表单上的 HTML“评论”字段。对于特定报告,我们希望将此字段截断为前 1000 个字符左右,但保留有效的 HTML。

所以我创建了一个带有公共函数的 C# .dll 和类:

public static string TruncateHtml(string html, int characters)
{
   ...
}

(我使用HtmlAgilityPack进行大部分 HTML 解析,并创建和关闭我的新 HTML 字符串,同时跟踪内容长度。)

然后我可以在 SSRS 表达式中使用函数的完全限定路径调用该代码:

=ReportHtmlHandler.HtmlTruncate.TruncateHtml(Fields!Comment.Value, 1000)

我可以用这个在我的数据集中添加一个计算字段,但我只将此值用于一个字段,所以我将它保留在字段表达式级别。

在 SSRS 处理或呈现 HTML 之前,所有这些代码都会被调用。我确信任何原始的 IMG 标记都会在字符串中。

这种方法可能对您有用,可能会创建一个ExtractImg函数,该函数可以设置为报告中 img 的来源。我认为满足您的要求的一些棘手部分将是处理多个图像以及嵌入提取的 img。但是您可以简单地通过对图像的外部引用来做到这一点。我对 SSRS 中的外部图像做的不多。

关于从 SSRS 调用自定义 dll 的 MSDN 博客条目:http: //support.microsoft.com/kb/920769

于 2013-11-12T15:16:46.970 回答