从嵌入式资源加载XPS到documentviewer

本文关键字:documentviewer XPS 加载 嵌入式 资源 | 更新日期: 2023-09-27 18:14:18

我想帮助我的应用程序。我有xps文档,我正在加载到documentviewer。这些文件嵌入在资源文件中。

我可以访问这些作为bytearray。例如Properties.Resources.help_sudoku_methods_2返回byte []

然而,documentviewer不能读取它,需要fixeddocumentsequence。所以我从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到documentviewer?或者我需要一些东西,比如从资源复制文件到应用程序目录,从这里加载,而不是内存流?谢谢你。

从嵌入式资源加载XPS到documentviewer

你为什么不把文件写入系统临时文件夹,然后从那里读取呢?

    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);