跟着上一篇的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文档合并功能实现的更多相关文章

  1. xps文档打印后winform界面文字丢失

    最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机,测试的时候也是,一直没有发现问题,但是真正到用户使用的时候,接上正式打印机,打印时候没有问题, ...

  2. 在SharePoint 2013 中使用文档库Scheduling (计划公布功能)

    本文讲述在SharePoint2013 中使用文档库Scheduling (计划公布功能)的步骤和注意的事项. 文档库Scheduling (计划公布功能) 用于设定当文档通过审批后特定的时间区间内才 ...

  3. C# 实现将多个word文档合并成一个word文档的功能

    前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自己修改了一下.在这里跟大家分享一下,希望有用的到的. 要做多word文档合并,首先要导入Micros ...

  4. jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强)

    jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强) 一.总结 一句话总结:多看参考文档,多看主干目录.一般的功能分两个方法来实现,一个对应标签,一个对应标签和事情,比如克隆 ...

  5. WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中

    原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...

  6. Word文档合并

    Word文档合并的一种实现   今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这 ...

  7. ABBYY FineReader 15 文档转换功能

    我们平常工作的时候总会固定地只用某几个文档格式,有的人经常使用office,所以电脑内就没安装PDF阅读器,这个时候就需要文档转换器了,ABBYY FineReader 15 也能够帮助我们实现快速的 ...

  8. Mongoose在向集合中插入文档时的集合命名问题

    Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...

  9. Taurus.MVC 2.3 开源发布:增强属性Require验证功能,自带WebAPI文档生成功能

    背景: 上周,把 Taurus.MVC 在 Linux (CentOS7) 上部署任务完成后. 也不知怎么的,忽然就想给框架集成一下WebAPI文档功能,所以就动手了. 以为一天能搞完,结果,好几天过 ...

随机推荐

  1. cocos2d-x3.x 设计与实现弹出对话框

    要定义一个类PopupLayer 代码PopupLayer.h #ifndef __crossDT_PopupLayer__ #define __crossDT_PopupLayer__ #inclu ...

  2. Java串口通信详细解释

    前言 说到开源.恐怕非常少有人不挑大指称赞. 学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜. 然而开 ...

  3. 【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈

    原文:[百度地图API]如何制作一张魔兽地图!!--CS地图也可以,哈哈哈 摘要: 你玩魔兽不?你知道如何做一张魔兽地图不?! 快来看此文吧! ---------------------------- ...

  4. mysql设置root的密码

    mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

  5. jQuery圆形统计图实战开发

    今天我给大家介绍一款圆形统计图circliful,它基于HTML5的画布和jQuery,无需使用图像轻松实现圆形统计图,而且有很多属性设置,使用起来非常方便. 首先我们需要将jquery库文件和jqu ...

  6. C#中调用Outlook API 发起会议

    原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...

  7. 使用八种牛云存储解决方案ios7.1的app部署问题

    使用八种牛云存储解决方案ios7.1的app部署问题 一个.问题叙述性说明 开发完ios版本号的app.须要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描写叙述例如 ...

  8. Java集合之HashMap源码实现分析

    1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作 ...

  9. 图文解说PhpStorm 7.0版本语法着色

    前不久,我们测试了PhpStorm7.0版本对PHP 5.5的支持,今天我们将继续对PhpStorm 7.0版本对代码支持进行测试. 我们知道,在PhpStorm 6.0版本中,提供一个黑色背景的代码 ...

  10. jquery 超简单的点赞效果

    1.HTML(可以优化一下,尽量少些几个标签.....) <div id="dianz"> <b class="cz"><em&g ...