XPS (XML Paper Specification) 是微軟推出的固定版面文檔格式,與 Adobe PDF 同屬「電子紙」陣營。早期 Silverlight 缺乏對 Glyphs.FontSource 的支援,導致第三方 XPS 閱讀器多為收費方案。隨著 Silverlight 4 開放字體來源屬性,自製 XPS 閱讀器終於成為可能。本文分享一套完整的 Silverlight XPS 閱讀器實現,包含頁面導航、翻頁動畫、文檔結構解析等核心功能,並討論「打印生成 XPS 無法讀取」的已知限制。
專案依 XPS 官方結構建模,解壓 .xps (實為 .zip) 即可見對應關係。三大核心類別:
FixedPage 元素,負責單頁渲染與顯示。其餘輔助類別對應 FixedDocument、PageContent、ResourceDictionary 等結構節點。
引入 XpsDocumentType 列舉區分來源:
OfficeConverted:Office 匯出/列印至 XPS —— 完整支援。PrintGenerated:虛擬印表機直接輸出 —— 無法讀取資源字體,暫不支援。期待社群大神破解列印版 XPS 的資源解析難題。
xmlns:xps="clr-namespace:MyControl.XpsDocument; assembly=MyControl"
<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 大綱導航),外部連結新開頁籤。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;
}
}
完整原始碼已開源,歡迎下載研究、回報 Issue 或提交 PR。若您攻克了「列印版 XPS 資源讀取」難題,請務必分享解法,不勝感激!