Delphi: 在 TWebBrowser 中显示 PDF

Delphi: Display a PDF in a TWebBrowser

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

但我想从 TMemoryStream 加载 pdf 文件。

我有一个 base64 编码的 PDF 文件内容作为我的程序的输入并在 google 上搜索我写了这样的东西:

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 twebbrowser 无法识别文档的内容是 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 标记内(参见 answer):

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