为什么我不能粘贴复制到剪贴板的格式化文本?

时间:2018-08-08 15:15:04

标签: c# winforms

我正在尝试将一些HTML文本复制到剪贴板中并能够粘贴。

一个例子:

var text = @"<html>
<a href=""#"">Click me!</a><br/>
</html>";

Clipboard.SetText(text, TextDataFormat.Html);

当我尝试这样做时,剪贴板变成空的,我无法将任何东西粘贴到文本文档或任何地方。当然,我可以通过以下方式获取文字:

var text = Clipboard.GetText(TextDataFormat.Html);

但这不是我想要的。我想要的行为是从浏览器复制HTML文本并将其粘贴到Word文档上,例如,必须保留格式。如果我不使用任何文本格式或使用TextDataFormat.Text,则会粘贴文本而不进行格式化。

有什么办法可以做到这一点?

1 个答案:

答案 0 :(得分:4)

HTML数据格式并不意味着有效载荷是纯HTML。内容的结构在文档的HTML Clipboard Format中进行了描述。必须使用Version,StartHTML和EndHTML元素。

以下代码将在剪贴板中放置一个HTML代码段,该代码段可以粘贴到理解HTML格式的应用程序中,例如Word:

var text = @"Version:0.9
StartHTML:0000000055
EndHTML:0000000088
<a href='#'>Click me!</a><br/>";

System.Windows.Forms.Clipboard.SetText(text,TextDataFormat.Html);

没有这些元素,文本将不会被识别为HTML有效内容,并且无法粘贴。

HTML格式可以包含的片段以上。如果有人从浏览器复制文本,则HTML有效内容可能最终包含样式,字体和索引,这些样式,字体和索引不是属于实际摘录的一部分,但对于允许正确呈现是必不可少的。复制时,此问题的标题如下所示:

Version:0.9
StartHTML:0000000224
EndHTML:0000001613
StartFragment:0000000260
EndFragment:0000001577
SourceURL:https://stackoverflow.com/questions/51750187/why-i-cannot-paste-formatted-text-copied-to-clipboard#51750187
<html>
<body>
<!--StartFragment--><h1 itemprop="name" class="grid--cell fs-headline1 fl1" style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.3; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 2.07692rem !important; vertical-align: baseline; box-sizing: inherit; flex: 1 1 auto !important; color: rgb(36, 39, 41); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"><a href="https://stackoverflow.com/questions/51750187/why-i-cannot-paste-formatted-text-copied-to-clipboard" class="question-hyperlink" style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: 1.35; font-family: inherit; font-size: 24px; vertical-align: baseline; box-sizing: inherit; color: rgb(36, 39, 41); text-decoration: none; cursor: pointer;">Why I cannot paste formatted text copied to clipboard?</a></h1><!--EndFragment-->
</body>
</html>00

返回HTML内容的代码是:

var obj=System.Windows.Forms.Clipboard.GetDataObject();
var html=obj.GetData("HTML Format");
Console.WriteLine(html);

浏览器使用多个格式添加数据。下一行

Console.WriteLine(obj.GetFormats());

返回了 6 种不同的格式:

  • HTML格式
  • System.String
  • UnicodeText
  • 文本
  • 语言环境
  • OEMText

所有这些的原因是剪贴板用于在使用或理解相同格式的应用程序之间传输数据。源应用程序以 理解的格式将数据添加到剪贴板。 来源的职责是将尽可能多的数据放入剪贴板,以确保内容可以在另一端复制。

目标应用程序以他们理解的格式请求剪贴板数据。剪贴板可以尝试从一种格式转换为另一种格式。不可能时,它将返回NULL

多种格式

要支持多个目标,应用程序可以创建一个包含多种格式的DataObject。以下代码添加了可以粘贴到Word中的HTML有效负载和可以粘贴到任何文本编辑器中的Text有效负载:

var html = @"Version:0.9
StartHTML:0000000055
EndHTML:0000000088
<a href='#'>Click me!</a><br/>";

var plainText=@"<a href='#'>Click me!</a><br/>";

var obj=new DataObject();
obj.SetText(html,TextDataFormat.Html);
obj.SetText(plainText,TextDataFormat.Text);

Clipboard.SetDataObject(obj);