Html转Word文档,解决无法保存网络图片的问题

  最近项目中需要这个功能,网上有很多word转html的方法,但是html转word的方法很少,因为html中的图片转换到本地比较麻烦;

  开始的时候只能转换不带图片的html内容,但是不符合要求,将html页面中的图片改成绝对路径后在断网之后无法查看,将图片下载下来改成绝对路径后,换台机器无法观看,问题干扰了一天;

  当然有一种实现方式是将外链样式和外链图片全部一个个请求下来再放到word中排版,这个貌似非常麻烦,跟做一个浏览器一样。

  后来发现,在网站中直接复制网页然后到word文档中粘贴,可以把图片和样式全部拿过来,于是想到一种方法是否可以利用剪切板来取数据,模拟复制粘贴,最终发现可行,唯一的不足是由于宽度原因,拿来的东西在word中呈现会把格局变掉。

  代码还是非常简单,比较好理解的,下面上代码:

  

 1      public void HtmlToWordByUrl(string url)
 2         {
 3             WebBrowser WB = new WebBrowser();//新建内置浏览
 4             WB.Navigate(url);//加载页面
 5             //加载完成
 6             while (WB.ReadyState != WebBrowserReadyState.Complete)
 7             {
 8                 System.Windows.Forms.Application.DoEvents();
 9             }
10             //对加载完成的页面进行全选和复制操作
11             HtmlDocument doc = WB.Document;
12             doc.ExecCommand("SelectAll", false, "");//全选
13             doc.ExecCommand("Copy", false, "");//复制
14             //放入剪切板
15             IDataObject iData = Clipboard.GetDataObject();
16             SaveWord();//保存为word文档
17             //读取文档,下载文档
18             FileStream fs = new FileStream(Server.MapPath("~/UploadFile/test.doc"), FileMode.Open);
19             byte[] bytes = new byte[(int)fs.Length];
20             fs.Read(bytes, 0, bytes.Length);
21             fs.Close();
22             Response.ContentType = "application/octet-stream";
23             //通知浏览器下载文件而不是打开 
24             Response.AddHeader("Content-Disposition", "attachment; filename=htmlfile.doc");
25             Response.BinaryWrite(bytes);
26             WB.Dispose();
27             Response.Flush();
28             Response.End();
29 
30         }
31 
32         public void SaveWord()
33         {
34             object path;                      //声明文件路径变量
35             //string wordstr = wdstr;                   //声明word文档内容
36             MSWord.Application wordApp;       //声明word应用程序变量
37             MSWord.Document worddoc;          //声明word文档变量    
38 
39             //初始化变量
40             object Nothing = Missing.Value;                       //COM调用时用于占位
41             object format = MSWord.WdSaveFormat.wdFormatDocument; //Word文档的保存格式
42             wordApp = new MSWord.ApplicationClass();              //声明一个wordAPP对象
43             worddoc = wordApp.Documents.Add(ref Nothing, ref Nothing,
44                 ref Nothing, ref Nothing);
45 
46             //页面设置
47             worddoc.PageSetup.PaperSize = Microsoft.Office.Interop.Word.WdPaperSize.wdPaperA4;//设置纸张样式
48             worddoc.PageSetup.Orientation = Microsoft.Office.Interop.Word.WdOrientation.wdOrientPortrait;//排列方式为垂直方向
49 
50 
51             //向文档中写入内容(直接粘贴)
52             worddoc.Paragraphs.Last.Range.Paste();
53 
54             //保存文档
55             path = Server.MapPath("~/UploadFile/test.doc");          //设置文件保存路劲
56             worddoc.SaveAs(ref path, ref format, ref Nothing, ref Nothing,
57                 ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing,
58                 ref Nothing, ref Nothing, ref Nothing, ref Nothing);
59 
60             //关闭文档
61             worddoc.Close(ref Nothing, ref Nothing, ref Nothing);  //关闭worddoc文档对象
62             wordApp.Quit(ref Nothing, ref Nothing, ref Nothing);   //关闭wordApp组对象
63 
64         }

