我需要将一个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。
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>