当前位置: 首页 > 编程日记 > 正文

C# 实现HTML转换成图片的方法

/// <summary>
        /// 通过WebBrowser控件来实现从HTML到Bmp图片的生成。
        /// </summary>
        /// <param name="htmPath">HTML路径</param>
        /// <returns>Bmp图片路径</returns>
        private static string ConverHTML(string htmPath)
        {
            string ImagePath = string.Empty;
            WebBrowser web = new WebBrowser();
            web.Navigate(htmPath);
            while (web.ReadyState != WebBrowserReadyState.Complete)
            {
                System.Windows.Forms.Application.DoEvents();
            }
            Rectangle screen = Screen.PrimaryScreen.Bounds;
            Size? imgsize = null;
            //set the webbrowser width and hight
            web.Width = screen.Width;
            web.Height = screen.Height;
            //suppress script errors and hide scroll bars
            web.ScriptErrorsSuppressed = true;
            web.ScrollBarsEnabled = false;
            Rectangle body = web.Document.Body.ScrollRectangle;

//check if the document width/height is greater than screen width/height
            Rectangle docRectangle = new Rectangle()
            {
                Location = new Point(0, 0),
                Size = new Size(body.Width > screen.Width ? body.Width : screen.Width,
                 body.Height > screen.Height ? body.Height : screen.Height)
            };
            //set the width and height of the WebBrowser object
            web.Width = docRectangle.Width;
            web.Height = docRectangle.Height;

//if the imgsize is null, the size of the image will
            //be the same as the size of webbrowser object
            //otherwise  set the image size to imgsize
            Rectangle imgRectangle;
            if (imgsize == null)
                imgRectangle = docRectangle;
            else
                imgRectangle = new Rectangle()
                {
                    Location = new Point(0, 0),
                    Size = imgsize.Value
                };
            //create a bitmap object
            Bitmap bitmap = new Bitmap(imgRectangle.Width - 24, imgRectangle.Height);
            //get the viewobject of the WebBrowser
            IViewObject ivo = web.Document.DomDocument as IViewObject;

using (Graphics g = Graphics.FromImage(bitmap))
            {
                //get the handle to the device context and draw
                IntPtr hdc = g.GetHdc();
                ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero,
                         IntPtr.Zero, hdc, ref imgRectangle,
                         ref docRectangle, IntPtr.Zero, 0);
                g.ReleaseHdc(hdc);
            }
            SAVEWORDJPG = string.Format(@"E:\cheng_Text\FormatApplication\测试文件\{0}.bmp", Guid.NewGuid().ToString());
            bitmap.Save(SAVEWORDJPG, System.Drawing.Imaging.ImageFormat.Bmp);
            bitmap.Dispose();
            web.Dispose();
            DeleteTempFile(TEMPHTMLPATH);
            return SAVEWORDJPG;
        }

/// <summary>
        /// 删除指定的临时文件。
        /// </summary>
        /// <param name="filePath"></param>
        private static void DeleteTempFile(string filePath)
        {
            //删除临时HTML文件 。
            File.Delete(filePath);
            //删除目录文件内容。
            string[] files = filePath.Split('.');
            if (files[1].ToLower().Equals("htm"))
            {
                string dirPath = files[0] + ".files";
                foreach (string f in Directory.GetFileSystemEntries(dirPath))
                {
                    // 如果是文件存在 
                    if (File.Exists(f))
                    {
                        FileInfo fi = new FileInfo(f);
                        if (fi.Attributes.ToString().IndexOf("Readonly") != 1)
                        {
                            fi.Attributes = FileAttributes.Normal;
                        }
                        // 直接删除其中的文件 
                        File.Delete(f);
                    }
                }
                Directory.Delete(dirPath);
            }
        }

#region==========IViewObje【实现接口类】================
        [ComVisible(true), ComImport()]
        [GuidAttribute("0000010d-0000-0000-C000-000000000046")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IViewObject
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int Draw(
                [MarshalAs(UnmanagedType.U4)] UInt32 dwDrawAspect,
                int lindex,
                IntPtr pvAspect,
                [In] IntPtr ptd,
                IntPtr hdcTargetDev,
                IntPtr hdcDraw,
                [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcBounds,
                [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcWBounds,
                IntPtr pfnContinue,
                [MarshalAs(UnmanagedType.U4)] UInt32 dwContinue);
            [PreserveSig]
            int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect,
               int lindex, IntPtr pvAspect, [In] IntPtr ptd,
                IntPtr hicTargetDev, [Out] IntPtr ppColorSet);
            [PreserveSig]
            int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect,
                            int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze);
            [PreserveSig]
            int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze);
            void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects,
              [In, MarshalAs(UnmanagedType.U4)] int advf,
              [In, MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink);
            void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects,
              [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf,
              [In, Out, MarshalAs(UnmanagedType.LPArray)] IAdviseSink[] pAdvSink);
        }
        #endregion

