Отображение PDF из памяти в WinForms

Приветствую! Реализую отображение PDF в WinForm-проге. PDF достается из БД, поэтому хотелось бы без необходимости его на диск не сохранять, а отображать прямо из памяти.
Использую компонент от Adobe, но он требует URL файла, который будет отображаться. Реализовал с созданием временного файла, но хотелось бы брать данные прямо из памяти. Есть идеи, как это сделать?

AxAcroPDF viewer;
...
String tempName = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".pdf");
File.WriteAllBytes(tempName, arr);
viewer.src = tempName;

Гугл говорит, что этот компонент так не умеет. А зачем? Сохранить во временный файл и не париться )

По одной из ссылок в гугле есть этот код, но не думаю, что он работает.

byte[] ap = (byte[])documentsDataGridView.SelectedRows[0].Cells["pdf_file"].Value;  
MemoryStream ms = new MemoryStream(ap);  
axAcroPDF1.src = LocalEncoding.GetString(ms.ToArray());

Не, этот код не работает. Сам на него натыкался, когда гуглил.

Ну может какой хитрый способ кому-нибудь известен. Как, например, в JS с преобразованием в base64-строку и последующим отображением :slight_smile:

Не хочется на диск писать. Кроме того, мне пока не ясно, будет ли на клиентской машине всегда доступно сохранение по этому временному пути.

Ну тогда только искать другой компонент.

Это должен компонент поддерживать. Если он просто читает файл, то вряд ли.

Пробовал использовать другие компоненты. С ними основная проблема в том, что они платные, а бесплатная версия позволяет отображать только несколько страниц за время работы приложения и иногда добавляет свой ватермарк.

Эх, видимо придется остановится на варианте с временными файлами…

Наверняка есть и бесплатные опенсорсные.
Например

Браузеры точно так же работают.

Из какой памяти? ОЗУ, HDD, и т. д. Что подразумеваете под словом память?

Обычно под словом память подразумевают ОЗУ )
Очевидно тут о ней и речь раз


Думаю смотря какие и когда.

Открыл https://web.mit.edu/alexmv/6.037/sicp.pdf в Firefox, не вижу его в /tmp/
Зачем ему это делать?

Так тогда логичнее использовать интерпретатор PHP и выполнять операции на стороне сервера. И не грузить машину клиента.

Открыл в Opera, предлагает сохранить на диск. Прямая ссылка на PDF. Не понял сути?

Какие операции? Что сервер отдаст? Кому логичнее? Зачем?
PDF сложный формат, зачем каждому сайту желающему отдать PDF столько сложностей? + еще и ограничение выбора пользователя.

Я ж говорю, зависит от браузера и настроек.

В ФФ по умолчанию свой PDF ридер (https://github.com/mozilla/pdf.js/), зачем ему брать пример с древнего виндовского компонента Адоби и не давать возможность просто передать байты? (которые в любом случае надо прочитать из файла)

В Хроме тоже аналогично, вроде там Pdfium, дотнетовская обертка которого выше в теме.

Я к тому что по прямому URL однозначно вызываем диалог сохранения файла на диск.

Что есть ФФ?

Тема не о вебе вообще, в этом компоненте Адоби под URL имеют в виду просто путь файла, видимо для ActiveX так назвали. (может быть HTTP и т.п. ссылки он тоже поддерживает)

Firefox

Похоже на то, что нужно. Посмотрю. Спасибо.

Да, это путь к файлу, данный путь может быть и ссылкой.

Все работает, как мне и нужно было. Спасибо, Алекс.

Byte[] arr = //from DB
MemoryStream ms = new MemoryStream(arr);
var pdf = new PdfViewer();
...
PdfDocument doc = PdfDocument.Load(ms);
pdf.Document = doc;