我正在使用 Crystal 在我的项目中显示报告,并且我希望能够在用户从我的 UI 中选择要显示的报告时向用户显示报告的小预览或缩略图图像。有没有办法从代码中动态生成这些缩略图?
用户可以选择通过在报告文件夹中添加或删除报告来添加或删除报告,因此仅手动制作所有缩略图并不是一个真正的选择。
我正在使用 Crystal 在我的项目中显示报告,并且我希望能够在用户从我的 UI 中选择要显示的报告时向用户显示报告的小预览或缩略图图像。有没有办法从代码中动态生成这些缩略图?
用户可以选择通过在报告文件夹中添加或删除报告来添加或删除报告,因此仅手动制作所有缩略图并不是一个真正的选择。
我使用 DSOFile 对象获取报告中的缩略图,然后使用 AxHost 将返回的对象转换为我可以显示的图像。这不是我想要的解决方案,但 DSOFile 是可自由分发的,所以我想这将有效,直到我找到更好的东西。
这是我的代码,归结为最低限度:
namespace Ibs.Ui.OrderPrint
{
public partial class OrderPrintEdit
{
public OrderPrintEdit()
{
InitializeComponent();
}
#region -- reports_SelectedIndexChanged(sender, e) Event Handler --
private void reports_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
DSOFile.OleDocumentPropertiesClass oleDocumentPropertiesClass = new DSOFile.OleDocumentPropertiesClass();
DirectoryInfo reportDirectory = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Reports");
oleDocumentPropertiesClass.Open(reportDirectory + "\\" + reports.Text,true,DSOFile.dsoFileOpenOptions.dsoOptionDontAutoCreate);
Object thumbnail = oleDocumentPropertiesClass.SummaryProperties.Thumbnail;
if (thumbnail != null)
{
reportThumbnail.BackgroundImage = IPictureDispHost.GetPictureFromIPicture(thumbnail);
}
else
{
reportThumbnail.BackgroundImage = null;
}
oleDocumentPropertiesClass.Close(false);
}
catch (Exception ex)
{
}
}
#endregion
}
internal sealed class IPictureDispHost : AxHost
{
private IPictureDispHost() : base("{63109182-966B-4e3c-A8B2-8BC4A88D221C}")
{
}
/// <summary>
/// Convert the dispatch interface into an image object.
/// </summary>
/// <param name="picture">The picture interface</param>
/// <returns>An image instance.</returns>
public new static Image GetPictureFromIPicture(object picture)
{
return AxHost.GetPictureFromIPicture(picture);
}
}
}
我在表单加载时填充了一个带有报告名称的组合框。在 SelectedIndexChanged 事件中,我从报表中获取 Thumbnail 对象并将其传递给转换方法。这也适用于 Office 文档。