百分求教html转word文档|100分100分100分100分100分100分100分

wh_liang 2015-11-27 02:15:13

要求实现的功能是:
输入url链接【比如http://baidu.com】能将其转换成.docx文件在本地保存
目前html转word文档对于没有图片的页面可以转换,但是对于有图片的页面不能显示图片
网上找了很多方法,大多是将其图片写成绝对路径,但是断网的情况下无法显示,这个不是我的需求
我设想了一种方法:既然ctrl+c能复制这张图片到word中并且保存,我是否可以将html以流的形式读入内存中,再写入到已经创建好的word中,但是没有成功。
望各位大神给出解决方案(最好有代码和注释)
...全文
304 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh_liang 2015-12-01
  • 打赏
  • 举报
回复
引用 16 楼 shingoscar 的回复:
我只能说楼主太天真了 你这样只能拿到html 还要根据html处理img,iframe,js等资源 不是一两句话能够解决的
请看下14楼的方法,借助剪切板直接复制粘贴应该可以用
Poopaye 2015-12-01
  • 打赏
  • 举报
回复
我只能说楼主太天真了 你这样只能拿到html 还要根据html处理img,iframe,js等资源 不是一两句话能够解决的
wh_liang 2015-12-01
  • 打赏
  • 举报
回复
引用 14 楼 crystal_lz 的回复:
你可以 用webbrowser 打开 然后执行 SelectAll 再 Copy 复制
然后在word对象上 执行 粘贴命令 不过 要占用剪切板
详情参见 webbrowser.execcommand() 方法。。

可以帮忙看下代码么?不知道怎么用,报错

document一直为null无法调用selectall和copy方法

还有方法这样写是否正确,第三个参数“要使用该命令分配的值,并非适用所有命令”不明白其含义
myWebBrowser.Document.ExecCommand("selectAll", false, "true");
myWebBrowser.Document.ExecCommand("Copy", false, "true");

crystal_lz 2015-12-01
  • 打赏
  • 举报
回复
引用 15 楼 wh_liang 的回复:
[quote=引用 14 楼 crystal_lz 的回复:] 你可以 用webbrowser 打开 然后执行 SelectAll 再 Copy 复制 然后在word对象上 执行 粘贴命令 不过 要占用剪切板 详情参见 webbrowser.execcommand() 方法。。
可以帮忙看下代码么?不知道怎么用,报错 document一直为null无法调用selectall和copy方法 还有方法这样写是否正确,第三个参数“要使用该命令分配的值,并非适用所有命令”不明白其含义
myWebBrowser.Document.ExecCommand("selectAll", false, "true");
            myWebBrowser.Document.ExecCommand("Copy", false, "true");
[/quote] 第三个参数 你可以当作是命令的附带参数 比如 ("Save",false,"C:\\123.html");
wh_liang 2015-12-01
  • 打赏
  • 举报
回复
问题已经解决,解决方案和代码我已经记录下来,请点下面的链接: 我的博客 方便遇到相同需求的码友查看,因为找来找去,网上这个需求的解决方法真的很少。 如果您也遇到这个问题,并且得到解决,请留个言吧
Poopaye 2015-12-01
  • 打赏
  • 举报
回复
引用 17 楼 wh_liang 的回复:
请看下14楼的方法,借助剪切板直接复制粘贴应该可以用
那祝你好运
xdashewan 2015-11-30
  • 打赏
  • 举报
回复
引用 10 楼 wh_liang 的回复:
那先指导我一下怎么让图片流和文本流结合起来吧
如果用对象操作word那么你要预先把图片保存在本地,如果用流,你要了解word文件的二进制格式 http://wenku.baidu.com/link?url=M0XSpDpEIe_DNPywVs0OmrhfoOUauirbR3jNdEcCcq-esLi7bpLyf0AOC9bmWMZSCCf33hmvlnqZ6lTIQvCdLnkZYPd7cYQnmcFJtH4Vliq
crystal_lz 2015-11-30
  • 打赏
  • 举报
回复
你可以 用webbrowser 打开 然后执行 SelectAll 再 Copy 复制 然后在word对象上 执行 粘贴命令 不过 要占用剪切板 详情参见 webbrowser.execcommand() 方法。。
Hello World, 2015-11-28
  • 打赏
  • 举报
