Приветствую! Реализую отображение PDF в WinForm-проге. PDF достается из БД, поэтому хотелось бы без необходимости его на диск не сохранять, а отображать прямо из памяти.
Использую компонент от Adobe, но он требует URL файла, который будет отображаться. Реализовал с созданием временного файла, но хотелось бы брать данные прямо из памяти. Есть идеи, как это сделать?
Гугл говорит, что этот компонент так не умеет. А зачем? Сохранить во временный файл и не париться )
По одной из ссылок в гугле есть этот код, но не думаю, что он работает.
byte[] ap = (byte[])documentsDataGridView.SelectedRows[0].Cells["pdf_file"].Value;
MemoryStream ms = new MemoryStream(ap);
axAcroPDF1.src = LocalEncoding.GetString(ms.ToArray());
Пробовал использовать другие компоненты. С ними основная проблема в том, что они платные, а бесплатная версия позволяет отображать только несколько страниц за время работы приложения и иногда добавляет свой ватермарк.
Эх, видимо придется остановится на варианте с временными файлами…
Какие операции? Что сервер отдаст? Кому логичнее? Зачем?
PDF сложный формат, зачем каждому сайту желающему отдать PDF столько сложностей? + еще и ограничение выбора пользователя.
В ФФ по умолчанию свой PDF ридер (https://github.com/mozilla/pdf.js/), зачем ему брать пример с древнего виндовского компонента Адоби и не давать возможность просто передать байты? (которые в любом случае надо прочитать из файла)
В Хроме тоже аналогично, вроде там Pdfium, дотнетовская обертка которого выше в теме.
Тема не о вебе вообще, в этом компоненте Адоби под URL имеют в виду просто путь файла, видимо для ActiveX так назвали. (может быть HTTP и т.п. ссылки он тоже поддерживает)
Все работает, как мне и нужно было. Спасибо, Алекс.
Byte[] arr = //from DB
MemoryStream ms = new MemoryStream(arr);
var pdf = new PdfViewer();
...
PdfDocument doc = PdfDocument.Load(ms);
pdf.Document = doc;