Delphi:在 TWebBrowser 中显示 PDF

Posted

技术标签:

【中文标题】Delphi:在 TWebBrowser 中显示 PDF【英文标题】:Delphi: Display a PDF in a TWebBrowser 【发布时间】:2020-09-22 05:28:52 【问题描述】:

我需要在 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 twebbrowser 无法识别文档的内容是 pdf 文件。 我想我忘了设置页面的内容类型之类的东西,比如SetContentType('Application/pdf')

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

PS:我正在使用 Delphi XE7

【问题讨论】:

是的,你肯定需要将 content-type 设置为application/pdf 好的,但我该怎么做呢? 不知道,但其实用IE来显示PDF并不是一个好主意,因为它没有原生支持(需要安装Acrobat插件,现在是已弃用)。我建议改为嵌入 Chromium(请参阅 here)。 更正:从 IE 8 开始,Adobe 插件会自动安装,因此您无需再安装插件即可获得 PDF 支持。但是我仍然认为使用 Chromium 是一种更好(更强大)的解决方案。 好的@Olivier 我今天会看看。谢谢。 【参考方案1】:

TWebBrowser 是一个嵌入式 IE 实例,如果您不将 PDF 保存为物理文件,则 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"  ></iframe>

【讨论】:

以上是关于Delphi:在 TWebBrowser 中显示 PDF的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TWebBrowser 中居中和拉伸/收缩 SVG 显示?

从 Delphi 中提取 TWebBrowser 中的 iframe 内容

如何在 Delphi 10.3.3 中访问 TWebBrowser.Document 时克服内存泄漏

从 Delphi 10.3 中的 TWebBrowser OnNavigateError 中提取 StatusCode

使用 TWebBrowser 时查看 Web 控制台

使用delphi在Android下的TWebbrowser中全屏观看youtube或其他视频时出现问题