欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#結合JS解決Word添加無效位圖導致進程停滯的問題

 更新時間:2024年11月04日 09:16:18   作者:初九之潛龍勿用  
這篇文章主要為大家詳細介紹了C#如何結合JS解決Word添加無效位圖導致進程停滯的問題,感興趣的小伙伴可以跟隨小編一起學習一下

故障現象

最近在使用Word導出簡歷的時候,發(fā)現在導出某些簡歷數據的時候,服務器端 WORD 進程停滯,頁面無響應。最后發(fā)現問題發(fā)生在使用 Word COM 方法 Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(filename,Type.Missing, true, Type.Missing); 時導致。在使用添加圖片方法時,我們預生成了一個圖片,該圖片數據以二進制數據保存在數據表中,Web 端可以通過 Response.BinaryWrite 方法呈現到 Image 控件上,但生成圖片文件的時候,無法打開,提示無效的位圖文件,如下圖所示:

解決步驟

(1)將數據表中的二進制數據讀出,將寫入到 Image 控件上進行圖像呈現。

(2)在客戶端通過 JS 創(chuàng)建畫布,將圖像數據繪制到畫布上,進行重繪操作。

(3)通過畫布生成 Base64 編碼數據,保存在臨時文本控件中。

(4)服務端將 Base64 方法重新生成正常位圖文件,再使用WordApp.Selection.InlineShapes.AddPicture方法實現 Word 正常添加圖片。

開發(fā)運行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

Word 版:Microsoft Office Word 2016

.net版本: .netFramework4.7.2 或以上

開發(fā)工具:VS2019  C#

關鍵代碼

呈現圖片到客戶端

假設 Web 頁放置 ID 為 Image1 的Image控件,前端示例代碼如下:

<asp:Image ID="Image1"  src="test.aspx" runat="server" width="110" height="160" />

test.aspx 后端輸出數據文件,示例代碼如下:

string _id="1001";
string _sql = "select imgdata from photos where id=@id ";
        
ArrayList para = new ArrayList();
para.Add(new SqlParameter("id", _id));
object rv=GetDataSet(_sql,paras);
 
DataSet ds = (DataSet)rv;
Byte[] _img= (Byte[])ds.Tables[0].Rows[0][0];
 
Response.ContentType = "image/*";//
Response.BinaryWrite(_img);

該代碼模擬從數據表提取二進制字段(imgdata)數據通過 Response.BinaryWrite 方法寫入并呈現數據。如何獲取數據集可參閱我的文章 《C# 利用IDbDataAdapter / IDataReader 實現通用數據集獲取》

重繪圖像

前端頁面布局兩個元素,一個 ID 為 myCanvas 的畫布元素,一個用于存儲 Base64 數據的 ID 為 ds 的文本框控件。

引用代碼如下:

<canvas id="myCanvas" style="display:none;"></canvas>
<asp:TextBox runat="server" id="ds" TextMode="MultiLine" Text="" style="display:none"/>

以下代碼通過 canvas 元素重繪圖像:

var img = document.getElementById("Image1");
img.onload = function () {
    var canvas = document.getElementById("myCanvas")
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas1.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height); 
    var image = canvas.toDataURL("image/png");
    document.getElementById("ds").value = image;
}

引用 Image1對象,將畫布寬高設置為圖像的寬高,通過 drawImage 方法進行重繪操作,最后再通過 canvas.toDataURL 方法將 Base64 數據寫入到 ds 臨時文本框控件中。

后端處理

通過 Base64StringToImage 方法將 Base64 數據轉化為圖片文件,方法代碼如下:

public bool Base64StringToImage(string strbase64, string outputFilename)
{
 
       byte[] arr = Convert.FromBase64String(strbase64);
       MemoryStream ms = new MemoryStream(arr);
       System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
       img.Save(outputFilename);
       img.Dispose();
       if (File.Exists(outputFilename))
       {
           return true;
       }
 
       return false;
}

以下代碼實現最終生成可用的位圖文件:

string filename="d:\\test.png";
string base64Data = ds.Text.Trim().Replace("data:image/png;base64,", "");
Base64StringToImage(base64Data, filename);

關鍵部分需要替換掉臨時數據里的 “data:image/png;base64,” 文本,否則無法正常生成位圖文件。 

小結

至此生成簡歷數據正常,這是一種變通的做法,關于 WORD 的一些更多操作可參閱我的文章:

《C# 讀取二維數組集合輸出到Word預設表格》

《C# 操作 Word 全域查找且替換(含圖片對象)》

畫布繪制還可參閱我的文章:

《C# 結合JavaScript實現手寫板簽名并上傳到服務器》

到此這篇關于C#結合JS解決Word添加無效位圖導致進程停滯的問題的文章就介紹到這了,更多相關C#解決Word添加無效位圖導致進程停滯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論