Загрузить XPS в просмотрщик документов из встроенного ресурса - PullRequest
1 голос
/ 13 ноября 2011

Я пытаюсь помочь с моей заявкой.У меня есть документы xps, которые я загружаю в просмотрщик документов.Эти файлы встроены в файл ресурсов.

Я могу получить к ним доступ как к байтовому массиву.Например, Properties.Resources.help_sudoku_methods_2 возвращает byte []

Однако программа просмотра документов не может его прочитать и требует фиксированной последовательности документов.Поэтому я создаю поток памяти из bytearray, затем xpsdocument и затем fixeddocumentsequence следующим образом:

 private void loadDocument(byte[] sourceXPS)
        {
            MemoryStream ms = new MemoryStream(sourceXPS);
            const string memoryName = "memorystream://ms.xps";
            Uri memoryUri = new Uri(memoryName);
            try
            {
                PackageStore.RemovePackage(memoryUri);
            }
            catch (Exception)
            { }

            Package package = Package.Open(ms);


            PackageStore.AddPackage(memoryUri, package);

            XpsDocument xps = new XpsDocument(package, CompressionOption.SuperFast, memoryName);

            FixedDocumentSequence fixedDocumentSequence = xps.GetFixedDocumentSequence();
            doc.Document = fixedDocumentSequence;


        }

Это очень нечистый подход, который также не работает, если в файлах есть изображения - вместо изображений в новых документах отображаются изображения изПервый загруженный документ.

Есть ли более понятный способ загрузки XPS из встроенных ресурсов в средство просмотра документов?или мне нужно что-то вроде копирования файла из ресурсов в каталог приложения и загрузки отсюда, а не памяти?Спасибо.

1 Ответ

1 голос
/ 15 ноября 2011

почему вы не записываете файл в системную временную папку, а затем читаете оттуда.

    Stream ReadStream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("file1.xps");
        string tempFile = Path.GetTempPath()+"file1.xps"; 
        FileStream WriteStream = new FileStream(tempFile, FileMode.Create, FileAccess.Write);
        ReadStream.CopyTo(WriteStream);
        WriteStream.Close();
        ReadStream.Close();

        // Read tempFile INTO memory here and then

        File.Delete(tempFile);
...