2012-03-01 115 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

相關問題