Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 897|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-16 12:39:17 | 显示全部楼层 |阅读模式

      最近项目中需要这个功能,网上有很多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)防盗爬,暂时转化不了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-24 16:35 , Processed in 0.055996 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表