wpf中xps文檔合并功能實現

原文:wpf中xps文檔合并功能實現

? ? ?跟著上一篇的xps文檔套打的文章,近期一直在研究xps打印技術,其中用戶提到了一個需求,要求能夠多頁面進行打印,我的想法是,先生成xps文件,然后將文件讀取出來以后,合并成一個文件來處理。

? ? ? 如果要是直接先打開一個xps文件,用新文件去寫FixedDocument,或者DocumentSequence?,添加到新的文件中的話,會報錯,提示,

“System.Windows.Xps.XpsPackagingException”類型的未經處理的異常在 ReachFramework.dll 中發生其他信息: Package 已經有根 DocumentSequence 或 FixedDocument。“

? ? 如果你要是直接寫元素的話,則出現如下提示:

”System.InvalidOperationException”類型的未經處理的異常在 PresentationFramework.dll 中發生其他信息: 指定的元素已經是另一個元素的邏輯子元素。請先將其斷開連接。“

通過研究微軟的一個例子,終于搞定:

如果您技術超強,可以直接去看微軟的例子,那個上面定義了5個類,有預覽、顯示、文件拖動,異步讀取等等,非常的全的確是一個好例子,也比較適合于學習如何定義類,但是很容易被里面的東西給繞暈了,我比照的這個例子自己寫了一個簡單的合并文件的函數,可以比較直觀的了解xps的結構,復制的情況。

上代碼:

 1   private void Button_Click(object sender, RoutedEventArgs e)
 2         {
 3                MergeDocument();
 4            
 5         }
 6 
 7         //完全不使用類,函數方式
 8         public void MergeDocument()
 9         {
10 
11             string fristFile = "test1.xps";
12             string secoFile = "test2.xps";
13 
14             string newFile = "xpsShow.xps";
15             File.Delete(newFile);
16 
17          
18             FixedDocumentSequence newFds = new FixedDocumentSequence();//創建一個新的文檔結構
19 
20             DocumentReference newDocRef = AddPage(fristFile);//加入第一個文件
21             newFds.References.Add(newDocRef);
22 
23             newDocRef = AddPage(secoFile);
24             newFds.References.Add(newDocRef);//加入第二個文件
25 
26             //xps寫入新文件
27             XpsDocument NewXpsDocument = new XpsDocument(newFile, System.IO.FileAccess.ReadWrite);
28             XpsDocumentWriter xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(NewXpsDocument);
29             xpsDocumentWriter.Write(newFds);
30             NewXpsDocument.Close();
31 
32             //讀取并顯示
33             XpsDocument xpsnewDocument = new XpsDocument(newFile, FileAccess.Read);
34             docView.Document = xpsnewDocument.GetFixedDocumentSequence();
35         }
36 
37         public DocumentReference AddPage(string fileName)
38         {
39             DocumentReference newDocRef = new DocumentReference();
40             FixedDocument newFd = new FixedDocument();
41 
42             XpsDocument xpsDocument = new XpsDocument(fileName, FileAccess.Read);
43             FixedDocumentSequence docSeq = xpsDocument.GetFixedDocumentSequence();
44 
45             foreach (DocumentReference docRef in docSeq.References)
46             {
47                 FixedDocument fd = docRef.GetDocument(false);
48 
49                 foreach (PageContent oldPC in fd.Pages)
50                 {
51                     Uri uSource = oldPC.Source;//讀取源地址
52                     Uri uBase = (oldPC as IUriContext).BaseUri;//讀取目標頁面地址
53 
54                     PageContent newPageContent = new PageContent();
55                     newPageContent.GetPageRoot(false);//這個地方應當是把文檔解壓成一個包放到內存中我們再去讀取
56                     newPageContent.Source = uSource;
57                     (newPageContent as IUriContext).BaseUri = uBase;
58                     newFd.Pages.Add(newPageContent);//將新文檔追加到新的documentRefences中
59                 }
60             }
61             newDocRef.SetDocument(newFd);
62             xpsDocument.Close();
63             return newDocRef;
64         }

在這個例子中,xps文檔是通過頁面的方式直接讀取了以后復制的。

xps文檔真是一個好東西,我個人認為,我們完全可以將xps文檔做成一個簡單的報表打印工具,尤其適合哪種用戶要求格式嚴格、數據項目比較多,打印要求不能有鋸齒的表格打印(計算不是他的強項)。

源代碼下載:http://download.csdn.net/detail/bcc222/6557311

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450931.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DCT(離散余弦變換(DiscreteCosineTransform))

離散余弦變換(Discrete Cosine Transform,簡稱DCT變換)是一種與傅立葉變換緊密相關的數學運算。在傅立葉級數展開式中,如果被展開的函數是實偶函數,那么其傅立葉級數中只包含余弦項,再將其離散化可導出余弦…

從源碼看ConcurrentHashMap

簡介 ConcurrentHashMap是線程安全的HashMap實現,這里主要研究JDK8后的ConcurrentHashMap,下面是ConcurrentHashMap的簡單結構: ConcurrentHashMap基于HashMap的基本邏輯,通過CAS synchronized 來保證并發安全性。ConcurrentHas…

代碼重構的方法

見:http://blog.csdn.net/u011889786/article/details/51865344 見:http://blog.csdn.net/weiky626/article/details/1602691 一.提取子函數 說白了就是一個大函數里,可以根據不同功能分成幾個小函數,因為說不定,其他…

