原文: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文档合并功能实现相关推荐

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

    xps文档打印后winform界面文字丢失 原文:xps文档打印后winform界面文字丢失 最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机, ...

  2. VB.NET生成XPS文档

    VB.NET生成XPS文档 本文主要解决的问题有 1.XPS文档生成问题 2.利用打印机生成时,弹出正在打印第几页的问题 3.XPS内容写入基本操作 XPS文档对比PDF的优势 1.XPS文档不易更改 ...

  3. 在ASP.NET Core中如何将各种文档合并为PDF?Aspose快速搞定!

    在各种业务环境中,将各种文档合并为一个PDF是客户最常问的问题之一.例如,假设您的组织有多个应用程序以XPS和PDF生成特定的文档,使用扫描的图像,并且您的用户希望将其中一些文档合并为一个PDF. 本 ...

  4. 没有会员wps合并多个sheet_WPS「合并文档」功能,如何“唰”一下把多个文档合并到一起?...

    在我们的日常工作中,合并多个文档时,多数是将各文档逐一打开.复制.粘贴.关闭等,既麻烦又耗时,还会影响完成进度.那么有没有什么"骚"操作,可以快速高效合并文档?今天就给大家分享如何 ...

  5. Aspose.Words for .NET使用教程(五):文档格式功能及邮件合并功能

    Aspose.Words无需Microsoft Word也可在任何平台上满足Word文档的一切操作需求.本文将以表格的形式与大家分享Aspose.Words for .NET的文档格式功能.邮件合并功 ...

  6. Computer:成功解决在WPS中合并论文中两个文档(比如将另一个封皮的文档合并在当前文档当中)

    Computer:成功解决在WPS中合并两个文档(比如将另一个封皮的文档合并在当前文档当中) 目录 解决问题 解决方法 解决问题 经常在写论文的时候,需要这样的一个场景,在WPS中合并两个文档,比如将 ...

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

    https://www.cnblogs.com/zhenzaizai/p/7782748.html 前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自 ...

  8. WPF:WPF显示PDF文档 之 编译 MoonPdfLib库

    简述   在之前一篇文章中,我讲述了如何使用WPF显示PDF文档,开发环境是VS2013 + .Net FrameWork4.5 + x64.因为后面我使用了.Net FrameWork 4.6.1, ...

  9. 项目中的难点怎么克服_克服大型项目中的文档挑战

    项目中的难点怎么克服 鉴于最近熊猫( Pandas) ,NumPy和Matplotlib等开放源数据科学项目的普及Swift增长,人们对文档的兴趣日益浓厚 ,这不足为奇. 为了帮助您了解所面临的问题, ...

最新文章

  1. Bootstrap3.1开发的响应式个人简历模板
  2. .net中语音识别和语音合成(二)语音合成提高篇
  3. jenkins docker 安装_docker 安装 Jenkins
  4. react监听input框里的值
  5. 电脑卡顿,最先升级这个硬件,运行速度可快速提升!
  6. [C++] C++标准中定义的实体(entity)/ 声明 / 定义
  7. Laravel 使用 scout 集成 elasticsearch 做全文搜索
  8. Win10 64位系统运行汇编程序(使用masm与dosbox)
  9. pg_bigm 处理中间模糊匹配 like ‘%xxoo%‘
  10. 第1015期机器学习日报(2017-06-29)
  11. 学信网学位认证报告在哪
  12. 基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  13. CMNET和CMWAP简单区别
  14. flv.js php,flv.js的使用详解
  15. 电脑硬件故障的排除方法经典收集大全
  16. 假作真时真亦假——“真实”IP带来的安全隐患
  17. Redis入门(七):Redis分布式锁(单机模式/集群模式)
  18. Win 8换徽标全面整合亮点功能大阅兵——乡巴佬下载
  19. 2. 认识O(logN)的排序
  20. 高级攻防研究员-红队管理

热门文章

  1. 128位java_Java:如何使用CFB和无填充实现128位AES
  2. mysql简单外连接查询
  3. Android入门(14)| 通知
  4. python学习实例(7)
  5. 顺序结构实现【数据结构】
  6. C++:10---再议拷贝构造函数
  7. Python(12)-while语句+赋值运算符号+转义字符
  8. Linux加密框架 crypto RC4
  9. openssl里面AES算法主要函数的参数的介绍
  10. Algorand的共识协议及其核心的优势