一些內部OA或者流轉的文件,或者給一些客戶的報價文件、合同,或者一些醫院出示的給保險機構的病歷資料等,有時候可能都希望快速的使用電子簽章的處理方式來給文件蓋上特定的印章,本篇隨筆介紹基于Vue&Element的前端項目采用第三方組件
vue-drag-resize和圖片轉換Base64的方式實現圖片印章的蓋章處理。
圖片轉換為Base64編碼可以通過在線工具的轉換方式實現圖片轉Base64編碼,網上很多在線的處理,百度一下即可。
如:https://c.runoob.com/front-end/59/ 或者 https://tool.chinaz.com/tools/imgtobase 試過都可以,非常方便。
如果我們喜歡通過C#代碼進行圖片的轉換也可以使用自己封裝的函數實現處理,如下所示。
Base64 在CSS中的使用
.demoImg{ background-image: url("data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAAL...."); }
Base64 在HTML中的使用
<img width="40" height="30" src="data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAAL...." />
我們使用C#代碼轉換的處理代碼如下所示。
private void btnBase64_Click(object sender, EventArgs e)
{
var base64 = ImageHelper.ImageToBase64Str(this.pictureBox1.Image);
if(chkData.Checked)
{
base64 = "data:image/jpeg;base64," + base64;
}
this.txtBase64.Text = base64;
}
而其中調用是通過我們公用類庫中的圖片輔助類進行,詳細轉換代碼如下所示。
/// <summary>
/// 從文件中轉換圖片對象到Base64編碼
/// </summary>
/// <param name="imageFilePath">圖片文件路徑</param>
/// <returns></returns>
public static string ImageToBase64Str(string imageFilePath)
{
Image image = Image.FromFile(imageFilePath);
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, image.RawFormat);//ImageFormat.Jpeg
byte[] imageBytes = ms.GetBuffer();
string imgBase64Str = Convert.ToBase64String(imageBytes);
//釋放資源,讓別的使用
image.Dispose();
return imgBase64Str;
}
}
/// <summary>
/// 轉換圖片對象到Base64編碼
/// </summary>
/// <param name="image">Image圖片對象</param>
/// <returns></returns>
public static string ImageToBase64Str(Image image)
{
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, image.RawFormat);//ImageFormat.Jpeg
byte[] imageBytes = ms.GetBuffer();
string imgBase64Str = Convert.ToBase64String(imageBytes);
return imgBase64Str;
}
}
這樣,我們在前端Vue的項目中,就可以賦值這段圖片Base64代碼到HTML文件中就可以了,如下是前端Vue項目代碼所示(縮減了部分Base64編碼)。
這樣我們就可以在頁面中放置一個Base64編碼的圖片在頁面中了。
常規的圖片,放置在頁面中,位置是固定的,如果我們需要拖動印章,那么就需要引入可拖動面板的Vue組件vue-drag-resize來處理它了。
vue-drag-resize是Github上的一個開源組件,地址是:https://github.com/kirillmurashov/vue-drag-resize
這個組件的使用和其他組件的使用方式一樣,非常方便。
import Vue from 'vue'
import VueDragResize from 'vue-drag-resize'
Vue.component('vue-drag-resize', VueDragResize)
在組件或者頁面中使用的代碼如下所示。
import VueDragResize from 'vue-drag-resize'
export default {
components: { VueDragResize },
它的HTML代碼如下所示。
<template>
<div id="app">
<VueDragResize :isActive="true" :w="200" :h="200" v-on:resizing="resize" v-on:dragging="resize">
<h3>Hello World!</h3>
<p>{{ top }} х {{ left }} </p>
<p>{{ width }} х {{ height }}</p>
</VueDragResize>
</div>
</template>
為了把印章圖片可以拖動,我們在HTML中放置印章圖片包含在這個組件面板中。
如下面代碼所示。
把圖片放置在這個組件容器中后,圖片就可以隨意拖動,確認位置后,就可以確定它的位置,我們可以通過記錄圖片的位置X, Y的值并存儲起來,下次直接確定位置也可以。
定義組件的初始X位置。
<vue-drag-resize :x="0">
定義組件的初始Y位置。
<vue-drag-resize :y="0">
例如我們定義了一個報價單,并通過設置,把圖片放置在頁面中,讓使用者可以通過拖動印章的方式,放到合適的位置上去,然后進行打印報價單即可帶有印章的報價單出來了。
這樣就可以實現電子印章的拖動和放置處理了,記住其位置和狀態,下次就可以直接定位到指定的位置上了。
另外,一般文檔都需要打印,關于打印的處理,有很多方式,可以使用print.js(https://github.com/crabbly/Print.js),也可以使用 vue-print-nb (https://github.com/Power-kxLee/vue-print-nb),甚至復雜的定義可以考慮使用CLODOP組件來處理,不過我們這里可以簡單的內置Windows 對象的打印操作方式來處理普通的頁面打印即可。
print () {
const print = this.$refs.print.innerHTML
const printPart = print + csstyle;
const newTab = window.open('_blank');
newTab.document.body.innerHTML = printPart;
newTab.print();
newTab.close();
},
打印效果如下所示,采用了對應的CSS樣式處理后,和實際的頁面效果相當。
由于window.print是1:1打印,打印內容過寬時,瀏覽器會自動從左截取掉超寬部分,因此在打印前需將頁面進行調整
打印頁邊距設定為 0mm 時,網頁內最大元素的分辨率:794×1123
因此可以將內容div設置為700px,剩余空間設置為頁邊距
頁眉打印默認有頁眉頁腳信息,展現到頁面外邊距范圍,我們可以通過去除頁面模型page的外邊距,使得內容不會延伸到頁面的邊緣,再通過設置 body 元素的 margin 來保證 A4 紙打印出來的頁面帶有外邊距
由于window.print打印自帶頁眉頁腳,用于存放打印url,日期時間,頁面名稱等內容,為屏蔽這些內容可使用css進行屏蔽
@media print {
@page {
margin: 0;
}
body {
margin: 1cm;
}
}
只屏蔽頁腳
@page { margin-bottom: 0; }
有兩個事件可以監聽到到打印事件,一個是beforeprint,一個是afterprint,分別表示打印事件觸發前后。
這個事件在 IE6 就已經支持了,兼容大概是 Firefox、IE全支持, Chrome63+支持, Safari暫不支持
我們可在處理事件onbeforeprint() 將一些不需要打印的元素隱藏,和打印后的處理事件 onafterprint()放開隱藏的元素
window.addEventListener('beforeprint', ()=> {
document.body.innerHTML = '打印前觸發';
});
window.addEventListener('afterprint', ()=> {
document.body.innerHTML = '打印后觸發';
});
@media print {
@page {
// 縱向
size: portrait;
// 橫向
size: landscape;
// 邊距
margin: 0cm 0cm 0cm 0cm;
}
}
文章轉自https://www.cnblogs.com/wuhuacong/p/16033604.html
多使用 ActiveReports 制作報表的用戶都在思考一個問題:當報表加載完成之后,ActiveReports 能否幫助瀏覽器直接跳轉到打印預覽界面,自動執行打印操作?
下面,小編就來為大家介紹如何在 Web 打印過程中,將預覽報表頁面隱藏,從而實現直接打印。
FlashViewer
1. 新建ASP.NET 工程
2. 添加Web頁面
3. 在界面中添加 WebViewer,并設置 ViewType 屬性為 FlashViewer
4. 添加報表
5. 將 FlashViewer 的 ReportName 屬性設置為 RdlReport1.rdlx
6. FlashViewer 提供兩種方式來實現直接打印。
使用 StartPrint 屬性
展開 FlashViewerOptions 屬性的,設置 StartPrint 屬性為True。當執行打印報表時,會顯示打印對話框
使用腳本實現
1. 首先設置 FlashViewer 的 UserClientApi 屬性為 True。
2. 打開頁面, 在 OnLoadProgress 事件中,添加以下腳本代碼。你可以直接使用 State 屬性來檢測報表是否加載完成,并使用Print方法來調用系統的打印對話框。
<script language="javascript" type="text/javascript">
//javascript
var viewer;
function init()
{
GrapeCity.ActiveReports.Viewer.OnLoad("WebViewer1", function () {
viewer = GrapeCity.ActiveReports.Viewer.Attach("WebViewer1");
viewer.setEventsHandler({
OnLoadProgress: function(e) {
if (e.State == "Completed") {
// Set printing options
var ops = viewer.CreatePrintOptions();
// Modify paper orientation
ops.AdjustPaperOrientation = "Auto";
// Modify page scaling
ops.ScalePages = "Auto";
// Clear page range settings
ops.ClearPageRanges();
// Set page range
ops.AddPageRange(1, e.PageCount);
// Start printing
viewer.Print(ops);
}
}
})
})
}
</script>
以上就是將預覽報表頁面隱藏,從而實現直接打印的步驟。僅需要幾步簡單的設置,就能輕輕松松實現跳過預覽的直接打印。
下載 Demo,免費試用 ActiveReports
請通過以下方式聯系葡萄城,獲取以上 Demo 和 ActiveReports 的免費試用版。
微信:GrapeCityDT
郵件:marketing.xa@grapecity.com
官網:www.gcpowertools.com.cn
關于葡萄城控件
葡萄城是一家跨國軟件研發集團,專注控件領域近30年,是全球最大的控件提供商,也是微軟認證的金牌合作伙伴。
為主要做Android開發,最近接觸hybrid開發,遇到一些問題,在此記錄一下。
前端開發中console是經常使用的調試工具,但某次開發中發現打印的值(對象)和我實際請求的值不相符(所打印對象的屬性展開前后是不一樣的),不知道朋友們有沒有遇到過相同的問題。當時還很奇怪,為什么會這樣呢!
后來想想也很好理解,調試工具也是渲染出來的,打印的log是一個對象,沒有展開時打印的是原始值,在展開查看詳細屬性值時,頁面會重新渲染,就會從內存中取出當前值,如果之前這個值被修改了,那么現在就會打印修改后的值,所以打印對象的值展開和隱藏是不同的。
瀏覽器調試工具的控制臺和Android studio的控制臺是不同的,瀏覽器的控制臺其實和自己開發的程序是運行在相同的環境下的,也就是有相同的上下文。所以我們才能在控制臺打印對象,動態修改對象的值。如果在控制臺想要看初始值可以把對象轉換成json串以后打印出來。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。