转载于:https://www.cnblogs.com/yinshuo/p/4963071.html

相关文章:

一套使用注入和Hook技术托管入口函数的方案

工作中&#xff0c;我们可能会经常使用开源项目解决一些领域中的问题。这种“拿来主义”是一种“专业人干专业事”的思想&#xff0c;非常实用。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 一般场景下&#xff0c;我们都是把开源项目代码编译到我们自己的…

微软发布虚机管理SCVMM 2008 R2 RC版

来源&#xff1a;IT168服务器频道近日&#xff0c;微软发布了SCVMM&#xff08;系统中心虚拟机管理器&#xff0c;System Center Virtual Machine Manager&#xff09;2008 R2的RC版本。据了解&#xff0c;新的SCVMM相比去年的版本增加了六大新功能&#xff0c;目前用户可以从W…

AI芯片行业发展的来龙去脉

作者 | 清华大学微电子学研究所尹首一来源 | 《微纳电子与智能制造》期刊引言人 工 智 能( aritificial intelligence &#xff0c;AI )是 一 门融合了数学 、计算机科学 、统计学 、脑神经学和社会科学 的前沿综合性技术。它的目标是希望计算机可以像 人一样思考 &#xff0c;…

8)排序②排序算法之选择排序[1]直接选择排序

1 #include<iostream>2 using namespace std;3 4 //*******直接选择排序*********5 int select_sort(int n,int array[100]){6 int i,j;7 for(i0;i<n;i){8 for(ji;j<n;j){9 if(array[i]>array[j]){ 10 int temparr…

一份招聘需求的分析

今早&#xff0c;长期合作伙伴又给我们一份招聘需求&#xff0c;以下是招聘条件&#xff1a; 工作性质&#xff1a;全职 工作地点&#xff1a;南京 发布日期&#xff1a;2009/6/15 截止日期&#xff1a;2009/6/30 招聘人数&#xff1a;6 工作经验&#xff1a;不限 学  历&…

bug诞生记——隐蔽的指针偏移计算导致的数据错乱

C语言为了兼容C语言&#xff0c;做了很多设计方面的考量。但是有些兼容设计产生了不清晰的认识。本文就将讨论一个因为认知不清晰而导致的bug。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; class Base { public:Base() default;void set_v_b(int v_b) {_…

福利直投!这个活动承包你2020全年技术干货

CSDN技术公开课有奖评选开始啦~~听过课的小伙伴们&#xff0c;哪位讲师的分享让你获益匪浅&#xff1f;记得给TA投票哦&#xff01;投票后获取入群方式&#xff0c;参与抽奖&#xff0c;奖品很丰厚哦~~进入付费时代&#xff0c;如今我们看似只要招招手&#xff0c;一切知识随手…

第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC

2019独角兽企业重金招聘Python工程师标准>>> 原创内容&#xff0c;转载请注明iteye http://jinnianshilongnian.iteye.com/ 4.15、MultiActionController 之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法&#xff…

自动机器学习:团队如何在自动学习项目中一起工作?(附链接)

来源 | 数据派THU作者 | Francesca Lazzeri翻译 | 王琦责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;去年11月&#xff0c;我写了一篇关于使用自动机器学习来进行AI民主化&#xff08;democratization&#xff09;的文章&#xff08;见下面链接&#x…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

操作系统是ubuntu 18.04.1 server amd64&#xff0c;gcc是 7.3.0。编译产出是64位测试程序。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 因为加入测量&#xff0c;就会导致误差。我已经尽量将环境影响降低&#xff0c;但是还是难免有误差。大家可以通过文…

SSIS中的记录集目标

这一篇&#xff0c;我们来看看另外一个特殊的目标组件&#xff1a;记录集目标。它与DataReader目标有些类似&#xff0c;也是在内存中的。但与DataReader目标不同的是&#xff0c;它可以被下游任务使用。 它的使用也比较简单&#xff0c;我们一般指定一个变量来接收它的结果&am…

Leetcode: Maximum Depth of Binary Tree

题目&#xff1a;算出二叉树的最大深度 解决方案&#xff1a;&#xff08;1&#xff09;BFS &#xff08;2&#xff09;DFS (1)BFS 一层一层往下搜索&#xff0c;一直找到最深的点&#xff0c;这里由于节点的val是没有用的&#xff0c;所以可以用来存储当前节点的深度&#xff…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;ubuntu g&#xff09;——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 删除 头部删除 元素…

一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码

来源 | hackernoon编译 | 武明利责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;在这篇文章中&#xff0c;我将向您展示如何使用Python构建自己的答案查找系统。基本上&#xff0c;这种自动化可以从图片中找到多项选择题的答案。有一件事我们要清楚&…

WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场

早在今年3月&#xff0c;思科在加利福尼亚州圣何塞市展会中展示了“统一计算系统”(Unified Computing System)之后&#xff0c;我们就明白&#xff0c;数据中心市场将会发生巨大改变&#xff0c;传统的以IBM、惠普、戴尔和Sun为主导的服务器电脑市场&#xff0c;将受到以思科为…

