Есть ли способ визуализации уравнений LaTeX в Crystal Reports? - PullRequest
4 голосов
/ 01 марта 2012

Я разрабатываю отчет в Crystal Reports, и мне нужно отобразить в нем некоторые математические формулы и уравнения.Формулы и уравнения хранятся в базе данных SQL Server в виде простого текста (с использованием разметки LaTeX).

Получение их для визуализации в HTML не является проблемой, потому что я использую MathJax для работы на уровне браузера(либо в HTML / CSS, либо в MathML).

Реальная проблема заключается в следующем: как я могу отобразить эти уравнения в отчете?Я искал по сети и ничего не нашел об этом.Выполняя дополнительный поиск в интерфейсе Crystal, единственное, что я нашел, это вставить (устаревший) «Microsoft Equation Editor» в качестве объекта OLE в отчет, но ни один из них не сработал.

Итак, как отрендеритьэти математические уравнения LaTeX в отчете Crystal?Есть ли какой-то (неясный) компонент / плагин, который выполняет эту работу?Если нет, есть ли лучший способ сделать это?Кто-то уже получил и разрешил подобный вариант использования?

OBS 1: я должен создать этот отчет в формате PDF из-за уже утвержденных стандартов, используемых на моей работе.

OBS 2: Приложениедля создания этого отчета используется веб-приложение ASP.NET MVC 3 с базой данных SQL Server 2008 (с использованием NHibernate).

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вам нужно будет создать библиотеку пользовательских функций (UFL) , чтобы сделать это. Передайте представление формулы LaTeX в UFL, сгенерируйте представление формулы для изображения, верните URL-адрес изображения.

Чтобы использовать путь, вставьте «рисунок», а затем укажите функцию UFL в свойстве «графическое расположение»:

//Insert | Picture...; graphic location conditional formula
latex({table.latex_field})
0 голосов
/ 06 марта 2012

Я нашел обходной путь, который в то же время элегантен и не основан на расширении Crystal Reports с использованием C.

Я нашел это маленькое и простое "уравнение латекса"рендер ": mimeTeX .Используя его, я могу преобразовать уравнения латекса в изображения GIF (как приложение CGI).После этого я создал поле массива фантомных байтов в таблице данных, в которую отчет получает данные.

Вот что я сделал:

  1. Восстановлениеразметка уравнения латекса из моей реальной базы данных;
  2. Запросите mimeTeX, используя эту разметку, и mimeTeX вернет изображение в формате gif;
  3. Возьмите это изображение и преобразуйте его в формат png (Crystal неожиданно не поддерживает файлы GIF);
  4. Наконецпоместите это PNG-изображение (его байты) в фантомное поле, созданное в таблице данных, используемой отчетом;
  5. Теперь вы можете использовать это поле в отчете!Изображения для каждой записи (уравнения) генерируются и отображаются без проблем!

Недостаток only До сих пор я обнаружил, что при использовании этого подхода все изображения растянуты до одинакового размера поля заполнителя .Если размеры изображений сильно различаются, некоторые из них будут отображаться в пикселях, а другие станут «раздавленными».Но я с нетерпением жду, как решить эту проблему!

--- Edit ---

Решена проблема "сжатых изображений".Я изменяю размеры изображений в коде, сохраняя их пропорции и «вставляя» их в изображение фиксированного размера.Теперь все изображения имеют одинаковый размер и не сжимаются!

Вот код для изменения размера:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...