Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 有没有办法在Crystal Reports中呈现LaTeX方程?_.net_Asp.net Mvc 3_Crystal Reports_Latex - Fatal编程技术网

.net 有没有办法在Crystal Reports中呈现LaTeX方程?

.net 有没有办法在Crystal Reports中呈现LaTeX方程?,.net,asp.net-mvc-3,crystal-reports,latex,.net,Asp.net Mvc 3,Crystal Reports,Latex,我正在Crystal Reports中开发一个报告,需要在其中呈现一些数学公式和方程式。公式和方程式以纯文本形式存储在SQL Server数据库中(使用LaTeX标记) 让它们以HTML呈现不是问题,因为我使用MathJax在浏览器级别(HTML/CSS或MathML)进行工作 真正的问题是:如何在报告中呈现这些方程式?我在网上搜索了一下,什么也没找到。在Crystal界面上进行更多搜索,我发现的唯一一件事是在报告中插入(过时的)“Microsoft公式编辑器”作为OLE对象,但这两种方法都不起

我正在Crystal Reports中开发一个报告,需要在其中呈现一些数学公式和方程式。公式和方程式以纯文本形式存储在SQL Server数据库中(使用LaTeX标记)

让它们以HTML呈现不是问题,因为我使用MathJax在浏览器级别(HTML/CSS或MathML)进行工作

真正的问题是:如何在报告中呈现这些方程式?我在网上搜索了一下,什么也没找到。在Crystal界面上进行更多搜索,我发现的唯一一件事是在报告中插入(过时的)“Microsoft公式编辑器”作为OLE对象,但这两种方法都不起作用

那么,如何在水晶报告中呈现这些乳胶数学方程呢?是否有一些(模糊的)组件/插件可以完成这项工作?如果没有,有没有更好的方法?有人已经得到并解决了类似的用例

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

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

您需要创建一个应用程序来执行此操作。将公式的LaTeX表示形式传递给UFL,生成公式的图像表示形式,返回图像的URL

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

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

我发现了一种既优雅又不依赖于使用C扩展Crystal报表的解决方法

我发现了这个小而简单的“乳胶方程式渲染器”:。使用它,我能够将latex方程渲染成GIF图像(作为CGI应用程序)。这样,我在报告获取数据的数据表中创建了一个幻像字节数组字段

以下是我所做的:

  • 从我的真实数据库中恢复latex方程标记
  • 使用此标记查询mimeTeX,mimeTeX返回gif图像
  • 将此图像转换为png格式(Crystal不支持GIF文件)
  • 最后,将此PNG图像(其字节)放入报告使用的datatable中创建的phantom字段中
  • 现在您可以在报告中使用此字段!生成并显示每个记录(方程式)的图像时不会出现问题 到目前为止,我发现使用这种方法的唯一缺点是所有图像都被拉伸到相同大小的字段占位符。如果图像的大小变化很大,一些图像将被像素化显示,另一些图像将被“挤压”。但我期待着如何解决这个问题

    ---编辑---

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

    以下是调整大小的代码:

    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;
    }
    
    MemoryStream ResizeImage(流原始文件、int NewWidth、int MaxHeight、bool only resizeifwide)
    {
    int finalWidth=NewWidth;
    int finalHeight=最大高度;
    System.Drawing.Image FullsizeImage=System.Drawing.Image.FromStream(原始文件);
    //防止使用图像内部缩略图
    FULLSIZEMAGE.RotateFlip(系统图.RotateFlipType.Rotate180FlipNone);
    FULLSIZEMAGE.RotateFlip(系统图.RotateFlipType.Rotate180FlipNone);
    如果(仅限ResizeIfWide)
    {
    if(FullsizeImage.Width最大高度)
    {
    //改为使用高度调整大小
    NewWidth=FullsizeImage.Width*MaxHeight/FullsizeImage.Height;
    NewHeight=MaxHeight;
    }
    System.Drawing.Image NewImage=FullsizeImage.GetThumbnailImage(NewWidth、NewHeight、null、IntPtr.Zero);
    //清除原始文件的句柄,以便我们可以在必要时覆盖它
    FullsizeImage.Dispose();
    MemoryStream bmpStream=新的MemoryStream();
    //放入一个x B像素的新图像以消除失真
    使用(var位图=新位图(最终宽度、最终高度))
    {
    使用(var canvas=Graphics.FromImage(位图))
    {
    canvas.InterpolationMode=InterpolationMode.HighQualityBicubic;
    画布。清晰(颜色。白色);
    canvas.DrawImage(NewImage,0,0);
    canvas.Save();
    }
    保存(bmpStream,ImageFormat.Bmp);
    }
    返回BMP流;
    }
    
    我对crystal不太了解,但您可能需要访问一个安装了latex的web服务,并在所述报告中包含一个呈现的PDF | PostScript | PNG(无论什么)。同样,我对latex不太熟悉,但您可以将crystal中的文本字段设置为HTML(功能有限)-这可能有助于这些方程,它们是静态的还是动态的?也就是说,你希望它们随着数据而改变吗?@Orbling这些方程是动态的。它们由用户填写并保存在数据库中,将来可能会改变。@leettickett这个问题不仅仅表现在HTML中,因为我需要“编译”LaTeX标记到一些图像或排版上,使方程看起来像是手写的。主要是因为它可能是方程,甚至是化学公式。这个解决方案似乎是最好的(通过使用API等),但似乎有点“过度”鉴于该项目完全是用C语言开发的,回到纯C语言对于这样的解决方案来说有点“超出范围”。不过很高兴知道Crystal Reports有扩展点!如果有帮助,您还可以在Delphi、COM和Java中构建UFL。