使用BabeLua3.x在cocos2d-x中编辑和调试Lua

BabeLua是一款基于VS2012/2013的Lua集成开发环境&#xff0c;具有Lua语法高亮&#xff0c;语法检查&#xff0c;自动补全&#xff0c;快速搜索&#xff0c;注入宿主程序内对Lua脚本进行调试&#xff0c;设置断点观察变量值&#xff0c;查看堆栈信息等功能。 如何安装 请参考《系…

ASA与PIX的区别

很多年来&#xff0c;Cisco PIX一直都是Cisco确定的防火墙。但是在2005年5月&#xff0c;Cisco推出了一个新的产品——适应性安全产品&#xff08;ASA&#xff0c;Adaptive Security Appliance&#xff09;。不过&#xff0c;PIX还依旧可用。我已听到很多人在多次询问这两个产品…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;ubuntu g&#xff09;——插入》已给出。本文将分析各个容器中遍历和查找的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 遍历 从前往后 元素个数>15000 t…

买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

作者 | 菜园子哇编辑 | 唐小引来源 | CSDN 博客马上上班了&#xff0c;回来的路上&#xff0c;上班地铁上都是非常急需口罩的。目前也非常难买到正品、发货快的口罩&#xff0c;许多药店都售完了。并且&#xff0c;淘宝上一些新店口罩库存写着非常多&#xff0c;但不发货&#…

GlusterFS下如何修复裂脑文件?(续一)

关于网上一些修复GlusterFS裂脑文件的说明1、Fixing a GlusterFS split-brainhttps://inuits.eu/blog/fixing-glusterfs-split-brain在该文章中&#xff0c;删除无效副本时提供的方法如下&#xff1a;srv02$ sudo find /export/brick1/sdb1/ -samefile /export/brick1/sdb1/tes…

MySQL数据库环境使用全过程

在使用MySQL之前&#xff0c;需要建立数据库的环境来创建数据表&#xff0c;首先我们需要安装该数据库环境&#xff0c;即MySQL。1、下载MySQLMySQL的官方网站是http://www.mysql.org/&#xff0c;如图2-9所示&#xff1a;图2-9 MySQL官方网站当前稳定版本为5.1&#xff0c;我…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

操作系统是Windows10 64bit&#xff0c;编译器是 Microsoft Virtual Studio Community 10。编译产出是64位测试程序。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 因为加入测量&#xff0c;就会导致误差。我已经尽量将环境影响降低&#xff0c;但是还是难免…

“夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞

来源 | mashable译者 | Kolen出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;我在Botnet上的第一条帖子获得了48万个赞。一款全新的社交媒体风格的应用为用户提供了生活在一个奇特网络虚拟世界的机会。在这个世界里&#xff0c;你将拥有数以百万计的粉丝&#xff0c;…

leetcode Reverse Linked List

Reverse a singly linked list 对于这种可以修改值的&#xff0c;把值逆序就可以了。。。。用vector存&#xff0c;然后逆序读。 都忘了指针怎么赋值初始化了。*p&head; 1 /**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * Lis…

抗击新冠肺炎,如何进行实时动态时序图谱建模与分析?

作者 | 闭雨哲来源 | ThutmoseAI背景介绍新冠肺炎是一种具有最长达24天潜伏期的新型突发性传染疾病&#xff0c;这种特性给疫情防控带来了巨大的挑战&#xff0c;随着感染规模的不断扩增&#xff0c;简单的人为治理已不太奏效&#xff0c;使用“大数据”技术手段来辅助人为治理…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 删除 …

关于服务器启动慢的问题

今天去了家医院的机房&#xff0c;走进去一看&#xff0c;TMD的医院就是有钱&#xff0c;全是光纤和千兆网络环境&#xff0c;全全是思科的三层交换机和路由器&#xff0c;HP的服务器。我们需要安装点东西&#xff0c;登录一台服务器&#xff0c;我一看配置&#xff0c;呵呵&am…

python依赖包exe文件安装问题

2019独角兽企业重金招聘Python工程师标准>>> 在使用python的exe程序安装依赖包的时候&#xff0c;经常会出现类似于下面的错误&#xff1a; python version 2.7 required,which was not found in the registry 可以使用如下代码解决该问题: # # script to register …

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析各个容器中遍历和查找的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 遍历 从前往后 travers…

技术战“疫”,贾扬清、李飞飞要给程序员直播讲AI技术!

「时势造英雄&#xff0c;英雄亦造时势。」在这场波及全球且看不见硝烟的疫情下&#xff0c;无数英雄日夜奋战&#xff0c;无论是身处一线的医护工作者、政府职能部门、志愿者&#xff0c;还是坚守在家的人民群众&#xff0c;都在尽自己所能&#xff0c;在行动&#xff01;与此…