Delphi 从Word文档中创建浏览器副本

Delphi 从Word文档中创建浏览器副本,delphi,mshtml,delphi-10-seattle,twebbrowser,Delphi,Mshtml,Delphi 10 Seattle,Twebbrowser,我有一个TWebBrowser处于编辑模式,我正在尝试允许用户复制和粘贴word文档(或任何地方)中的文本和图像,并粘贴到web浏览器中 我已经能够使用以下代码获得要粘贴的文本: pvaIn := EmptyParam; HtmlEditor.ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT, pvaIn); HtmlEditor是我的TWebBrowser组件 我的问题是,当尝试粘贴图像时,web浏览器似乎知道我粘贴了图像,但它只显示一个可编辑的文

我有一个TWebBrowser处于编辑模式,我正在尝试允许用户复制和粘贴word文档(或任何地方)中的文本和图像,并粘贴到web浏览器中

我已经能够使用以下代码获得要粘贴的文本:

pvaIn := EmptyParam;
HtmlEditor.ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT, pvaIn);
HtmlEditor是我的TWebBrowser组件

我的问题是,当尝试粘贴图像时,web浏览器似乎知道我粘贴了图像,但它只显示一个可编辑的文本框


有没有办法将图像粘贴到TWebBrowser中?

这里的解决方案是将位图保存到磁盘,然后创建一个图像html图像并将其附加到光标位置的html

if clipboard.hasformat(cf_bitmap) then //only if the clipboard currently has a image
begin
    bmp := TBitMap.Create();
    CreateGuid(uid);
    try
        filename := 'cb(' + System.Copy(guidToString(uid), 2, 8) + ').bmp'; //generate a unique filename
        path := ExtractFilePath(paramstr(0)) + filename;//the location where we will save it
        bmp.LoadFromClipboardFormat(cf_bitmap, clipboard.GetAsHandle(cf_bitmap), 0);
        bmp.SaveToFile(path); //save the clipboard image to disk

        Doc2 := nil;
        Doc2 := self.HtmlEditor.Document as IHTMLDocument2;

        if Doc2 = nil then
            exit;

        if Assigned(Doc2.Body) then
        begin
            Image := Doc2.createElement('img') as IHtmlDOMNode; //create the img element
            (Image as IHTMLImgElement).src := path; //set this to the path of the image we just saved

            if GetcaretPos(cursor) then //get the element at the cursor position
            begin
                ElementAtCursor := Doc2.elementFromPoint(cursor.X, cursor.Y);
                Html := '<img src="' + path + '"></img>'; //insert the image after this element
                ElementAtCursor.insertAdjacentHTML('AfterBegin', Html);
            end
            else
                (Doc2.Body as IHtmlDOMNode).appendChild(Image); //else just append to the body
        end;
        finally
            bmp.free();
        end;
end;
如果剪贴板.hasformat(cf\u位图),则//仅当剪贴板当前有图像时
开始
bmp:=TBitMap.Create();
CreateGuid(uid);
尝试
文件名:='cb('+System.Copy(guidToString(uid),2,8)+'.bmp'//生成唯一的文件名
路径:=ExtractFilePath(paramstr(0))+文件名//我们将保存它的位置
bmp.LoadFromClipboardFormat(cf_位图,clipboard.GetAsHandle(cf_位图),0);
bmp.SaveToFile(路径)//将剪贴板图像保存到磁盘
Doc2:=零;
Doc2:=self.HtmlEditor.Document作为IHTMLDocument2;
如果Doc2=零,则
出口
如果指定(Doc2.正文),则
开始
Image:=Doc2.createElement('img')作为IHtmlDOMNode//创建img元素
(图像为IHTMLImgElement).src:=路径//将其设置为刚才保存的图像的路径
如果是GetcaretPos(游标),则//在游标位置获取元素
开始
ElementAtCursor:=Doc2.elementFromPoint(cursor.X,cursor.Y);
Html:=''//在此元素后插入图像
ElementAtCursor.insertAdjacentHTML('AfterBegin',Html);
结束
其他的
(Doc2.Body作为IHtmlDOMNode)//否则只需附加到主体
结束;
最后
bmp.free();
结束;
结束;

如您所见,第一步是检查剪贴板是否有CF_位图,如果有,我们将其保存到磁盘。然后,我们创建一个img HTML元素,将该文件名附加到img的src。最后,我们将img添加到光标所在的HTML中,如果我们无法获得光标,那么我们将附加到HTML主体

Web(HTML)页面不包含图像。它们包含指向单独存储在磁盘上的图像的链接。你想把它粘贴到什么地方?@KenWhite这是否意味着我不能使用默认的OLECMDID_粘贴命令?我想让用户能够将word文档的一部分复制到浏览器中,然后使用IndyYou将其作为电子邮件发送。您可以复制文本。不过,我不相信OLECMDID_粘贴会自动为您处理图像。粘贴的图像应该放在哪里,因为它们必须放在硬盘上的某个地方?。(我可能错了,这就是为什么我没有写答案。)@Mattlaza使用TWebBrowser作为发送电子邮件的中间存储??这对你自己来说很难@Jandogen正在处理一个遗留程序,试图不完全重写它