android 去掉標題欄、狀態欄、橫屏

// 去掉標題欄supportRequestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏、隱藏狀態欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 橫屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION…

Spring Boot 整合Mybatis (一)

2019獨角獸企業重金招聘Python工程師標準>>> 新建spring-boot項目&#xff0c;相關依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><de…

x264 的 cache詳解

在這里和下一級別的分析中有必要先講一下這個h->mb.cache&#xff08;沒法講&#xff0c;就是cache!&#xff09;。 x264_macroblock_cache_load將參考幀中某位置的&#xff08;重建后&#xff09;數據保存進cache&#xff0c;供參考和反復使用。 x264_macroblock_cache_s…

同步/異步阻塞/非阻塞

平時開發中經常會聽大家說到什么同步阻塞、異步非阻塞等等名詞&#xff0c;這里我談下自己對這兩個名詞的理解&#xff0c;僅僅是個人觀點&#xff0c;并不一定正確。 1.阻塞/非阻塞 我認為判定阻塞還是非阻塞&#xff0c;取決于線程所做的操作是否需要將線程掛起等待。 舉個…

Repeater的使用

1.頁面代碼 如果要分頁&#xff0c;那么頁面開頭必須寫&#xff08;<% Register Src"~/Controls/Page.ascx" TagName"Page" TagPrefix"uc1" %>&#xff09; 并且分頁&#xff0c;頁腳<uc1:Page ID"Page2" runat"server&…

springboot 整合 mongodb實現 批量更新數據

現需求&#xff1a;需要批量將1000個數據先查詢在更新到mongodb&#xff08;如果查詢不到數據&#xff0c;則添加數據&#xff09; 1&#xff1a;工具類BathUpdateOptions 1 import org.springframework.data.mongodb.core.query.Query;2 import org.springframework.data.mong…

【開題報告】基于微信小程序的校園資訊平臺的設計與實現

1.選題背景與意義 隨著移動互聯網的快速發展&#xff0c;微信成為了人們日常生活中不可或缺的工具之一。在校園生活中&#xff0c;學生們對于校園資訊的獲取和交流需求也越來越高。然而&#xff0c;傳統的校園資訊發布方式存在信息不及時、傳播范圍有限等問題&#xff0c;無法…

三種Cache寫入方式原理簡介

三種Cache寫入方式原理簡介 在386以上檔次的微機中&#xff0c;為了提高系統效率&#xff0c;普遍采用Cache&#xff08;高速緩沖存儲器&#xff09;&#xff0c;現在的系統甚至可以擁有多級Cache。Cache實際上是位于CPU與DRAM主存儲器之間少量超高速的靜態存儲器&#xff08;S…

Minor GC和Full GC

我們在日常開發中可能經常會聽大家談論GC&#xff0c;但是其實很多人對GC的種類其實并不是很了解&#xff0c;接下來我們簡單介紹下Minor GC和Full GC及他們的區別。 MinorGC&#xff1a; 也可以叫作新生代GC&#xff0c;指的是發生在新生代的垃圾收集動作。因為新生代中對象大…

linux安裝軟件的幾種方法

見&#xff1a;http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安裝方式步驟&#xff1a; 1、找到相應的軟件包&#xff0c;比如soft.version.rpm&#xff0c;下載到本機某個目錄&#xff1b; 2、打開一個終端&#xff0c;su -成root用戶&#xff1b; …

Android NDK MediaCodec在ijkplayer中的實踐

https://www.jianshu.com/p/41d3147a5e07 從API 21&#xff08;Android 5.0&#xff09;開始Android提供C層的NDK MediaCodec的接口。 Java MediaCodec是對NDK MediaCodec的封裝&#xff0c;ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要內容是&a…

leetcode-49-字母異位詞分組(神奇的哈希)

題目描述&#xff1a; 給定一個字符串數組&#xff0c;將字母異位詞組合在一起。字母異位詞指字母相同&#xff0c;但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [[&quo…

【精心總結】java內存模型和多線程必會知識

內存模型 &#xff08;1&#xff09;java內存模型到底是個啥子東西&#xff1f; java內存模型是java虛擬機規范定義的一種特定模型&#xff0c;用以屏蔽不同硬件和操作系統的內存訪問差異&#xff0c;讓java在不同平臺中能達到一致的內存訪問效果&#xff0c;是在特定的協議下…

工作流 activity 視頻教程 + redis 視頻教程 百度網盤分享地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 云盤下載都沒有密碼&#xff0c;直接下載&#xff0c;解壓有密碼&#xff1a;chongxiangmengxiangjiaoyu&#xff0c; 解壓完成后就可以…

快速解決 GRADLE 項目下載 gradle-*-all.zip 慢的問題

1、首先根據項目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 屬性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序結構與控制流

1. 條件語句 if、else與elif語句用于控制條件代碼的執行。條件語句的一般格式如下&#xff1a; if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要執行任何操作&#xff0c;可以省略條件語句的else和elif子句。…

webrtc 源碼結構

apiWebRTC 接口層。包括 DataChannel, MediaStream, SDP相關的接口。各瀏覽器都是通過該接口層調用的 WebRTC。call存放的是 WebRTC “呼叫&#xff08;Call&#xff09;” 相關邏輯層的代碼。audio存放音頻網絡邏輯層相關的代碼。音頻數據邏輯上的發送&#xff0c;接收等代碼。…