Crystal Reports、vb.net和动态图片:代码中的宽度单位度量错误



在水晶报表中动态加载图片时遇到问题。

我需要在运行时加载图片(通过公式(,并在代码中设置其宽度。cr文档中指出,当通过代码访问对象时,对象大小以twip表示。

我发现动态加载的图片并非如此。

以下是重现此问题的步骤:

  • 创建一个";10cm.jpg";具有以下规格的文件:
    • 宽度=1181像素
    • 高度=100像素
    • 密度=300 dpi

打印时,此图片的宽度为10厘米((10/2.54(*300~=1181(。

  • 创建一个新报告("10cm.rpt"(
  • 插入";10cm.jpg">
  • 按如下方式设置此图片的属性:
    • 对象名称=";MyPic1">
  • 插入另一张图片(比如10x10,其实并不重要(
  • 按如下方式设置此图片的属性:
    • 对象名称=";MyPic2">
    • 图形位置[X-2](在"图片"选项卡下(="图片";C: \路径\到\ 10cm.jpg">

这样,报告包含两个";副本";一个嵌入,一个在运行时加载。

  • 现在创建一个VB.NET/C#Windows窗体项目,并放置一个cr查看器和两个按钮

这是相关代码:

Private report As New ReportDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
report.Load("C:Pathto10cm.rpt", OpenReportMethod.OpenReportByDefault)
viewer.ReportSource = report
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim MyPic1W = report.ReportDefinition.ReportObjects("MyPic1").Width ' 5669 <-- this is in twips and the value is OK: 1mm ~= 56.69 twips
Dim MyPic2W = report.ReportDefinition.ReportObjects("MyPic2").Width ' 435 <- ????????????????????????  
End Sub ' Breakpoint here
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
report.ReportDefinition.ReportObjects("MyPic1").Width = 8504 ' MyPic1 is correctly resized to 15 cm
report.ReportDefinition.ReportObjects("MyPic2").Width = 8504 ' MyPic2 becomes really large!
viewer.ReportSource = report
End Sub

正如您在Button1_Click中看到的,MyPic1的宽度正确地用twips表示,而MyPic2的宽度用不同的单位表示。

尝试使用twipps设置图片宽度(Button2_Click(对MyPic1有效,而MyPic2变得非常大。如果我指定了一个与其未知单位成比例的值,MyPic2的大小就会正确调整:如果我将宽度设置为435*1.5~=653,它的大小就会准确地变为15cm。

有人知道这个单位是从哪里来的吗?

谢谢!

我的经验是,要求Crystal调整图像大小不是一个好主意。它可能会使rpt内存消耗激增。

最好在Crystal外部调整图像大小并动态加载生成的文件。

此处列出的至少一个UFL允许Crystal公式处理图像大小调整,以便Crystal中的"图形位置"表达式可以调整大小(在Crystal之外(,然后加载图像文件。您可以在代码中执行同样的操作。

最新更新