Delphi :在TWebBrowser中显示PDF

62o28rlo  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(563)

我需要在TWebBrowser对象中显示一个pdf文件。WebBrowser1.navigate(PDFFileName)工作正常。
但是我想从TMemoryStream加载PDF文件。
我有一个base64编码的PDF文件内容作为我的程序和搜索谷歌的输入,我写了这样的东西:

procedure WriteOnWB(EncodedPDFString: WideString);
var
    Bytes: TBytes;
    MS: TMemoryStream;
begin   
    Bytes := TNetEncoding.Base64.DecodeStringToBytes(EncodedPDFString);
    MS := TMemoryStream.Create;
    MS.WriteBuffer(Bytes, Length(Bytes));
    MS.Seek(0, 0);

    WebBrowser1.Navigate('about:blank');
    (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(MS));
end;

结果是这样的:TWebBrowserResult web浏览器无法识别文档的内容是pdf文件。我想我忘了设置页面的内容类型,比如SetContentType('Application/pdf')
我做错了什么?这可能吗?
PS:我正在使用 Delphi XE7

hc2pp10m

hc2pp10m1#

TWebBrowser是一个嵌入式IE示例,如果你不将其保存为物理文件,IE不允许你显示PDF。
因此,要显示它,您应该编写如下内容:

procedure WriteOnWB(EncodedPDFString: WideString);
var
    Bytes: TBytes;
    MS: TMemoryStream;
begin   
    Bytes := TNetEncoding.Base64.DecodeStringToBytes(EncodedPDFString);
    MS := TMemoryStream.Create;
    MS.WriteBuffer(Bytes, Length(Bytes));
    MS.Seek(0, 0);
    MS.SaveToFile('FileName.pdf');

    // Now you can navigate to 'FileName.pdf'
    WebBrowser1.Navigate('FileName.pdf');
end;

另一种解决方案是使用Chromium(正如Olivier建议的),Chromium(因为它是Chrome)允许您通过base64编码字符串显示PDF文件,例如,在iframe标签中(参见answer):

<iframe src="data:application/pdf;base64,YOUR_BINARY_DATA" height="100%" width="100%"></iframe>
zbdgwd5y

zbdgwd5y2#

像流一样无文件

procedure FilelessWB2(encodedURL: string);
  var Bytes:TBytes;
      tMS: TMemoryStream;
      WebBrowser1: TWebBrowser; frm1:TForm;
      JPGImage: TJPEGImage;
begin   
  //Bytes:={TNetEncoding.Base64.}{DecodeString}StrToBytes(filetostring(EncodedPDFString));
    
  tMS:= TMemoryStream.Create;
  try
    HttpGet(encodedURL,tmS)
    writeln('debug size: '+itoa((tms.size)));
     { WebBrowser1:= TWebBrowser.create(self);
      MS.WriteBuffer(bytestostr(Bytes),Length(Bytes)); }
    tMS.Seek(0, 0);
     //tMS.SaveToFile(exepath+'FileNametest.jpg');
     //OpenWeb(exepath+'FileNametest.jpg')
    frm1:= TForm.create(self); 
    with frm1 do begin
      setBounds(0,0,500,500)
      with TImage.create(frm1) do begin
        parent:= frm1;
        setBounds(0,0,460,460)
        JPGImage:= TJPEGImage.Create;      
        JPGImage.LoadFromStream(tMS);                
        Picture.Graphic:=(JPGImage);
      end ;
     Show;
    end; 
  finally
    tMS.Free;
    JPGImage.Free;
  end;  
   //Now you can navigate to 'FileName.pdf'
   //WebBrowser1.Navigate(exepath+'FileNametest.pdf');
end;

相关问题