利用FastReport傳遞圖片參數(shù)在報(bào)表上展示簽名信息的實(shí)現(xiàn)方法
在一個(gè)項(xiàng)目中,客戶要求對(duì)報(bào)表中的簽名進(jìn)行仿手寫的簽名處理,因此我們?cè)戎皇秋@示相關(guān)人員的姓名的地方,需要采用手寫方式簽名,我們的報(bào)表是利用FastReport處理的,在利用楷體處理的時(shí)候,開發(fā)展示倒是正常效果,不過實(shí)際上在服務(wù)器運(yùn)行的時(shí)候,出來的確實(shí)正規(guī)的宋體格式,相應(yīng)的字體都已經(jīng)安裝,不過還是沒有生效。因此采用變通的方式,在對(duì)應(yīng)簽名的地方采用圖片的格式顯示,實(shí)際效果達(dá)到要求。本篇隨筆介紹這個(gè)過程,利用FastReport傳遞圖片參數(shù),在報(bào)表上展示簽名信息的處理。
在一個(gè)項(xiàng)目中,客戶要求對(duì)報(bào)表中的簽名進(jìn)行仿手寫的簽名處理,因此我們?cè)戎皇秋@示相關(guān)人員的姓名的地方,需要采用手寫方式簽名,我們的報(bào)表是利用FastReport處理的,在利用楷體處理的時(shí)候,開發(fā)展示倒是正常效果,不過實(shí)際上在服務(wù)器運(yùn)行的時(shí)候,出來的確實(shí)正規(guī)的宋體格式,相應(yīng)的字體都已經(jīng)安裝,不過還是沒有生效。因此采用變通的方式,在對(duì)應(yīng)簽名的地方采用圖片的格式顯示,實(shí)際效果達(dá)到要求。本篇隨筆介紹這個(gè)過程,利用FastReport傳遞圖片參數(shù),在報(bào)表上展示簽名信息的處理。
1、報(bào)表上的設(shè)計(jì)處理
例如我們要在報(bào)表落款的附近記錄相關(guān)人員的名字,因此采用簽名的顯示方式會(huì)比較合理。

因此設(shè)計(jì)相關(guān)的報(bào)表,本來想是采用文本的方式,變化字體的方式來快捷實(shí)現(xiàn)的


不過在報(bào)表是在服務(wù)器上生成圖片的方式,導(dǎo)致正常出來的圖片,卻沒有變化字體,導(dǎo)致出來的是正常的宋體格式。

因此考慮使用圖片的格式方式來處理。在其中放置Picture控件,如下所示。

調(diào)整好Picture控件的高度和寬度,讓它在設(shè)計(jì)的空白上合適的展示即可。
為了實(shí)現(xiàn)圖片格式的顯示,我們需要在報(bào)表的圖片控件的BeforePrint事件中解析數(shù)據(jù)(來自傳遞參數(shù)),數(shù)據(jù)格式為Base64字符串(從Byte數(shù)據(jù)轉(zhuǎn)換),如下代碼所示。
namespace FastReport
{
public class ReportScript
{
private void shopDoctorImg_BeforePrint(object sender, EventArgs e)
{
var img = GetImage("ShopDoctor");
if(img != null){
shopDoctorImg.Image=img;
}
}
private void tiaopeiImg_BeforePrint(object sender, EventArgs e)
{
var img = GetImage("Tiaopei");
if(img != null){
tiaopeiImg.Image=img;
}
}
private void CheckDoctorImg_BeforePrint(object sender, EventArgs e)
{
var img = GetImage("CheckDoctor");
if(img != null){
CheckDoctorImg.Image=img;
}
}
private void CheckPharmacistImg_BeforePrint(object sender, EventArgs e)
{
var img = GetImage("CheckPharmacist");
if(img != null){
CheckPharmacistImg.Image=img;
}
}
private Image GetImage(string signName)
{
Image img = null;
string imgStr = (string)Report.GetParameterValue(signName);
if(!string.IsNullOrEmpty(imgStr))
{
byte[] imgData= Convert.FromBase64String(imgStr);
using(MemoryStream ms = new MemoryStream(imgData))
{
img = System.Drawing.Image.FromStream(ms);
}
}
return img;
}
}
}其中主要注意的是,我們傳遞的圖片數(shù)據(jù)需要采用Base64String的格式才能正常傳遞和展示。
2、報(bào)表傳遞圖片數(shù)據(jù)
完成了報(bào)表的設(shè)計(jì)處理,我們剩下的就是在實(shí)際的報(bào)表中傳遞對(duì)應(yīng)的參數(shù)數(shù)據(jù)了。
我們把簽名圖片,放在相對(duì)的目錄上,如下所示。

