Delphi.NET 在TWebBrowser中显示PDF

问题描述 投票:0回答:1

我需要将一个pdf文件显示到一个TWebBrowser对象中。WebBrowser1.navigate(PDFFileName) 可以正常工作。

但我想从一个TM内存流加载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;

这就是结果:TWebBrowserResulttwebbrowser不能识别文档内容是pdf文件,我想我忘了设置页面的内容类型,比如说 SetContentType('Application/pdf')

我做错了什么?这可能吗?

PS:我使用的是Delphi XE7。

delphi pdf delphi-xe7 twebbrowser
1个回答
0
投票

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标签内(见这个)。回答):

<iframe src="data:application/pdf;base64,YOUR_BINARY_DATA" height="100%" width="100%"></iframe>
© www.soinside.com 2019 - 2024. All rights reserved.