其中要注意的一点是,因为在webform页面调用webbrowser,需要引入以下引用

 1 using System.Windows.Forms; 

前端页面引用,需要加入AspCompat="true"

1 <%@ Page Language="C#" AutoEventWireup="true" AspCompat="true" CodeBehind="HtmlToWord.aspx.cs" Inherits="NurseManage.Export.HtmlToWord" %>

最后引用了微软的操作类库

 1 using MSWord = Microsoft.Office.Interop.Word; 

方法引用:

1      protected void Page_Load(object sender, EventArgs e)
2         {
3             HtmlToWordByUrl("http://www.cnblogs.com/Kuleft/p/5010636.html");
4 
5         }

效果图:

 

关于word内容排版的问题希望大家能不吝赐教,对于word的操作确实不太清楚。

还有一个就是不知道是不是百度首页(http://www.baidu.com)防盗爬,暂时转化不了。

转载于:https://www.cnblogs.com/Kuleft/p/5010636.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android实现推送方式解决方案

Android实现推送方式解决方案 本文介绍在Android中实现推送方式的基础知识及相关解决方案。推送功能在手机开发中应用的场景是越来起来了&#xff0c;不说别的&#xff0c;就我们手机上的新闻客户端就时不j时的推送过来新的消息&#xff0c;很方便的阅读最新的新闻信息。这种推…

java基础知识系列---垃圾收集

1 为什么要使用垃圾回收机制&#xff1f; “垃圾收集”暗示程序不再需要的对象就是垃圾&#xff0c;可以被丢弃。更精确&#xff0c;更新的说法是“内存回收”。 1.1 新对象的使用 当一个对象不再被程序所引用时&#xff0c;他所使用的堆空间可以被回收&#xff0c;以便于被后续…

如何部署Zabbix服务端

部署环境 RHEL 6.7 Zabbix-server 2.2.14 安装zabbix官方源 # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm # rpm -ivh zabbix-release-2.2-1.el6.noarch.rpm 安装zabbix-server # yum install zabbix zabbix-server-mysql zab…

Oracle JRockit Mission Control 4.1发布

Oracle发布了以前的仅JRockit专用工具Mission Control Suite&#xff08;JRMC&#xff09;的新版本。 4.1版本是次要版本升级&#xff0c;直接遵循4.0.1&#xff08;该版本发布于2010年中期&#xff09;。 但是&#xff0c;即使版本号表明是次要的升级&#xff0c;您仍然可以在…

pe安装usb3.0驱动_电脑店U盘启动盘制作工具下载安装须知

电脑店U盘启动盘制作工具集成最全面的硬件驱动&#xff0c;精心挑选的系统维护工具&#xff0c;加上独有人性化的设计&#xff0c;具备较强的兼容性、稳定性和安全性。能够完美兼容台式机、品牌机及笔记本等新老机型&#xff0c;且安全无毒&#xff0c;电脑店一键U盘启动盘制作…

python ATM购物程序

需求&#xff1a; 模拟实现一个ATM 购物商城程序 额度 15000或自定义实现购物商城&#xff0c;买东西加入 购物车&#xff0c;调用信用卡接口结账可以提现&#xff0c;手续费5%每月22号出账单&#xff0c;每月10号为还款日&#xff0c;过期未还&#xff0c;按欠款总额 万分之5…

postman使用_postman如何使用集合断言?

在postman中&#xff0c;大家都使用过断言&#xff0c;但是我们使用的断言都是针对每一个接口或者是每一个用例添加的&#xff0c;那么是否有可以同时对多个用例或接口添加断言呢 &#xff1f; 答案是肯定有的。那么接下来我就带领大家认识下Postman中的批量断言&#xff0c;也…

centos和ubuntu下使用cron设置定时任务

1.启动cron工具[ps:使用root权限] centos启动cron两种方式 a) /etc/init.d/crond start b) service crond start ubuntu启动cron两种方式 a) /etc/init.d/cron start b) service cron start(推荐) 2.添加定时任务[每个整点执行ls命令] centos crontab -e命令打开文件 添加一行:…

