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
wpf中xps文档合并功能实现相关推荐
- xps文档打印后winform界面文字丢失
xps文档打印后winform界面文字丢失 原文:xps文档打印后winform界面文字丢失 最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机, ...
- VB.NET生成XPS文档
VB.NET生成XPS文档 本文主要解决的问题有 1.XPS文档生成问题 2.利用打印机生成时,弹出正在打印第几页的问题 3.XPS内容写入基本操作 XPS文档对比PDF的优势 1.XPS文档不易更改 ...
- 在ASP.NET Core中如何将各种文档合并为PDF?Aspose快速搞定!
在各种业务环境中,将各种文档合并为一个PDF是客户最常问的问题之一.例如,假设您的组织有多个应用程序以XPS和PDF生成特定的文档,使用扫描的图像,并且您的用户希望将其中一些文档合并为一个PDF. 本 ...
- 没有会员wps合并多个sheet_WPS「合并文档」功能,如何“唰”一下把多个文档合并到一起?...
在我们的日常工作中,合并多个文档时,多数是将各文档逐一打开.复制.粘贴.关闭等,既麻烦又耗时,还会影响完成进度.那么有没有什么"骚"操作,可以快速高效合并文档?今天就给大家分享如何 ...
- Aspose.Words for .NET使用教程(五):文档格式功能及邮件合并功能
Aspose.Words无需Microsoft Word也可在任何平台上满足Word文档的一切操作需求.本文将以表格的形式与大家分享Aspose.Words for .NET的文档格式功能.邮件合并功 ...
- Computer:成功解决在WPS中合并论文中两个文档(比如将另一个封皮的文档合并在当前文档当中)
Computer:成功解决在WPS中合并两个文档(比如将另一个封皮的文档合并在当前文档当中) 目录 解决问题 解决方法 解决问题 经常在写论文的时候,需要这样的一个场景,在WPS中合并两个文档,比如将 ...
- C# 实现将多个word文档合并成一个word文档的功能
https://www.cnblogs.com/zhenzaizai/p/7782748.html 前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自 ...
- WPF:WPF显示PDF文档 之 编译 MoonPdfLib库
简述 在之前一篇文章中,我讲述了如何使用WPF显示PDF文档,开发环境是VS2013 + .Net FrameWork4.5 + x64.因为后面我使用了.Net FrameWork 4.6.1, ...
- 项目中的难点怎么克服_克服大型项目中的文档挑战
项目中的难点怎么克服 鉴于最近熊猫( Pandas) ,NumPy和Matplotlib等开放源数据科学项目的普及Swift增长,人们对文档的兴趣日益浓厚 ,这不足为奇. 为了帮助您了解所面临的问题, ...
最新文章
- Bootstrap3.1开发的响应式个人简历模板
- .net中语音识别和语音合成(二)语音合成提高篇
- jenkins docker 安装_docker 安装 Jenkins
- react监听input框里的值
- 电脑卡顿,最先升级这个硬件,运行速度可快速提升!
- [C++] C++标准中定义的实体(entity)/ 声明 / 定义
- Laravel 使用 scout 集成 elasticsearch 做全文搜索
- Win10 64位系统运行汇编程序(使用masm与dosbox)
- pg_bigm 处理中间模糊匹配 like ‘%xxoo%‘
- 第1015期机器学习日报(2017-06-29)
- 学信网学位认证报告在哪
- 基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
- CMNET和CMWAP简单区别
- flv.js php,flv.js的使用详解
- 电脑硬件故障的排除方法经典收集大全
- 假作真时真亦假——“真实”IP带来的安全隐患
- Redis入门(七):Redis分布式锁(单机模式/集群模式)
- Win 8换徽标全面整合亮点功能大阅兵——乡巴佬下载
- 2. 认识O(logN)的排序
- 高级攻防研究员-红队管理