Приветствую, разработчики на Delphi! В этом руководстве мы рассмотрим, как загрузить PDF-документ в компонент TWebBrowser, используя TMemoryStream, что может быть полезно для работы с файлами без сохранения их на диск. Это особенно актуально для современных приложений, где предпочтительно избегать создания временных файлов.
Проблема
Иногда возникает необходимость отобразить PDF-документ в TWebBrowser, загружая его напрямую из TMemoryStream. Это может быть связано с тем, что у вас есть строка в кодировке Base64, содержащая PDF, и вы хотите отобразить этот документ в браузере без сохранения его на диск.
Решение
Исходный код, который вы пытались использовать, не включал настройку типа контента для отображаемого документа. Это ключевой момент, который позволяет браузеру корректно интерпретировать содержимое как PDF. Вот как это можно сделать:
procedure WriteOnWB(EncodedPDFString: WideString);
var
Bytes: TBytes;
MS: TMemoryStream;
HTMLContent: string;
begin
Bytes := TNetEncoding.Base64.DecodeStringToBytes(EncodedPDFString);
MS := TMemoryStream.Create;
MS.WriteBuffer(Bytes, Length(Bytes));
MS.Seek(0, soFromBeginning);
// Создаем HTML-страницу с объектом, который будет отображать PDF
HTMLContent := '<object type="application/pdf" data="data:application/pdf;base64,' + EncodedPDFString + '" width="100%" height="100%"></object>';
// Перезагружаем документ браузера, установив новый HTML-содержимое
WebBrowser1.Navigate('about:blank');
(WebBrowser1.Document as IPersistStreamInit).LoadFromBase64(HTMLContent, True);
end;
Важно отметить, что встроенный в Delphi TWebBrowser использует Internet Explorer, который по умолчанию не поддерживает отображение PDF без дополнительных плагинов. В связи с этим, рекомендуется рассмотреть альтернативные решения, например, использование Chromium Embedded Framework (CEF), который поддерживает отображение PDF напрямую.
Альтернативный подход
Если вы все же хотите избежать использования временных файлов, вы можете использовать следующий подход:
procedure FilelessWB2(encodedURL: string);
var
Bytes: TBytes;
MS: TMemoryStream;
begin
// Получаем данные из URL в поток
MS := TMemoryStream.Create;
try
HttpGet(encodedURL, MS);
// Создаем HTML-объект для вставки в документ браузера
WebBrowser1.Navigate('about:blank');
MS.Seek(0, soFromBeginning);
var HTMLContent := '<iframe src="data:application/pdf;base64,';
var base64Data := TNetEncoding.Base64.EncodeStringToBytes(MS.ToArray);
HTMLContent := HTMLContent + TNetEncoding.Base64.DecodeStringToEncodingType(base64Data, teBase64_URLSafe).EncodeString(base64Data) + '" width="100%" height="100%" frameborder="0" scrolling="auto"></iframe>';
WebBrowser1.Document.Write(HTMLContent);
finally
MS.Free;
end;
end;
В этом примере мы используем HTML-элемент iframe, чтобы отобразить PDF из Base64-строки непосредственно внутри TWebBrowser.
Заключение
В данном руководстве мы рассмотрели проблему загрузки PDF в TWebBrowser через TMemoryStream и предложили два способа решения: настройка типа контента для корректного отображения документа и использование альтернативного подхода с iframe для встраивания PDF без сохранения файла на диск. Оба способа требуют внимательного обращения к типам контента и возможностям интернет-браузера, который вы используете.
Разработка на Delphi: проблема и решение загрузки PDF-фильов в `TWebBrowser` через `TMemoryStream`, обход сохранения файлов на диск.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.