然后編寫一個(gè)公用的讀取圖片為Base64String的函數(shù)處理,如下所示。
//通過姓名獲取簽名圖片的Base64
private string GetSignImage(string signName)
{
var result = "";
string imagePath = Path.Combine(baseDir, $"Report/signs/{signName}.png");
if (File.Exists(imagePath))
{
var stream = FileUtil.FileToStream(imagePath);
var image = FileUtil.StreamToBytes(stream);
if (image != null)
{
result = Convert.ToBase64String(image);
}
}
return result;
}接著就是根據(jù)對(duì)應(yīng)的報(bào)表進(jìn)行加載,并設(shè)置相關(guān)的參數(shù)進(jìn)行傳遞給報(bào)表即可,如下測(cè)試代碼所示。
//生成PDF報(bào)表文檔到具體文件
Report report = new Report();
report.Load(reportFile);
//定義參數(shù)和數(shù)據(jù)格式
var dict = new Dictionary<string, object>();
#region 測(cè)試數(shù)據(jù)源
dict.Add("Name", "張三");
dict.Add("Gender", "男");
dict.Add("Age", 32);
dict.Add("Telephone", "18620292076");
dict.Add("CreateTime", "2019-10-13 22:30:15");
dict.Add("CheckDoctor", GetSignImage("張醫(yī)生"));//"張醫(yī)生"
dict.Add("CheckPharmacist", GetSignImage("張醫(yī)生")); //"李藥師"
dict.Add("SendUser", "王小姐");
dict.Add("QrCode", "http://www.iqidi.com");
dict.Add("BarCode", "1234567890");
//圖片文件
dict.Add("ShopDoctor", GetSignImage("張醫(yī)生"));
dict.Add("Tiaopei", GetSignImage("張醫(yī)生"));
dict.Add("Fayao", GetSignImage("王小姐"));
#endregion
report.RegisterData(dt, "Detail");
foreach (string key in dict.Keys)
{
report.SetParameterValue(key, dict[key]);
}
//運(yùn)行報(bào)表
report.Prepare();由于我們的報(bào)表,最終是生成PDF或者圖片的方式,方便客戶進(jìn)行在線查詢的,因此可以選擇PDF或者圖片的格式生成。
//運(yùn)行報(bào)表
report.Prepare();
//導(dǎo)出PDF報(bào)表
//PDFExport export = new PDFExport();
//多個(gè)圖片導(dǎo)出
int count = 1;
string firstFileName = exportImgPath.Replace(".png", "");
foreach (PageBase item in report.Pages)
{
string fileName = string.Format("{0}_{1}.png", firstFileName, count);
exportImgPath = fileName;
//Resolution= 300可以提高分辨率
report.Export(new ImageExport() { PageRange = PageRange.Current, CurPage = count, Resolution= 300 }, fileName);
count++;
}最后生成的圖片格式如下所示,順利吧簽名的圖片貼在對(duì)應(yīng)的單元格中即可。

到此這篇關(guān)于利用FastReport傳遞圖片參數(shù)在報(bào)表上展示簽名信息的文章就介紹到這了,更多相關(guān)FastReport傳遞圖片參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Asp.net Core MVC中怎么把二級(jí)域名綁定到特定的控制器上
這篇文章主要介紹了Asp.net Core MVC中怎么把二級(jí)域名綁定到特定的控制器上,需要的朋友可以參考下2017-06-06
利用AJAX與數(shù)據(jù)島實(shí)現(xiàn)無刷新綁定
利用AJAX與數(shù)據(jù)島實(shí)現(xiàn)無刷新綁定...2007-03-03
四個(gè)常用的.NET的SQLHELPER方法實(shí)例
這篇文章主要介紹了四個(gè)常用的.NET的SQLHELPER方法,在WinForm的實(shí)際開發(fā)中比較常用,需要的朋友可以參考下2014-08-08
ASP.NET Core中如何實(shí)現(xiàn)重定向詳解
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何實(shí)現(xiàn)重定向的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
asp.net?Core中同名服務(wù)注冊(cè)的實(shí)現(xiàn)代碼
Asp.Net?Core中自帶了容器,同時(shí)也可以使用AutoFac替換掉默認(rèn)的容器,以下為兩種方式同名服務(wù)的注冊(cè)實(shí)現(xiàn),對(duì)asp.net?Core服務(wù)注冊(cè)的實(shí)現(xiàn)代碼感興趣的朋友一起看看吧2022-03-03
ASP.NET Core MVC 中實(shí)現(xiàn)中英文切換的示例代碼
這篇文章主要介紹了ASP.NET Core MVC 中實(shí)現(xiàn)中英文切換的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Asp.Net 通用數(shù)據(jù)操作類 (附通用數(shù)據(jù)基類)
以前經(jīng)常用php的數(shù)據(jù)操作類,這次的asp.net數(shù)據(jù)操作類,是個(gè)方法2008-07-07

