惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
C
Check Point Blog
M
MIT News - Artificial intelligence
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net
大猫的无限游戏
大猫的无限游戏
D
Docker
Last Week in AI
Last Week in AI
IT之家
IT之家
F
Fortinet All Blogs
A
About on SuperTechFans
P
Proofpoint News Feed
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog RSS Feed
博客园_首页
月光博客
月光博客
博客园 - 司徒正美
Y
Y Combinator Blog

博客园 - hrx521

微信公众号H5开发踩坑记:为什么POST返回的页面会显示HTML源码 SQL NOT IN 子查询存在 NULL 的经典行为陷阱--NULL 三值逻辑(TRUE / FALSE / UNKNOWN) SQL用窗口函数做逐行累计的实用用例 我的蝶翼斑马鱼繁殖要领总结 如何从操作系统的角度,理解C#语言的Async Await 异步机制内部状态机的运行原理? C#扩展方法对软件工程构建的促进示例和总结 基于原数据库新创建一个带部分数据做为初始数据的数据库的思路 sql调优记录,不要在join on 条件中使用过多的条件 发布和更新自己的nuget包 Rust的枚举类型Enum Rust语言特色语法记录 Rustup-init.exe安装后执行cargo run 报错:`link.exe` returned an unexpected error的解决办法 SQL使用Merge在一个语句中完成插入、更新和删除操作 IIS应用程序回收导致应用中Hangfire等后台任务无法正常启动工作的解决方法 Microsoft.AspNetCore.Identity 的使用记录 C# xml文档反序列化记事 债券与债券基金 Linq补充学习 Blazor学习记录_12._IIS部署_组件的引用_HTML元素的引用 Blazor学习记录_11.身份认证与授权 Blazor学习记录_10.C#和JS互操作_访问WEB API Blazor学习记录_9.预呈现_渲染树
FastReport.OpenSource .Net下开源免费报表打印组件
hrx521 · 2024-09-19 · via 博客园 - hrx521

解决了这个问题:《winForm下,fastReport.net 从.net framework 升级到.net5遇到的错误“Operation is not supported on this platform.”》

本文内容转载自: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平台的打印问题,免费好用,不用再去搜破解版、去水印版本了。