当前位置: 代码网 > it编程>编程语言>C# > C#结合JS解决Word添加无效位图导致进程停滞的问题

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

2024年11月25日 C# 我要评论
故障现象最近在使用word导出简历的时候,发现在导出某些简历数据的时候,服务器端 word 进程停滞,页面无响应。最后发现问题发生在使用 word com 方法 word.inlineshape pi

故障现象

最近在使用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 数据转化为图片文件,方法代码如下:

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添加无效位图导致进程停滞内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • C#封装将函数封装为接口dll的简单步骤指南

    C#封装将函数封装为接口dll的简单步骤指南

    前言在c#中,将函数封装为接口并打包成dll(动态链接库)是一种非常常见的做法,用于实现代码的重用和模块化。以下是一个简单的步骤指南,教你如何实现这一点:1. ... [阅读全文]
  • 详解C#如何实现一个事件总线

    详解C#如何实现一个事件总线

    使用 c# 实现一个 event busevent bus(事件总线)是一种用于在应用程序内部或跨应用程序组件之间进行事件通信的机制。它允许不同的组件通过发布和... [阅读全文]
  • C#中6种常用集合类小结

    一.先来说说数组的不足也可以说集合与数组的区别1.数组是固定大小的,不能伸缩。虽然system.array.resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小…

    2024年11月25日 编程语言
  • 在C#中使用指针的示例代码

    在C#中使用指针的示例代码

    .net平台定义了两种主要数据类型:值类型和引用类型,其实还有第三种数据类型:指针类型。使用指针,可以绕开clr的内存管理机制。(说明:在c#中使用指针,需要有... [阅读全文]
  • C#模拟浏览器实现自动操作

    C#模拟浏览器实现自动操作

    使用webbrowser加载网页(内嵌)通过webbrowser控件打开浏览页面,并操作页面元素实现自动搜索功能 //是否已经加载网页标准 ... [阅读全文]
  • C# winform实现自动更新

    C# winform实现自动更新

    1.检查当前的程序和服务器的最新程序的版本,如果低于服务端的那么才能升级2.服务端的文件打包.zip文件3.把压缩包文件解压缩并替换客户端的debug下所有文件... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com