原生js使用forEach()与jquery使用each遍历数组,return false 的区别

原生js使用forEach()与jquery使用each()遍历数组&#xff0c;return false 的区别&#xff1a; 1、使用each()遍历数组a,如下&#xff1a; var a[20,21,22,23,24];$.each(a, function(index,val) {console.log(indexindex);if(index2){return false;}console.log(valval);}); …

配置Java EE应用程序或“将Bien付诸实践”

过去&#xff0c;有关应用程序配置的讨论很多。 我不知道谁拉开了辩论的序幕&#xff0c;但是最基础的阅读&#xff08;着眼于未来的Java EE 7及更高版本&#xff09;是Antonio Goncalves的帖子[辩论] – Java EE 7中的配置如何 &#xff1f; 事实是&#xff0c;使用香草Java E…

HTML5 Canvas入门

HTML5的canvas&#xff08;画布&#xff09;元素使用JavaScript在网页上绘制图像。下面以一个简单例子及其效果图&#xff08;图1&#xff09;开始&#xff1a; <!DOCTYPE HTML> <html><head><style type"text/css"> canvas{border:dashed 2…

泄漏:Oracle WebLogic Server 12g

JavaOne已经比我们落后了将近一个星期&#xff0c;我仍在撰写有关它的详细博客文章 。 我真的很惊讶的事实是&#xff0c;我没有看到任何提及我最喜欢的应用程序服务器更新的事实。 是的&#xff0c;我喜欢WebLogic产品。 从一开始。 自从收购BEA以来&#xff0c;甲骨文一直对我…

画家问题

【题目描述】 有一个正方形的墙&#xff0c;由N*N个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c;位置(i-1,j)、(i1,j)、(…

8-IO总结

3、 4、 5、 转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5026207.html

python 发邮件_python发邮件

smtplibPython提供smtplib模块&#xff0c;该模块定义了一个SMTP客户端会话对象&#xff0c;可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。这是一个简单的语法&#xff0c;用来创建一个SMTP对象&#xff0c;稍后将演示如何用它来发送电子邮件 import smtplib…

Java SE 7、8、9 –推进Java

今天&#xff08;注&#xff1a;2011年10月4日&#xff09;是主题演讲日。 JavaOne Keynote将于今早从上午8:30到10:30进行&#xff0c;而我的新闻通行证又一次让我很早就开始了。 因此&#xff0c;我有时间在所有关键球员准备就绪并可能感到紧张的同时为其拍摄一些非常个性化的…

python数据挖掘与机器学习实战_Python数据挖掘与机器学习技术入门实战(1)

什么是数据挖掘?数据挖掘指的是对现有的一些数据进行相应的处理和分析&#xff0c;最终得到数据与数据之间深层次关系的一种技术。例如在对超市货品进行摆放时&#xff0c;牛奶到底是和面包摆放在一起销量更高&#xff0c;还是和其他商品摆在一起销量更高。作者&#xff1a;韦…

(转)求单链表是否有环,环入口和环长

转自&#xff1a;http://www.cnblogs.com/youxin/p/3303172.html 1.链表中是否有环的判断可以设置两个指针(fast,slow)&#xff0c;初始值均指向头&#xff0c;slow每次向前一步&#xff0c;fast每次向前两步&#xff1b;如果链表中有环&#xff0c;则fast先进入环中&#xff0…

NYOJ 202 红黑树

红黑树 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述 什么是红黑树呢&#xff1f;顾名思义&#xff0c;跟枣树类似&#xff0c;红黑树是一种叶子是黑色果子是红色的树。。。 当然&#xff0c;这个是我说的。。。 《算法导论》上可不是这么…

JBoss模块示例–模块化Web应用程序

最近&#xff0c;我读了为什么没有标准来开发真正的模块化Web应用程序&#xff1f; 由Patroklos Papapetrou撰写&#xff08; 在Java Code Geeks中也有介绍 &#xff09;。 受本文的启发&#xff0c;我决定检查实际使用的JBoss模块 。 这篇文章逐步描述了我的实验。 我首先想到…