翼度科技»论坛 编程开发 .net 查看内容

【c#】从外部复制文本、图片到我的软件中的解决方案(支持ppt,qq等)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
原文地址 https://www.cnblogs.com/younShieh/p/17010572.html
❤如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~❤


  我们先考虑一般会从什么地方复制文本、图片到我们的软件中。
  首先说文本。我们可能会从文本文件,网页,word,ppt,qq,微信,甚至是vsCode等等地方进行复制。能进行文本复制的地方千奇百怪,但是他们使用的都是通用文本容器控件(TextBlock、TextBox等),这些控件的底层复制操作都是一样的,都是将字符串放置到剪切板中。我们只需要获取剪切板中的数据就可以获取到想要的文本数据。当然,如果需要获取特殊样式的文本,比如加粗效果、斜体等效果的文字,还需要特殊处理。
  注意,如果复制PPT元素时,只是框选中了文字进行复制的话,是可以进行文字粘贴的。但是如果复制的是PPT整个文本框元素,就不行。PPT会提前把这个元素转换为对应图片保存到剪切板中。你想去获取文本时,文本为空,这个元素只能转换为图片,甚至默认还有白色背景。。。如果能对PPT进行元素级的解析,则可以转换为文字。WPS同理。
  其次是图片。能进行图片复制的地方就没那么多了,我们主要考虑常见的地方,比如电脑本机,网页,ppt,qq,微信等。不同的地方复制的图片在剪切板中的存储方式也可能不同,这就需要不同的处理方式。大致可以区分为源文本复制和位图数据复制。

  • 获取剪切板对象
  1. IDataObject dataObject = Clipboard.GetDataObject();
复制代码


  • 分析剪切板数据
  通过GetFormats()方法获取复制元素的类型。
  1. string[] formats = dataObject.GetFormats();
复制代码
  formats数组中可以看到现在复制的是什么类型的元素,方便调试。

  解析为纯文字。
  1. var str = dataObject.GetData(DataFormats.Text);
复制代码
  复制项不为文字的话,str=null。

  本地文件、qq和微信(部分)中的图片复制时,为源文件复制。
  1. if (dataObject.GetFormats().Contains(DataFormats.FileDrop)
  2.     && dataObject.TryGetData(DataFormats.FileDrop) is string[] array
  3.     && array.Any())
  4. {
  5.     //array为文件路径
  6. }
复制代码
ppt、word、excel、微信(部分)、网页中的图片都保存为了位图数据,需要按照不同的数据结构进行解析。
可以先创建一个保存的目录,把转换出来的图片保存为本地文件再插入。
图片可能会有透明图层,最好转换为png格式。一般情况下可以直接调用GetImage()方法获取图片。
特殊的,DIB格式需要单独处理,某些截图软件使用的是这个格式进行存储。
ppt中有透明图层的图片复制出来有白色背景,可以使用InteropBitmap类型进行渲染。
代码如下:
  1. string fullName = Path.Combine(AppPath.Temp, Guid.NewGuid().ToString() + ".png");
  2. string[] formats = dataObject.GetFormats();
  3. if (formats.Contains(DataFormats.Dib))
  4. {
  5.     if (dataObject.GetData(DataFormats.Bitmap) is Bitmap bitmap)
  6.     {
  7.         bitmap.Save(fullName, ImageFormat.Png);
  8.     }
  9. }
  10. if (!File.Exists(fullName))
  11. {
  12.     if (System.Windows.Clipboard.GetData(DataFormats.Bitmap) is InteropBitmap interopBitmap)
  13.     {
  14.         interopBitmap.ToLocalImage(fullName);
  15.     }
  16.     else
  17.     {
  18.         if (System.Windows.Forms.Clipboard.GetImage() is Image image)
  19.         {
  20.             ((Bitmap)image).ToLocalImage(fullName, ImageFormat.Png);
  21.         }
  22.     }
  23. }
  24. if (File.Exists(fullName))
  25. {
  26.     //插入到软件
  27. }
复制代码

或许我们还需要在软件内部对某个特殊元素进行复制粘贴。只需要在复制时带上你的特殊元素类型。
  1. IDataObject dataObject = Clipboard.GetDataObject();
  2. dataObject.SetData(typeof(SpacialElement), _element);
  3. Clipboard.SetDataObject(dataObject, true);
复制代码
在粘贴时,检查是否存在该类型,或者强制转换为相应类型。
  1. if(dataObject.GetData(typeof(SpacialElement) is SpacialElement element)
  2. {
  3. }
复制代码
来源:https://www.cnblogs.com/younShieh/archive/2022/12/28/17010572.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具