Я нашел обходной путь, который в то же время элегантен и не основан на расширении Crystal Reports с использованием C.
Я нашел это маленькое и простое "уравнение латекса"рендер ": mimeTeX .Используя его, я могу преобразовать уравнения латекса в изображения GIF (как приложение CGI).После этого я создал поле массива фантомных байтов в таблице данных, в которую отчет получает данные.
Вот что я сделал:
- Восстановлениеразметка уравнения латекса из моей реальной базы данных;
- Запросите mimeTeX, используя эту разметку, и mimeTeX вернет изображение в формате gif;
- Возьмите это изображение и преобразуйте его в формат png (Crystal неожиданно не поддерживает файлы GIF);
- Наконецпоместите это PNG-изображение (его байты) в фантомное поле, созданное в таблице данных, используемой отчетом;
- Теперь вы можете использовать это поле в отчете!Изображения для каждой записи (уравнения) генерируются и отображаются без проблем!
Недостаток 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;
}