Как показать образы относительного пути в TWebBrowser?

Я использую TWebBrowser в DesignMode (Doc.DesignMode: = 'Вкл.) Для создания HTML-документа. В TWebBrowser отсутствует документ (файл HTML на диске). Я создаю документ с нуля непосредственно в TWebBrowser. Код html будет извлечен из TWebBrowser и сохранен как c: /MyProjects/SomeHtmlName.html.

Проблема в том, что он не будет показывать изображения, которые я вставляю, если они имеют относительный путь.

Точнее, если я вставлю этот код в WebBrowser, он мгновенно отобразит изображение:

<IMG src="file:///c:/MyProjects/resources/R.PNG">

Однако, если я введу:

<IMG border=0 src="resourcesR.PNG">
<IMG border=0 src="resources/R.PNG">   <---- preferred so it will work on Linux

вместо фактического изображения будет отображаться местозаполнитель изображения.

Мне нужны относительные пути, поэтому веб-сайт будет работать, если я изменю корневой путь или если я загружу его на FTP.


procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadDummyPage;
  SetHtmlCode('<img src="resources/test_img.PNG">');
  Memo1.Text:= GetHtmlCode;
end;



function TForm1.LoadDummyPage: Boolean;
const FileName: string= 'c:MyProject\_ONLINE WEB SITEdummy.html';
begin
  if not Assigned(wbBrowser.Document)
  then wbBrowser.Navigate('about:blank');

  Result := FileExists(FileName);
  if Result
  then wbBrowser.Navigate('file://' + FileName)
  else Caption:= 'file not found';
end;



procedure TForm1.SetHtmlCode(const HTMLCode: string);
var
  Doc: Variant;
begin
  if not Assigned(wbBrowser.Document)
  then wbBrowser.Navigate('about:blank');

  Doc := wbBrowser.Document;
  Doc.Write(HTMLCode);
  Doc.Close;
  Doc.DesignMode := 'On';

  WHILE wbBrowser.ReadyState < READYSTATE_INTERACTIVE
   DO Application.ProcessMessages;

  Doc.body.style.fontFamily := 'Arial';
  Doc.Close;
end;


function TForm1.GetHtmlCode: string;             { Get the HTML code from the browser }
var
  Doc: IHTMLDocument2;
  BodyElement: IHTMLElement;
begin
  if Assigned(wbBrowser.Document) and (wbBrowser.Document.QueryInterface(IHTMLDocument2, Doc) = S_OK) then
  begin
    BodyElement := Doc.body;
    if Assigned(BodyElement) then
      Result := BodyElement.innerHTML;
  end;

  if Result > ''
  then Result := StringReplace(Result, '="about:', '="', [rfReplaceAll, rfIgnoreCase]);  { Fix the 'How stop TWebBrowser from adding 'file:///' in front of my links' bug }
end;

html,delphi,twebbrowser,

2

Ответов: 2


procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadDummyPage;
  SetHtmlCode('<img src="resources/test_img.PNG">');
  Memo1.Text:= GetHtmlCode;
end;



function TForm1.LoadDummyPage: Boolean;
const FileName: string= 'c:MyProject\_ONLINE WEB SITEdummy.html';
begin
  if not Assigned(wbBrowser.Document)
  then wbBrowser.Navigate('about:blank');

  Result := FileExists(FileName);
  if Result
  then wbBrowser.Navigate('file://' + FileName)
  else Caption:= 'file not found';
end;



procedure TForm1.SetHtmlCode(const HTMLCode: string);
var
  Doc: Variant;
begin
  if not Assigned(wbBrowser.Document)
  then wbBrowser.Navigate('about:blank');

  Doc := wbBrowser.Document;
  Doc.Write(HTMLCode);
  Doc.Close;
  Doc.DesignMode := 'On';

  WHILE wbBrowser.ReadyState < READYSTATE_INTERACTIVE
   DO Application.ProcessMessages;

  Doc.body.style.fontFamily := 'Arial';
  Doc.Close;
end;


function TForm1.GetHtmlCode: string;             { Get the HTML code from the browser }
var
  Doc: IHTMLDocument2;
  BodyElement: IHTMLElement;
begin
  if Assigned(wbBrowser.Document) and (wbBrowser.Document.QueryInterface(IHTMLDocument2, Doc) = S_OK) then
  begin
    BodyElement := Doc.body;
    if Assigned(BodyElement) then
      Result := BodyElement.innerHTML;
  end;

  if Result > ''
  then Result := StringReplace(Result, '="about:', '="', [rfReplaceAll, rfIgnoreCase]);  { Fix the 'How stop TWebBrowser from adding 'file:///' in front of my links' bug }
end;
22
4 принят

Вам нужно предварительно загрузить допустимую строку / поток шаблона HTML, включая BASEтег, в котором вы задали желаемый путь (с завершающей косой чертой), например "file:///c:/MyProjects/".

И переключитесь в режим редактирования, где ваши изображения SRCдолжны быть относительными, например "resources/R.PNG". Ваше окончательное извлечение HTML-атера должно быть body.innerHTMLили body.outerHTML(что вам нужно). Вы даже можете взять весь источник документа (google it).

Оберните извлеченный источник с действительным HTML / Body БЕЗ BASEтега и сохраните на диск в c:MyProjects.

но код для IMG execCommand - полный путь!

Вы ничего не можете с этим поделать. это то, как DOM представляет HTML - это не обязательно исходный код HTML. это поведение несовместимо. и также зависит от того, как вы вставляете изображения (я не использую "file:///c:/MyProjects/"и не имею свой собственный диалог и не вставляю свой собственный HTML-код). Вам нужно вручную заменить извлеченный источник Navigate()пустой строкой. по крайней мере, так я это делаю.

Изменить: вам не нужно document.write(HTML)использовать внешний файл. вы можете написать «шаблон» / «пустой» HTML через .const HTML_TEMPLATE = '<html><head><base href="file:///%s"></head><body style="font-family:Arial">%s</body></html>'; procedure TForm1.LoadHTML(HTMLCode: string); var Doc: Variant; HTML, Path: string; begin Path := 'D:Temp'; HTML := Format(HTML_TEMPLATE, [Path, HTMLCode]); WebBrowser1.Navigate('about:blank'); Doc := WebBrowser1.Document; Doc.Write(HTML); Doc.Close; Doc.DesignMode := 'On'; end; procedure TForm1.Button1Click(Sender: TObject); begin LoadHTML('<b>Hello</b><img SRC="resources/1.png">'); end; procedure TForm1.Button2Click(Sender: TObject); var Doc: IHTMLDocument2; begin Doc := WebBrowser1.Document as IHTMLDocument2; if Assigned(Doc) then begin ShowMessage(Doc.body.innerHTML); end; end;

Попробуй это:

<B>Hello</B><IMG src="resources/1.png">

Выход для меня: src. в некоторых случаях src может содержать полный путь. Я не могу на 100% быть уверенным, когда это произойдет. но вы должны быть готовы справиться с этой ситуацией, заменив путь вручную. нет убедительной документации по этому поводу, поэтому я всегда решаю эту проблему в любом случае.


0

Я предлагаю использовать небольшой встроенный веб-сервер, такой как Internet Direct (Indy) TIdHttpServer, который может обслуживать все HTTP-запросы стандартным способом. Это устраняет все возможные проблемы файловой системы.

HTML, Дельфы, TWebBrowser,
Похожие вопросы