2012-03-01 87 views
4

我正在Crystal Reports中开发报告,需要渲染一些数学公式和方程式。公式和公式以纯文本格式(使用LaTeX标记)存储在SQL Server数据库中。有没有办法在Crystal Reports中渲染LaTeX方程?

让他们在HTML中呈现不是问题,因为我使用MathJax在浏览器级别(HTML或CSS或MathML)完成工作。

真正的问题是:我怎样才能让这些方程在报告中呈现?我在网上搜索,没有发现任何关于它的信息。在Crystal界面上进行更多搜索时,我发现的唯一一件事就是在报表中插入(过时的)“Microsoft公式编辑器”作为OLE对象,但这两者都无效。

那么,如何在这个Crystal报表中渲染这些LaTeX数学方程?是否有一些(模糊的)组件/插件可以完成这项工作?如果没有,是否有更好的方式来做到这一点?有人已经得到并解决了类似的用例?

OBS 1:我必须在PDF中生成此报告,因为我的工作中已经验证过使用的标准。

OBS 2:将生成此报告的应用程序是一个ASP.NET MVC 3 Web应用程序,带有SQL Server 2008数据库(使用NHibernate)。

+1

我不知道水晶不够好,但你可能需要打已经乳胶安装一个Web服务,并得到任何一个渲染PDF | PostScript | PNG(无论)包括在报告中。 – Xailor 2012-03-01 15:27:06

+0

同样,我对LaTeX并不是很熟悉,但是您将Crystal中的文本字段设置为HTML(所有都是有限的功能) - 这可能有助于 – 2012-03-01 15:45:40

+0

这些方程是静态的还是动态的?也就是说,你是否期望他们凭借数据改变? – Orbling 2012-03-01 21:53:20

回答

0

我发现一种解决方法是在同一时间优雅并不依赖于使用C来扩展水晶报表。

我发现了这个小而简单的“latex equation renderer”:mimeTeX。使用它,我可以将渲染胶乳公式成GIF图像(作为CGI应用程序)。与此同时,我在报表获取数据的数据表中创建了一个幻像字节数组字段

这里是我做了什么:

  1. 恢复从我真正的数据库乳胶公式标记;
  2. 查询mimeTeX使用这个标记和mimeTeX返回一个gif图像;
  3. 采取此图像并将其转换为PNG格式(水晶意外地不支持GIF文件);
  4. 最后把这个PN​​G图像(它的字节)放在报告使用的数据表中创建的幻像字段中;
  5. 现在您可以在报告中使用此字段!生成并显示每个记录(方程)的图像都没有问题!

唯一的缺点我发现到现在为止使用这种方法的缺点是 所有图像streched到现场占位符的尺寸相同。如果图像的尺寸变化很大,则会显示一些像素化图像,而其他图像会变得“被压扁”。但我期待着如何解决这个问题!

---编辑---

解决了 “压扁的图像” 的问题。我将代码中的图像调整为保持纵横比,并将它们粘贴到固定大小的图像中。现在所有的图像都有相同的尺寸,不会被挤压!

下面是调整大小代码:

MemoryStream ResizeImage(Stream OriginalFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider) 
{ 
    int finalWidth = NewWidth; 
    int finalHeight = MaxHeight; 

    System.Drawing.Image FullsizeImage = System.Drawing.Image.FromStream(OriginalFile); 

    // Prevent using images internal thumbnail 
    FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); 
    FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); 

    if (OnlyResizeIfWider) 
    { 
     if (FullsizeImage.Width <= NewWidth) 
     { 
      NewWidth = FullsizeImage.Width; 
     } 
    } 

    int NewHeight = FullsizeImage.Height * NewWidth/FullsizeImage.Width; 
    if (NewHeight > MaxHeight) 
    { 
     // Resize with height instead 
     NewWidth = FullsizeImage.Width * MaxHeight/FullsizeImage.Height; 
     NewHeight = MaxHeight; 
    } 

    System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero); 

    // Clear handle to original file so that we can overwrite it if necessary 
    FullsizeImage.Dispose(); 

    MemoryStream bmpStream = new MemoryStream(); 

    // Put in a new image of A x B pixels to evict distortion 
    using (var bitmap = new Bitmap(finalWidth, finalHeight)) 
    { 
     using (var canvas = Graphics.FromImage(bitmap)) 
     { 
      canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      canvas.Clear(Color.White); 
      canvas.DrawImage(NewImage, 0, 0); 
      canvas.Save(); 
     } 

     bitmap.Save(bmpStream, ImageFormat.Bmp); 
    } 

    return bmpStream; 
} 
1

您需要创建一个user-function library (UFL)来执行此操作。将公式的LaTeX表示形式传递给UFL,生成公式的图像表示形式,返回图像的URL。

要使用的路径,插入“图片”,然后引用UFL的功能在“图形位置”属性:

//Insert | Picture...; graphic location conditional formula 
latex({table.latex_field}) 
+0

这个解决方案似乎是最好的(通过使用API​​等),但似乎有点“过度”,因为该项目完全用C#开发。对于像这样的解决方案,回归纯C有点“超出范围”。不过很高兴知道Crystal Reports具有扩展点! – 2012-03-06 17:45:06

+0

如果有帮助,您还可以在Delphi,COM和Java中构建UFL。 – craig 2012-03-08 13:30:09

相关问题