回复
用WebBrowser控件,这个可以将网页另存为htm文件 或者参考以下代码去修改:
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
/// <summary>
/// 生成网页快照
/// </summary>
/// 
/// 调用方法:
//Bitmap bmp = HtmlToImg.GetHtmlToImg("http://www.baidu.com/", 800, 600, 800, 600);
//MemoryStream stream = new MemoryStream();
//bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
//byte[] buff = stream.ToArray();
 
////直接显示图片
////Response.ContentType = "image/Jpeg";
////Response.BinaryWrite(buff);
////Response.End();
 
////保存图片
//FileStream fs = newFileStream(Server.MapPath(DateTime.Now.Date.ToShortDateString() + ".jpg"), FileMode.Create);
//stream.WriteTo(fs);
//stream.Close();
//fs.Close();

public class HtmlToImg
{
    Bitmap m_Bitmap;
    string m_Url;
    int m_BrowserWidth, m_BrowserHeight, m_ThumbnailWidth, m_ThumbnailHeight;
    public HtmlToImg(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        m_Url = Url;
        m_BrowserHeight = BrowserHeight;
        m_BrowserWidth = BrowserWidth;
        m_ThumbnailWidth = ThumbnailWidth;
        m_ThumbnailHeight = ThumbnailHeight;
    }
    public static Bitmap GetHtmlToImg(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        HtmlToImg thumbnailGenerator = new HtmlToImg(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight);
        return thumbnailGenerator.GenerateHtmlToImgImage();
    }
    public Bitmap GenerateHtmlToImgImage()
    {
        Thread m_thread = new Thread(new ThreadStart(_GenerateHtmlToImgImage));
        m_thread.SetApartmentState(ApartmentState.STA);
        m_thread.Start();
        m_thread.Join();
        return m_Bitmap;
    }
    private void _GenerateHtmlToImgImage()
    {
        WebBrowser m_WebBrowser = new WebBrowser();
        m_WebBrowser.ScrollBarsEnabled = false;
        m_WebBrowser.Navigate(m_Url);
        m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
        while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
        m_WebBrowser.Dispose();
    }
    private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser m_WebBrowser = (WebBrowser)sender;
        m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight);
        m_WebBrowser.ScrollBarsEnabled = false;
        Bitmap img = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height);
        m_Bitmap = new Bitmap(m_ThumbnailWidth, m_ThumbnailHeight);
        m_WebBrowser.BringToFront();
        m_WebBrowser.DrawToBitmap(img, m_WebBrowser.Bounds);

        //新建一画板
        System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(m_Bitmap);
        //设置高质量的双三次插值法
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        //在指定位置并且指定大小绘制原图片的指定部分
        g.DrawImage(img, new Rectangle(0, 0, m_ThumbnailWidth, m_ThumbnailHeight), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
        g.Dispose();
        img.Dispose();
        //m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero);
    }
}
  • 打赏
  • 举报
回复
引用 10 楼 wh_liang 的回复:
[quote=引用 9 楼 xdashewan 的回复:] [quote=引用 8 楼 wh_liang 的回复:] 请求的图片数据返回的是一个流文件,这个怎么和现有的文本流文件结合呢?还有如果是外链样式或者其他文件的话怎么结合?
连外链样式都要解析?你这不是在保存doc,而是在做简易浏览器啊[/quote]那先指导我一下怎么让图片流和文本流结合起来吧[/quote] 用word控件操作word的话,文本和图片都是一种对象,不再是流。
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
[quote=引用 8 楼 wh_liang 的回复:] 请求的图片数据返回的是一个流文件,这个怎么和现有的文本流文件结合呢?还有如果是外链样式或者其他文件的话怎么结合?
连外链样式都要解析?你这不是在保存doc,而是在做简易浏览器啊[/quote]那先指导我一下怎么让图片流和文本流结合起来吧
xdashewan 2015-11-27
  • 打赏
  • 举报
