C#结合JS解决Word添加无效位图导致进程停滞的问题

news/2024/11/7 13:06:04/

目录

故障现象

解决步骤

开发运行环境

关键代码

呈现图片到客户端

重绘图像

后端处理

小结


故障现象

最近在使用Word导出简历的时候,发现在导出某些简历数据的时候,服务器端 WORD 进程停滞,页面无响应。最后发现问题发生在使用 Word COM 方法 Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(filename,Type.Missing, true, Type.Missing); 时导致。在使用添加图片方法时,我们预生成了一个图片,该图片数据以二进制数据保存在数据表中,Web 端可以通过 Response.BinaryWrite 方法呈现到 Image 控件上,但生成图片文件的时候,无法打开,提示无效的位图文件,如下图所示:

解决步骤

(1)将数据表中的二进制数据读出,将写入到 Image 控件上进行图像呈现。

(2)在客户端通过 JS 创建画布,将图像数据绘制到画布上,进行重绘操作。

(3)通过画布生成 Base64 编码数据,保存在临时文本控件中。

(4)服务端将 Base64 方法重新生成正常位图文件,再使用WordApp.Selection.InlineShapes.AddPicture方法实现 Word 正常添加图片。

开发运行环境

操作系统: Windows Server 2019 DataCenter

Word 版:Microsoft Office Word 2016

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

开发工具: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 数据转化为图片文件,方法代码如下:

javascript">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;
}

以下代码实现最终生成可用的位图文件:

javascript">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实现手写板签名并上传到服务器》

感谢您的阅读,希望本文能够对您有所帮助。


http://www.ppmy.cn/news/1545067.html

相关文章

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

【青牛科技】D1084 5A低压差电压调整器应用方案

1、 概述&#xff1a; D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。输出电压可通过电位器调节或1.5V, 1.8V, 3.3V三个固定电压版。内含电流限制和热保护功能&#xff0c;防止任何过载时产生过高的结温。D1084系列电路有标准TO-220、TO-263和TO-252封装形式。 2、 典…

IDEA在编译时: java: 找不到符号符号: 变量 log

一、问题 IDEA在编译的时候报Error:(30, 17) java: 找不到符号符号: 变量 log Error:(30, 17) java: 找不到符号 符号: 变量 log 位置: 类 com.mokerson.rabbitmq.config.RabbitMqConfig 二、解决方案 背景&#xff1a;下载其他同事代码时&#xff0c;第一次运行&#xff0c…

sub标签没起作用

sub标签浏览器的内置样式是 sup{vertical-align:super; }由于项目里被 reset.css重置了导致没起作用&#xff0c;需要重写。<sup style"vertical-align:super">2</sup>

wordpress判断page页与非page页

在WordPress中&#xff0c;你可以使用is_page()函数来判断当前页面是否为page类型。以下是如何使用这个函数的示例&#xff1a; <?php if (is_page()) {// 当前页面是page类型echo 这是一个Page页面; } else {// 当前页面不是page类型echo 这不是一个Page页面; } ?> …

无人机场景数据集大全「包含数据标注+划分脚本+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、AIGC 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;使用 labelimg 软件吐血标注、整理&…

【学术精选】SCI期刊《Electronics》特刊“New Challenges in Remote Sensing Image Processing“

英文名称&#xff1a;New Challenges in Remote Sensing Image Processing 中文名称&#xff1a;"遥感图像处理的新挑战"特刊 期刊介绍 “New Challenges in Remote Sensing Image Processing”特刊隶属于《Electronics》期刊&#xff0c;聚焦遥感图像处理领域快速…

Redis内存管理——针对实习面试

目录 Redis内存管理Redis的内存淘汰机制有哪些?说说过期的数据的删除策略&#xff1f;Redis是如何判断数据是否过期的&#xff1f;Redis如何处理大Key问题&#xff1f; Redis内存管理 Redis的内存淘汰机制有哪些? Redis的内存淘汰机制主要包括以下几种策略&#xff1a; noev…