wpf中xps文档合并功能实现
跟着上一篇的xps文档套打的文章,近期一直在研究xps打印技术,其中用户提到了一个需求,要求能够多页面进行打印,我的想法是,先生成xps文件,然后将文件读取出来以后,合并成一个文件来处理。
如果要是直接先打开一个xps文件,用新文件去写FixedDocument,或者DocumentSequence ,添加到新的文件中的话,会报错,提示,
“System.Windows.Xps.XpsPackagingException”类型的未经处理的异常在 ReachFramework.dll 中发生其他信息: Package 已经有根 DocumentSequence 或 FixedDocument。“
如果你要是直接写元素的话,则出现如下提示:
”System.InvalidOperationException”类型的未经处理的异常在 PresentationFramework.dll 中发生其他信息: 指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。“
通过研究微软的一个例子,终于搞定:
如果您技术超强,可以直接去看微软的例子,那个上面定义了5个类,有预览、显示、文件拖动,异步读取等等,非常的全的确是一个好例子,也比较适合于学习如何定义类,但是很容易被里面的东西给绕晕了,我比照的这个例子自己写了一个简单的合并文件的函数,可以比较直观的了解xps的结构,复制的情况。
上代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
MergeDocument(); } //完全不使用类,函数方式
public void MergeDocument()
{ string fristFile = "test1.xps";
string secoFile = "test2.xps"; string newFile = "xpsShow.xps";
File.Delete(newFile); FixedDocumentSequence newFds = new FixedDocumentSequence();//创建一个新的文档结构 DocumentReference newDocRef = AddPage(fristFile);//加入第一个文件
newFds.References.Add(newDocRef); newDocRef = AddPage(secoFile);
newFds.References.Add(newDocRef);//加入第二个文件 //xps写入新文件
XpsDocument NewXpsDocument = new XpsDocument(newFile, System.IO.FileAccess.ReadWrite);
XpsDocumentWriter xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(NewXpsDocument);
xpsDocumentWriter.Write(newFds);
NewXpsDocument.Close(); //读取并显示
XpsDocument xpsnewDocument = new XpsDocument(newFile, FileAccess.Read);
docView.Document = xpsnewDocument.GetFixedDocumentSequence();
} public DocumentReference AddPage(string fileName)
{
DocumentReference newDocRef = new DocumentReference();
FixedDocument newFd = new FixedDocument(); XpsDocument xpsDocument = new XpsDocument(fileName, FileAccess.Read);
FixedDocumentSequence docSeq = xpsDocument.GetFixedDocumentSequence(); foreach (DocumentReference docRef in docSeq.References)
{
FixedDocument fd = docRef.GetDocument(false); foreach (PageContent oldPC in fd.Pages)
{
Uri uSource = oldPC.Source;//读取源地址
Uri uBase = (oldPC as IUriContext).BaseUri;//读取目标页面地址 PageContent newPageContent = new PageContent();
newPageContent.GetPageRoot(false);//这个地方应当是把文档解压成一个包放到内存中我们再去读取
newPageContent.Source = uSource;
(newPageContent as IUriContext).BaseUri = uBase;
newFd.Pages.Add(newPageContent);//将新文档追加到新的documentRefences中
}
}
newDocRef.SetDocument(newFd);
xpsDocument.Close();
return newDocRef;
}
在这个例子中,xps文档是通过页面的方式直接读取了以后复制的。
xps文档真是一个好东西,我个人认为,我们完全可以将xps文档做成一个简单的报表打印工具,尤其适合哪种用户要求格式严格、数据项目比较多,打印要求不能有锯齿的表格打印(计算不是他的强项)。
源代码下载:http://download.csdn.net/detail/bcc222/6557311
wpf中xps文档合并功能实现的更多相关文章
- xps文档打印后winform界面文字丢失
最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机,测试的时候也是,一直没有发现问题,但是真正到用户使用的时候,接上正式打印机,打印时候没有问题, ...
- 在SharePoint 2013 中使用文档库Scheduling (计划公布功能)
本文讲述在SharePoint2013 中使用文档库Scheduling (计划公布功能)的步骤和注意的事项. 文档库Scheduling (计划公布功能) 用于设定当文档通过审批后特定的时间区间内才 ...
- C# 实现将多个word文档合并成一个word文档的功能
前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自己修改了一下.在这里跟大家分享一下,希望有用的到的. 要做多word文档合并,首先要导入Micros ...
- jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强)
jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强) 一.总结 一句话总结:多看参考文档,多看主干目录.一般的功能分两个方法来实现,一个对应标签,一个对应标签和事情,比如克隆 ...
- WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中
原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...
- Word文档合并
Word文档合并的一种实现 今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这 ...
- ABBYY FineReader 15 文档转换功能
我们平常工作的时候总会固定地只用某几个文档格式,有的人经常使用office,所以电脑内就没安装PDF阅读器,这个时候就需要文档转换器了,ABBYY FineReader 15 也能够帮助我们实现快速的 ...
- Mongoose在向集合中插入文档时的集合命名问题
Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...
- Taurus.MVC 2.3 开源发布:增强属性Require验证功能,自带WebAPI文档生成功能
背景: 上周,把 Taurus.MVC 在 Linux (CentOS7) 上部署任务完成后. 也不知怎么的,忽然就想给框架集成一下WebAPI文档功能,所以就动手了. 以为一天能搞完,结果,好几天过 ...
随机推荐
- springMVC项目异步错误处理请求Async support must be enabled on a servlet and for all filters involved in async
离github在down下一个项目,springMVC-chat.总体上有标注.这就是零配置. 这可苦了我,费尽周折,最后整合到项目现在看起来有点.出来以下的错误.红色部分.解决方法为,在web.xm ...
- 如何使用 RMAN 异构恢复一些表空间
在oracle 在日常维护的数据库中难免会遇到误删数据和使用(drop.delete. truncate)当我们使用常规手段(flashback query .flashback drop)当数据不能 ...
- 解决:<net.sf.ehcache.util.UpdateChecker> : New update(s) found: 2.6.5
由于该项目采用ehcache,所以tomcat每次登录你开始打印net.sf.ehcache.util.UpdateChecker doCheck 一旦有没有特别关注.从今天开始 Tomcat 什么时 ...
- uva 12003 Array Transformer (大规模阵列)
白皮书393页面. 乱搞了原始数组中.其实用另一种阵列块记录. 你不能改变原始数组. 请注意,与原来的阵列和阵列块的良好关系,稍微细心处理边境.这是不难. #include <cstdio> ...
- Tomcat剖析(四):Tomcat默认连接器(1)
Tomcat剖析(四):Tomcat默认连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...
- 多线程——@synchronized(object)
@synchronized 的作用是创建一个相互排斥锁,保证此时没有其他线程对self对象进行改动.这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其他线程訪问,起到线程的保 ...
- Ubuntu更改hosts档
Ubuntu更改hosts档 打开hosts档 sudo gedit /etc/hosts 下载hosts,并全选复制 hosts 粘贴到hosts文件里.保存就可以 $(function () { ...
- TDD(测试驱动开发)学习一:初识TDD
首先说一下名词解释,TDD,英文名称Test-Driven Development,中文名称测试驱动开发,简单的断下句“测试/驱动/开发”,简单的理解一下,就是测试驱动着开发,大白话就是说用一边测试一 ...
- NM常用网络命令
Ipconfig命令 Ipconfig命令可以被用来显示机器当前TCP/IP配置信息. 当使用Ipconfig时不带不论什么參数选项,那么它为每一个已经配置好的接口显示IP地址.子网掩码和默认网关值. ...
- js+css3动态时钟-------Day66
昨天,有一天招,宽带到底没装上.相当恼火,不过包了一天租新房,有很多想法下来,其中,率先实现了--动态时钟(它已上载的资源,一些粗略的全貌.汗...) 这里记录.这个看似简单的功能,以达到良好的,我在 ...