回复
引用 8 楼 wh_liang 的回复:
请求的图片数据返回的是一个流文件,这个怎么和现有的文本流文件结合呢?还有如果是外链样式或者其他文件的话怎么结合?
连外链样式都要解析?你这不是在保存doc,而是在做简易浏览器啊
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
[quote=引用 5 楼 wh_liang 的回复:] 当头一棒,确实是这样,但是照你这么一说,发现这功能实现起来更麻烦了
难吗?无非就是获取一下img标签,然后用地址继续请求一下数据而已[/quote] 请求的图片数据返回的是一个流文件,这个怎么和现有的文本流文件结合呢?还有如果是外链样式或者其他文件的话怎么结合?
xdashewan 2015-11-27
  • 打赏
  • 举报
回复
引用 5 楼 wh_liang 的回复:
当头一棒,确实是这样,但是照你这么一说,发现这功能实现起来更麻烦了
难吗?无非就是获取一下img标签,然后用地址继续请求一下数据而已
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
不知道还有没有大神有解决方法
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
看的出楼主对浏览器如何获取完整页面的过程并不了解,言归正传你的错误是误认为在单一个http请求中就可以获得所有信息,但其实不然,你按F12打开浏览器的开发者工具看下就会发现,主页和图片其实是完全独立的数个http请求获取的,所以如果想拿到图片你也得多次请求
当头一棒,确实是这样,但是照你这么一说,发现这功能实现起来更麻烦了
xdashewan 2015-11-27
  • 打赏
  • 举报
回复
看的出楼主对浏览器如何获取完整页面的过程并不了解,言归正传你的错误是误认为在单一个http请求中就可以获得所有信息,但其实不然,你按F12打开浏览器的开发者工具看下就会发现,主页和图片其实是完全独立的数个http请求获取的,所以如果想拿到图片你也得多次请求
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
求关注。。。。
wh_liang 2015-11-27
  • 打赏
  • 举报
回复
引用 1 楼 u010509561 的回复:
先贴出自己的源码,可以后边的人快点
楼主源码如下: 第一个方法:

/// <summary>
        /// 获取weburl输出内容
        /// </summary>
        /// <param name="url">weburl</param>
        /// <returns>输出内容</returns>
        public static string  GetPage(string url)
        {
            WebResponse result = null;
            try
            {
                WebRequest req = WebRequest.Create(new Uri(url));
                result = req.GetResponse();

                var receivedStream = result.GetResponseStream();
                var sr = new System.IO.StreamReader(receivedStream,Encoding.GetEncoding("gb2312"));// GetEncoding( GetContentType(result.ContentType).FirstOrDefault().Key)


                return sr.ReadToEnd();
            }
            catch (Exception ex)
            {
                return "";
            }
            finally
            {
                //ensure that network resources are not wasted
                if (result != null)
                    result.Close();
            }
        }

        //数据流的方式
        public void test2()
        {
            var pageString =GetPage("http://www.baidu.com");
            System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=result.doc");
            System.Web.HttpContext.Current.Response.ContentType = "application/ms-word";
            System.Web.HttpContext.Current.Response.Charset = "utf-8";
            System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.Write(pageString);
            Response.End();
        }

第二个方法:

 public void stm() {
            string filepath = @"http://www.baidu.com";
            Stream stream = WebRequest.Create(filepath).GetResponse().GetResponseStream();

            int size = 1024;
            int read = 0;
            MemoryStream ms = new MemoryStream();
            byte[] buffer = new byte[size];
            do
            {
                buffer = new byte[size];
                read = stream.Read(buffer, 0, size);
                ms.Write(buffer, 0, read);
            } while (read >= size);
            byte[] bdata = new byte[ms.Length];
            ms.Read(bdata, 0, (int)ms.Length);
            char[] cdata = bdata.Select(x => (char)x).ToArray();
            System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=result.doc");
            System.Web.HttpContext.Current.Response.ContentType = "application/ms-word";
            System.Web.HttpContext.Current.Response.Charset = "utf-8";
            System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.Write(cdata, 0, cdata.Length);
            Response.End();
        }
u010509561 2015-11-27
  • 打赏
  • 举报
回复
先贴出自己的源码,可以后边的人快点

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