astReport 2018.2支持导出中的矢量图形,现在一些条形码和SVG图像以矢量形式导出,适用于导出为PDF,HTML和SVG。条形码——只能将线性条形码导出为矢量图像,在当前版本的2018.2.22中,在PDF导出设置窗口中添加了矢量图像设置的特殊选项卡——“Vector Graphics矢量图形”。
这里我们有两种类型的设置——渐变质量和曲线。渐变的质量影响过渡的平滑度,即阴影的数量,渐变插值确定点处的渐变的维度。曲线插值允许绘制具有给定数量的段的曲线,相反,指定将用于创建段的点数,插值使曲线更圆,插值越高,获得的曲线越圆。旧版本的一些PDF阅读器在显示矢量图形方面存在问题,因此FastReport开发了自己的曲线构建器,如果关闭插值选项,PDF阅读器将选择如何构建曲线。
下面来看看渐变设置,PDF中的渐变是在渐变网格上生成的,即生成网格,在网格节点上计算网格颜色,然后创建复杂渐变。渐变的质量会影响将生成的网格的大小,渐变质量越高,生成的网格就越准确。但是,图像创建的速度将受到影响,渐变的插值显示PDF中将使用的网格大小,值越高,越漂亮,但磁盘上将占用更多空间。如果设置低质量并插值256,则这是渐变的外观:
高质量,插值256。
眼睛几乎看不到差异,但在复杂的梯度上可以更好地看到这种差异。例如,低质量:
高质量。
但是,如果将梯度插值的值更改为最小值,则通常的线性渐变会立即显示出差异。例如,插值2:
插值为16:
现在考虑曲线的插值是如何操作的,例如有一个SVG图像——圆圈,使用标签实现:
使用8段进行渲染,设置值8来插入曲线:
插值越大,曲线越圆,例如,通过较大的圆圈近似,可以看到:
可以看出,圆圈完全不是圆形的,它由许多部分组成。这里的情况与曲线完全相同,毕竟,符号也包含曲线。因此,文本插值的值越大,看起来越“定性”。“为什么需要这些设置?显然,需要使用最大设置来获得高质量的图像。 但是高设置会显着增加生成文件的大小。如果不需要最高质量的渐变和曲线,可以牺牲它们来减小文档的大小并提高其创建速度。 乍一看,新选项似乎对普通用户没什么用处,但是那些使用矢量图形的人会青睐它们,FastReport提供了SVG图像渲染器。
点击“了解更多”下载产品最新版
↓↓↓
ASTREPORT VCL提供了创建报表所需的所有工具,包括报表引擎,可视化的报表设计器,预览窗口,对话框设计工具,以及Pascal-like 宏解释程序。它可用于在Embarcadero(比如Borland和CodeGear)Delphi 7-XE8和C++Builder 2005-XE8、Embarcadero RAD Studio 10 Seattle等开发工具中。
报告生成器FastReport VCL是一种在您的软件中集成商业智能的现代解决方案。它是为希望使用现成组件进行报告的开发人员创建的,具有使用简单、方便和小型分发的特点,几乎可以在任何现代PC上提供高性能和高性能。
FastReport VCL v6.5.7最新试用版+编译演示demo下载:https://www.fastreportcn.com/download.html
Delphi报表神器FastReport VCL v6.5.7来啦!那些个糟心BUG已修复
看看让你头疼的问题是否已解决?
-修复了DataMatrix c40和txt编码的特殊符号
-修复了在Windows 10下在RichView控件中加载RTF文件的问题(有时以纯文本格式加载)
+将GS1Rule属性添加到DataMatrix条形码(自动支持GS1规则)
-修复了XObject列表在每页上都清除时PDF导出中的错误,该错误会增加带有图片的PDF文件的大小
+为所有条形码类型添加了新的ColorBar属性(设置条形码数据的颜色)
-修复了大型XLS(Excel 97 BIFF8)文件中的错误
-修复了客户端/服务器组件中的导出文件名(从Web浏览器)
-修复了使用GapX, GapY < 0的PDF导出
[6.5.1-6.5.5]
-修复了从Web浏览器导出带有对话框页面的报表时的客户端/服务器组件
-修复了MDI预览中的快速按钮
-针对frxSynMemo的HiDPI修复:保存/加载不同DPI、GutterWidth、线条标记、断点标记的字体大小
-针对RegEditorsDialog的HiDPI修复:复选框、组合框箭头、首次显示时的下拉列表宽度
-修复了HiDPI报表设计器中StatusBar上图标的绘制
-修复了HiDPI的TfrxTreePanel FileterMinWidth/FileterMaxWidth
-修复了字体组合框预览(HiDPI)中的字体大小
-修复了字体组合框(HiDPI)中的字体预览位置
-修复了当主监视器的缩放比例大于150%时,在HiDPI模式下的band字幕
-修复了HiDPI中的TfrxComboBox.ListWidth(具有HiRes的主监视器)
-修复了在HiDPI Per-Monitor V2模式下的系统对话框(字体/颜色)
-修复了报表设计器中ComboBox位置的低自定义缩放比例(小于150%)
-修复了HiDPI模式下的frxProgress对话框
-修复了低缩放值(小于150%)的图像资源
-修复了数据集编辑器中的错误锚点
-修复了关闭预览后内部数据集的数据树闪烁的问题
点击“了解更多”免费体验最新版,附编译演示demo,用户手册,帮助文档
们已经讨论过如何将报表发送到数据库中的一组电子邮件。在本文中,我们将做同样的事情,但对于.Net Core MVC平台上的Web应用程序。我们的任务是从某个数据库中获取电子邮件地址和用户名列表,并将带有附加报表的电子邮件发送到这些邮箱。我们使用MS SQL Server数据库。
创建一个ASP应用程序.Net Core MVC应用程序。首先,使用NuGet Packages Manager将必要的库添加到项目中。在一般的nuget存储库中,我们找到并安装包:
从本地存储库 - FastReport.Net安装目录中的Nuget文件夹,安装软件包:
现在我们将使用数据库和表的类本质创建工作上下文。为此,请打开包控制台Nuget。打开Tools - > Nuget Package Manager - >Package Manager Console menu(包管理器控制台菜单)。在控制台中,键入以下命令:
Server=localhost;Database=testdb;Trusted_Connection=True;
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 当然,在这里您必须指定数据库服务器的连接字符串和数据模型的文件夹(默认情况下为Models)。
PM> scaffold-dbcontext“Server = localhost; Database = testdb; Trusted_Connection = True;”
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 之后,理论上,应该将两个文件添加到Models文件夹:context和table实体。在我的例子中,这是testdbContext.cs和Emails.cs。 但是,在文件生成期间可能会发生错误:
错误MSB4064:“Csc”任务不支持“SharedCompilationId”参数。
有一个可设置的公共实例属性。 如果发生这种情况,请在NuGet包管理器中再添加一个包:
Microsoft.Net.Compillers
让我们马上将FastReport连接到我们的项目。在Startup.cs文件中,添加以下行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); … }
现在回到数据模型。要从数据库中获取记录,我们需要创建GetEmails方法。创建用于处理数据的类Facade:
namespace WebMailing.Models { public static class Facade { public static List<Emails> GetEmails() { using (Models.testdbContext context = new Models.testdbContext()) { var emails = (from adresses in context.Emails select adresses).ToList(); return emails; } } } }
我们来看看'HomeController'控制器吧。在Index方法中,加载报表以在站点的主页上显示它:
using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using WebMailing.Models; using FastReport; using FastReport.Export.Pdf; using FastReport.Export.Email; using FastReport.Web; … public IActionResult Index() { WebReport webReport = new WebReport(); webReport.Report.Load(Environment.CurrentDirectory + "/text.frx"); ViewBag.WebReport = webReport; return View(); }
我们将添加两种发送电子邮件的方法。第一个将在问候语中发送带有客户名称的私人信件,第二个将向一组地址发送一个字母。 所以,第一种方法是:
[HttpPost] public ActionResult SendMail() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export List<Emails> emails = Models.Facade.GetEmails(); foreach (Emails item in emails) { SendMessage(report1, pdf, email, item.Email, item.Name); } return View(); }
使用它,我们创建了一个报表,导出为PDF,导出到电子邮件。然后,在循环中,我们从表中获取记录并调用发送字母的方法。作为参数,我们传递报表对象,导出PDF,导出到电子邮件,电子邮件地址和客户端名称。以下是发送信件的方法:
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName) { string message = "This is test message."; email.Account.Address = "gromozekaster@yandex.ru"; email.Account.Name = "Test User"; email.Account.Host = "smtp.yandex.ru"; email.Account.Port = 25; email.Account.UserName = "Gromozekaster"; email.Account.Password = "*****"; //Your password email.Account.MessageTemplate = "Test"; email.Account.EnableSSL = true; //email addressee settings email.Address = recipient; email.Subject = "TestMessage"; email.MessageBody = custName is null ? message : string.Format("Dear, {0}! {1}", custName, message); email.Export = pdf; //Set export type email.SendEmail(report); //Send email }
在其中,我们设置了一个电子邮件客户端来发送信件。并立即添加第二种方法,将一个字母发送到一组地址:
[HttpPost] public ActionResult SendAll() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export List<Emails> emails = Models.Facade.GetEmails(); string addresses = ""; foreach (Emails item in emails) { if (addresses == "") addresses = item.Email; else addresses = addresses + ", " + item.Email; } SendMessage(report1, pdf, email, addresses, null); return View(); }
正如您所看到的,它与之前的方法非常相似,唯一的区别是在循环中我们收到所有电子邮件地址,并发送一次这封信。作为电子邮件参数,我们传递一个包含所有电子邮件地址的字符串变量,但我们不传递客户端名称。
对于SendMail()和SendAll()方法,我们需要创建相同名称的视图 - 视图。 他们的内容非常简单:
@{ ViewBag.Message = "Report was sent"; } @ViewBag.Message
我们只是告知发送。让我们转到Index.cshtml视图。在其中,我们需要添加两个按钮来使用不同的方法发送字母,以及显示报表:
@{ ViewData["Title"] = "Home Page"; } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script> <form action="SendMail" method="POST"> <input type="button" id="SendPersonal" value="Send Personal Email"> <input type="button" id="SendAll" value="Send Email to All"> <div class="answer"/> </form> <script type="text/javascript"> $('#SendPersonal').on("click", function () { $.ajax({ type: 'POST', // dispatch method url: '@Url.Action("SendMail", "Home")', // path to handler dataType: 'text', success: function (data) { $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer } }); return false; }) $('#SendAll').on("click", function () { $.ajax({ type: 'POST', // dispatch method url: '@Url.Action("SendAll", "Home")', // path to handler dataType: 'text', success: function (data) { $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer } }); return false; }) </script> @await ViewBag.WebReport.Render()
要使用ajax jquery,我们添加了一个指向jquery.min.js脚本的链接。接下来,为每个表单添加一个带有两个按钮和两个脚本的表单。脚本非常简单 - 从控制器调用方法并返回结果视图。
最后 - 我们从Index方法推导出报表。让我们运行应用程序,看看我们的网页是什么样的:
我们通过不同的方式发信:
和:
在第一种情况下,在信函的文本中,我们通过名称引用客户端,在第二种情况下,没有,就这样。
点击“了解更多”下载产品最新试用版
↓↓↓
*请认真填写需求信息,我们会在24小时内与您取得联系。