分享基於silverlight的仿“百度文庫”的文檔控件


通用的FlashPaper支持Word/Excel/PDF,到時對於Silverlight的XPS的文檔支持問題比較多,本控件提供了一個可視化的XPS文檔展示,提供放大縮小/打印/搜索/分頁等功能,主要整合了開源的Document Toolkit。

 

1. 使用Document Toolkit,DocumentDataSource提供數據源,PageNvaigator提供分頁 :


< doc:DocumentDataSource  x:Name ="dataSource" />

         < doc:DocumentViewer  Grid.Row ="1"  x:Name ="viewer"  DocumentDataSource =" {Binding ElementName=dataSource} "  ViewMode =" {Binding SelectedViewMode, ElementName=viewModePicker} "  BorderBrush ="#9fa9a4"  BorderThickness ="1" />

         < doc:PageNavigator  x:Name ="navigator"  HorizontalAlignment ="Center"  
                    PageCount
=" {Binding PageCount, ElementName=viewer} "
                    PageIndex
=" {Binding PageIndex, ElementName=viewer, Mode=TwoWay} "
                    
/>
                
         < doc:ViewModePicker  Grid.Column ="1"  x:Name ="viewModePicker"  Visibility ="Collapsed" />

 

2. WebPackageReader讀取本地xps或遠程xps文件作為數據源

    DotNetZipPackageReader 根據分頁延遲加載文檔


//  loads the sample XPS document from the web
             var url =  string.Format( " /DocumentService.ashx?id={0} ", HtmlPage.Document.GetElementById( " documentId ").GetProperty( " value "));
            webClient.OpenReadAsync( new Uri(HtmlPage.Document.DocumentUri, url));

             var reader =  new WebPackageReader( new Uri(HtmlPage.Document.DocumentUri, url +  " &part= "));
             this.dataSource.PackageReader = reader;
             var xpsClient =  new XpsClient();
            xpsClient.LoadXpsDocumentAsync(reader);

 

3. 服務端根據請求的文件ID和當前頁碼返回指定的文件流


private  void Response(HttpContext context,  string xpsFileName,  string partName)
        {
             using (FileStream stream = File.OpenRead(xpsFileName))
            {
                ZipFile file =  new ZipFile(stream);
                ZipEntry entry = file.GetEntry(partName);
                 if (entry !=  null)
                {
                     using (Stream entryStream = file.GetInputStream(entry))
                    {
                         //  TODO: set mime-type as defined in XPS package
                        context.Response.ContentType =  " application/octet-stream ";
                         byte[] buffer =  new  byte[ 2 <<  14];     //  write blocks of 32768 bytes
                         int read;
                         while ((read = entryStream.Read(buffer,  0, buffer.Length)) >  0)
                        {
                            context.Response.OutputStream.Write(buffer,  0, read);
                        }
                    }
                }
                 else
                {
                     //  return 404 Not Found
                    context.Response.StatusCode = ( int)HttpStatusCode.NotFound;
                }
            }

        }

 

4. 源代碼下載

 https://199.47.216.171/u/10032723/DocumentToolkit.rar

 

5. 在線預覽

 

http://rapidsl2.guozili.25u.com/  ( admin/admin  點左邊菜單 控件展示 - 文檔查看器)

 

 6. 截圖

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM