上一节我们完成了基本的设置,应该说,至少目前对我来说,现在的功能已经基本够用了。
于是我计划从这篇文章开始,我就不再使用Word进行编辑了,用我这个私人日记软件来编辑,实际验证下是否实用。
如下图,这是我之前教程的编写模式:
之前也交待过,在word文档中编辑,只要是包含了图片的,复制后再粘贴到头条都没办法成功,还需要把图片一个个另外粘贴过去才行。如果是遇到gif动图,从word复制只能复制静态的截图,还得再次复制原文件才能粘贴到头条的编辑器中,操作起来比较麻烦。
于是我就在我的程序中尝试复制粘贴,发现跟word是一样的效果。这对我来说是不实用的,需要对它进行改造。
要解决这个问题,首先要分析下为什么会造成这种情况。我们使用的文本编辑控件是RichTextBox,这个默认是rtf格式的,跟word是一样的。我们把带图文的内容粘贴到word文档中,图片就是可以正常显示的。这就说明我们Ctrl C的内容是rtf格式的,而不是通过浏览器粘贴能够识别出来的格式。那么浏览器能够识别的格式是不是每个浏览器特有的呢?于是我尝试在FireFox中复制图片和文字,粘贴到用Chrome打开的头条编辑器,发现图片是可以显示的,上述的猜测可以排除了。那么这个格式究竟是怎样的呢?我需要在程序中截获一下粘贴的内容。在ContentManagerForm.cs文件中,添加键盘截获事件,截获Ctrl V时的内容:
我们发现,如果从浏览器上按Ctrl C,到我们的软件中按Ctrl V,用DataFormats.Html做参数可以取到值,值的内容大概是这样:
前面红线部分相当于信息头,定义了一些参数,后面从<div>开始就是我们刚刚复制的内容了。我原封不动地将这些内容再写回到剪贴板中,然后在浏览器中按Ctrl V,浏览器也能够正常显示了。
这样我们基本上就明白了,想要跟浏览器正常通讯,需要两步:第一步是要将rtf格式转换为html格式,第二步是要将html再转换成浏览器能够识别的格式到剪贴板。
一、rtf格式转html格式一般这种格式转换需要的工作量都比较大,自己从头开发不大现实,需要网上找找看是否有现成的类库。对比了几家,找到了一个rftpipe的,而且是mit授权的。于是从Nuget获取安装,使用起来很容易:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html = RtfPipe.Rtf.ToHtml(tbxMainBody.Rtf);
如此两行代码就实现了第一步的转换。
二、从html到剪贴板同样也是先网上查资料,找到了一个ClipboardHelper的类,同样也是mit授权的。把代码加入到工程,然后在ContentManagerForm中增加一个专门用于复制成html格式到剪贴板的按钮:
按钮处理代码:
private void btnCopyAsHtml_Click(object sender, EventArgs e)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html = RtfPipe.Rtf.ToHtml(tbxMainBody.Rtf);
ClipboardHelper.CopyToClipboard(html, "");
}
在使用了类库的基础上,三行代码就完成了我想要的功能。
功能演示:
以上解决了从软件复制到头条的问题。
还有一种场景,就是把浏览器当成来源,从浏览器复制到软件的功能。如果是纯文本RichEdit编辑器自带就支持,如果是图文混排的,就需要从html到rtf的转换,我找了一下相关的类库,貌似没有类似rftpipe这种免费且直接支持字符转换的库,很多都是通过文档来转换,而且还是收费的。好不容易找到一个符合要求的,结果这个项目比较老,是在Framework下开发的,不支持.netcore。
鉴于找到合适的库有点困难,随后仔细分析了下需求,其实这种从浏览器图文混排复制到软件的场景对我来说意义不大,通篇复制是不大可能的,关键位置复制文字做摘抄,真的有特别需要的图片,单张截图就好,所以这个功能暂时搁置吧。
这个小项目伴着教程做到了24节,终于有了一点实际作用了:)
----------------------------------------------------
本教程尽量保证2天一更,项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:
私人日记 可以获取Gitee的链接;
sqlitestudio 可以获取sqlitestudio的链接;
菜鸟 可以获取菜鸟教程链接;
QQ群 可以获取教程交流Q群号;
大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!