惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
MyScale Blog
MyScale Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
罗磊的独立博客
G
Google Developers Blog
Y
Y Combinator Blog
博客园 - 【当耐特】
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
美团技术团队
宝玉的分享
宝玉的分享
Jina AI
Jina AI
小众软件
小众软件
T
Tailwind CSS Blog
A
About on SuperTechFans

博客园 - eyye的眼睛

又到清明节 sql中去除重复的项 戒烟吧 李开复:如何设计你的2015年度计划 网易邮箱已经忘记了客户 用程序集编写clr表值函数:把正则表达式引入数据库中 从天气网提取气象预报数据 sql 几点记录 sql 重复数据只保留一条 (转)android-sdk_r20.0.3-windows无法正常更新 RichTextBox的拖放功能DragDrop 合并两个rtf文件 杀掉叽哩瓜叽(jlguaji.exe)的两种方法 股票数据(转) word转化为图片(2) SQL Server 的事务处理的两种格式 sql IN语句如何优化?(转) 向EXCEL批量导出数据(转) 禅语
如何将格式文本转化为图片
eyye的眼睛 · 2012-04-24 · via 博客园 - eyye的眼睛

一直在博客园上查找资料,却好久没有写博客了。今天需要将文本转化为图片,在网上找了很久都没有一个很好的办法,终于想到一个比较好的注意,记录下来,与大家分享。

问题:当我们需要将文本文件在别的地方显示的时候,可能会是是一件很容易的事情,但是如果要保证格式完全一样,可能就会变成一件很艰难的事情。比如原本在word或excel里编辑好的一段文本,在网页上显示出来,要求排版,字体大小,表格。。。完全跟原来一样,就会变得很困难。

解决方案:就是把编辑好的文本变成图片。

但是怎样才能把文本变成图片,而原来的样式保持不变呢,文本不难,但难度在于保留样式。

解决思路:我发现在word里复制文本,在[画图](windows附件里都有的程序)里粘贴,就变成图片了,而且满足要求。就是说[画图]程序已经有这项功能,只要调用就可以。

这样,解决过程就变成:文本放到word里--->word里复制--->在[画图]里粘贴--->在[画图]里复制--->再从剪切板里取出图片。

word是比较容易操控的,但[画图]程序没有现成接口,操控起来比较困难一些,需要用到windows的API函数,向[画图]程序发送消息达到操控目的。

用C#写的代码如下,如有更好方法,请指教:

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
        [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
        private static extern void SetForegroundWindow(IntPtr hwnd);
        [DllImport("user32.dll", EntryPoint = "GetMenu")]
        public static extern int GetMenu(int hwnd );
        [DllImport("user32.dll", EntryPoint = "GetSubMenu")]
        public static extern int GetSubMenu(int hMenu,int nPos);
        [DllImport("user32.dll", EntryPoint = "GetMenuItemID")]
        public static extern int GetMenuItemID(int hMenu,int nPos);
        [DllImport("user32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(int hwnd,int wMsg,int wParam,int lParam);
        private const int WM_COMMAND = 0x111;        
        private Image PasteImage()
        {
            //让仅一个画图程序在后台运行,多的杀掉,没有就打开
            //画图程序在进程中的名字是mspaint,没有后缀exe
            System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName(@"mspaint");
            if (process.Count() != 1)
            {
                foreach (System.Diagnostics.Process p in process)
                {
                    p.Kill();
                }
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.FileName = @"mspaint.exe";
                startInfo.CreateNoWindow = false;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                System.Diagnostics.Process txt = Process.Start(startInfo);
                //等一会,睡个觉
                Thread.Sleep(1000);
            }
            //查找<画图>的句柄
            //新打开的<画图>窗口名为"未命名 - 画图",中间有空格
            IntPtr hwndCalc = FindWindow(null, "未命名 - 画图");
            if (hwndCalc != IntPtr.Zero)
            {
                //获取菜单
                int gm = GetMenu(hwndCalc.ToInt32());
                gm = GetSubMenu(gm, 1);
                //粘贴
                int id = GetMenuItemID(gm, 5);
                PostMessage(hwndCalc.ToInt32(), WM_COMMAND, id, 0);
                //复制
                id = GetMenuItemID(gm, 4);
                PostMessage(hwndCalc.ToInt32(), WM_COMMAND, id, 0);
            }
            //睡个觉等一会,否则可能系统还没准备好,然后从剪切板取出
            Thread.Sleep(1000);
            IDataObject data = System.Windows.Forms.Clipboard.GetDataObject();
            return (Image)data.GetData(typeof(Bitmap));            
        }