首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

打造 Silverlight 版 XPS 文檔閱讀器:從架構到實戰

     編輯:關於.NET

前言:XPS 與 Silverlight 的邂逅

XPS (XML Paper Specification) 是微軟推出的固定版面文檔格式,與 Adobe PDF 同屬「電子紙」陣營。早期 Silverlight 缺乏對 Glyphs.FontSource 的支援,導致第三方 XPS 閱讀器多為收費方案。隨著 Silverlight 4 開放字體來源屬性,自製 XPS 閱讀器終於成為可能。本文分享一套完整的 Silverlight XPS 閱讀器實現,包含頁面導航、翻頁動畫、文檔結構解析等核心功能,並討論「打印生成 XPS 無法讀取」的已知限制。

整體架構與核心類別

專案依 XPS 官方結構建模,解壓 .xps (實為 .zip) 即可見對應關係。三大核心類別:

  • XpsDocument:承載文檔流 (Stream),管理整體生命週期。
  • XpsToSilverlightXaml:將 XPS XML 轉換為 Silverlight 可渲染的 XAML (參考國外開源實現)。
  • FixedPage:對應 XPS FixedPage 元素,負責單頁渲染與顯示。

其餘輔助類別對應 FixedDocument、PageContent、ResourceDictionary 等結構節點。

文檔類型區分

引入 XpsDocumentType 列舉區分來源:

  • OfficeConverted:Office 匯出/列印至 XPS —— 完整支援。
  • PrintGenerated:虛擬印表機直接輸出 —— 無法讀取資源字體,暫不支援。

期待社群大神破解列印版 XPS 的資源解析難題。

控件使用指南

1. 註冊命名空間

xmlns:xps="clr-namespace:MyControl.XpsDocument; assembly=MyControl"

2. XAML 佈局

<ScrollViewer>
  <StackPanel x:Name="LayoutRoot">
    <xps:XpsDocument IsEnableAnima="True"
                     x:Name="xpsDocument"
                     IsEnableNavigate="True" />
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
      <xps:XpsControl x:Name="xpsControl" />
      <Button Content="Load" Click="Button_Click" />
    </StackPanel>
  </StackPanel>
</ScrollViewer>

屬性說明:

  • IsEnableAnima:啟用翻頁動畫 (預設 180° 旋轉),可自訂動畫。
  • IsEnableNavigate:啟用頁面導航 (類 Word 大綱導航),外部連結新開頁籤。

3. 後端載入邏輯

private void Button_Click(object sender, RoutedEventArgs e)
{
    var dlg = new OpenFileDialog();
    if (dlg.ShowDialog() == true)
    {
        var streamInfo = new StreamResourceInfo(dlg.File.OpenRead(), null);
        xpsDocument.SetStream(streamInfo);
        xpsControl.Document = xpsDocument;
    }
}

功能展望與已知限制

  • ✅ 完美還原文檔外觀
  • ✅ 頁面導航 (標題/超連結)
  • ✅ 翻頁動畫 (可自訂)
  • ❌ 無法讀取虛擬印表機產出的 XPS (字體資源解析失敗)
  • 🔮 文字選取、縮放、列印等功能留待擴充

結語

完整原始碼已開源,歡迎下載研究、回報 Issue 或提交 PR。若您攻克了「列印版 XPS 資源讀取」難題,請務必分享解法,不勝感激!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved