解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
本文內容轉載自:https://www.fcnsoft.com/Home/ShowArticleNews/473
最近被fastreport.net搞得有點煩躁,網上有很多破解版本下載可以下載使用,但是僅限於.net framework平臺。最近將貳葉收銀軟體TS.POS零售端升級到.net core平臺,計劃發佈到安卓和linux平臺上也可以使用。結果悲催了,列印功能不能用了,一直提供not supported on this platform ,有些報表可以列印,有些報表卻不能列印。折磨多天,網上也搜了一堆資料,結果還是沒有解決辦法。
後來安裝了官網最新24.6版本,列印全部都正常沒有問題了,但是軟體要收費,正版授權好幾千每年,不授權就會顯示version的水印出來。
過程中有想過更換其他的列印控制項,甚至想自己編一個,結果由於精力問題還是放棄了。
無意間搜到fastreport.net 原來有個開源的版本,於是安裝後試試效果。發現在winform 平臺沒有列印功能的實現,但是有個生成圖片的導出功能,我覺得這點還是可以利用上的。
1、在visual studio 的nuget管理器中搜索 FastReport.OpenSource 安裝上它。
2、按以前的操作初始化報表
FastReport.Report report = new FastReport.Report();
string file = Path.Combine(Environment.CurrentDirectory, "Frx", frx);
if(File.Exists(file)==false)
{
MessageBox.Show("印表機文件丟失");
return null;
}
report.Load(file);
report.Report.Parameters.FindByName("店名").Value = Program.單位名稱;
report.Report.Parameters.FindByName("收銀員").Value = Program.配置文件.當前登錄的用戶名稱;
report.Report.Parameters.FindByName("機器號").Value = Program.配置文件.機器標識號;
下一步我們就不用report.print()了,沒有這個函數
report.Prepare();
Stream str = new MemoryStream();
ImageExport image = new ImageExport();
image.ImageFormat = ImageExportFormat.Jpeg;
report.Export(image, str);
然後使用winform的PrintDocument控制項繪製這個圖片再列印就ok了
printDocument.Print();
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(imageToPrint, 0, 0, imageToPrint.Width, imageToPrint.Height);
}
在列印pos小票的時候這樣操作有一個問題,因為小票的列印長度是沒辦法固定的,它根據內容會有變化的、如果我們通過設置紙張的高度來處理就會出現列印分頁或者紙張底部留空白的問題。我的處理辦法是設計報表的時候設置長一些的紙張高度,等列印生成圖片的時候再將圖片的底部空白移除。
private Bitmap 移除圖片底部空白(Stream str)
{
Bitmap bmp = new Bitmap(str);
int height = bmp.Height;
int width = bmp.Width;
int bottom = 0;
for (int h = bmp.Height - 1; h > 0; h--)
{
bool notWhite = false;
for (int w = 4; w < width; w += 4)
{
if (是否白色或透明色(bmp.GetPixel(w, h)) == false)
{
notWhite = true; break;
}
}
if (notWhite == true)
{
bottom = h;
Rectangle rect = new Rectangle(0, 0, width, h + 5);
Bitmap ok = bmp.Clone(rect, bmp.PixelFormat);
return ok;
}
}
return null;
}
private bool 是否白色或透明色(Color c)
{
if (c.A < 10 || (c.R > 245 && c.G > 245 && c.B > 245))
{
return true;
}
return false;
}
先將fastreport.net 生成的圖片流發到這裡移除底部的空白,再回傳給列印控制項列印。如此即可解決列印底部留空白的問題。
printDocument.DefaultPageSettings.PaperSize.Height = imageToPrint.Height;
這一行代碼切記不可以遺漏,這樣才能剛好列印全部的報表內容。
按此方法,即可解決fastreport 在winform平臺的列印問題,免費好用,不用再去搜破解版、去水印版本了。