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 时克服内存泄漏