wpf采用Xps实现文档显示、套打功能

简介: 原文:wpf采用Xps实现文档显示、套打功能近期的一个项目需对数据进行套打,用户要求现场不允许安装office、页面预览显示必须要与文档完全一致,xps文档来对数据进行处理。Wpf的DocumentView 控件可以直接将数据进行显示,xps也是一种开放式的文档,如果我们能够替换里面的标签就最终实现了我们想要的效果。
原文: wpf采用Xps实现文档显示、套打功能

近期的一个项目需对数据进行套打,用户要求现场不允许安装office、页面预览显示必须要与文档完全一致,xps文档来对数据进行处理。Wpf的DocumentView 控件可以直接将数据进行显示,xps也是一种开放式的文档,如果我们能够替换里面的标签就最终实现了我们想要的效果。

 

推荐两篇关于xps的文档介绍

http://www.microsoft.com/china/MSDN/library/Windev/WindowsVista/0601XMLPaperSpecification.mspx

http://technet.microsoft.com/zh-cn/ms771722(fr-fr,VS.85).aspx

废话不多说,上代码

      

   private void setPage()

        {

            string xpsFile = "d:\\test.xps";//读取模板

            XpsDocument xpsDoc = new XpsDocument(xpsFile, FileAccess.Read);

            FixedDocumentSequence fds = xpsDoc.GetFixedDocumentSequence();

            foreach (DocumentReference DocRef in fds.References)

            {

                bool bForceReload = false;

                FixedDocument DocFd = DocRef.GetDocument(bForceReload);

                foreach (PageContent DocFpPc in DocFd.Pages)

                {

                    FixedPage DocFp = DocFpPc.GetPageRoot(bForceReload);

                    Canvas containCanvas = new Canvas(); //在页面上画一个大的图层

                    containCanvas.Width = DocFp.Width;

                    containCanvas.Height = DocFp.Height;

                    containCanvas.Background = Brushes.Transparent;//设置透明色

                    #region MyRegion

 

                    for (int i = 0; i < DocFp.Children.Count; i++)

                    {

                     

                        UIElement DocFpUiElem = DocFp.Children[i];

                        if (DocFpUiElem is Glyphs)

                        {

                            Glyphs gps = (Glyphs)DocFpUiElem;

                            string strMark = gps.UnicodeString;

 

                            if (strMark=="{1}")//判定当前数据是否为标签

                            {

                               

                                double x = gps.OriginX;

                                double y = gps.OriginY;

                                double fontSize = gps.FontRenderingEmSize;

                                strMark = strMark.Replace("{", "").Replace("}", "");

 

                                DocFp.Children.RemoveAt(i);//移除标签

                               

                                TextBlock label = new TextBlock();

                                Canvas.SetLeft(label, x);

                                Canvas.SetTop(label, y - fontSize);

                                Canvas.SetZIndex(label, 99);

                                label.Foreground = Brushes.Red;

                                label.FontFamily = new System.Windows.Media.FontFamily("宋体");

                                label.FontSize = fontSize;

                                label.Text = "你的内容";

                                containCanvas.Children.Add(label);

                            }

                        }

                    }

                    #endregion

 

                    DocFp.Children.Add(containCanvas);//将画布添加到页面上

                    ((IAddChild)DocFpPc).AddChild(DocFp);

                }

            }

            this.docView.Document = fds;

            xpsDoc.Close();//这个地方需要注意关闭,否则的话会出现莫名其妙的错误

        }

 

 

处理过程中的几点注意事项:

1、关于xps文档的生成,我是采用的word2010,然后使用打印功能生成的xps文档。

 

2、关于标签的设置:如果在word 中你直接写{@Name }  的话,在页面中未必能够按照你的想法生成标签。我用的方法是,对于同一行、相邻的标签,需要用不同的颜色来进行标记。标记的颜色也要与正文的颜色区分开,关于xps生成的规则还不太清楚,好像只有相同字体的内容都会分到一起。如下图

 

3、查看标记是否正确,可以先把xps文档的后缀名修改一下,然后用winrar解压,查看解开目录 \Documents\1\Pages\1.fpage ,用记事本打开,查找一下确定标签是否正确。

如下图:

其中X.fpage是指的第几页。

标签的样式如下:

请注意,这样的解压是单向的,处理前请备份。

4、需要引用的dll文件:

WindowsBase.dll  PresentationCore.dll   ReachFramework.dll  PresentationFramework.dll  ,(部分文件在wpf中已经被引用了),光确定用需要引用那些文件都折腾了我半天,丢人啊。

经过最近几天的折腾,我认为这种方法的优点:

1、纯矢量绘图,无失真,模板上面随意画。

2、xps模板一旦做好了,交付用户,用户一般无法自己进行修改,比较简单方便。

3、不需要安装任何第三方插件。

4、任何元素,想加就加,完全可以画图、添加水印等

5、字体不会丢失,xps文件在打包的时候,会一并将字体打包进项目里面,不管安装到任何地方,都不需要考虑字体问题

 代码下载:http://download.csdn.net/detail/bcc222/6546761

另外,在处理模板的时候,如果使用wps212可能会有惊喜!

目录
相关文章
|
3月前
|
C# 机器学习/深度学习 搜索推荐
WPF与机器学习的完美邂逅:手把手教你打造一个具有智能推荐功能的现代桌面应用——从理论到实践的全方位指南,让你的应用瞬间变得高大上且智能无比
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)应用中集成机器学习功能,以开发具备智能化特性的桌面应用。通过使用Microsoft的ML.NET框架,本文演示了从安装NuGet包、准备数据集、训练推荐系统模型到最终将模型集成到WPF应用中的全过程。具体示例代码展示了如何基于用户行为数据训练模型,并实现实时推荐功能。这为WPF开发者提供了宝贵的实践指导。
43 0
|
3月前
|
开发者 C# UED
WPF与多媒体:解锁音频视频播放新姿势——从界面设计到代码实践,全方位教你如何在WPF应用中集成流畅的多媒体功能
【8月更文挑战第31天】本文以随笔形式介绍了如何在WPF应用中集成音频和视频播放功能。通过使用MediaElement控件,开发者能轻松创建多媒体应用程序。文章详细展示了从创建WPF项目到设计UI及实现媒体控制逻辑的过程,并提供了完整的示例代码。此外,还介绍了如何添加进度条等额外功能以增强用户体验。希望本文能为WPF开发者提供实用的技术指导与灵感。
141 0
|
3月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
57 0
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
293 0
|
3月前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
139 0
|
3月前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
76 0
|
3月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
104 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
66 0
|
开发框架 前端开发 JavaScript
WPF+ASP.NET SignalR实现简易在线聊天功能
WPF+ASP.NET SignalR实现简易在线聊天功能
208 0
|
自然语言处理 编译器 C#
【WPF】实现动态切换语言(国际化)以及动态换肤功能
以下内容,手把手从搭建到最终实现,完成多语言切换以及换装功能。
442 0
【WPF】实现动态切换语言(国际化)以及动态换肤功能