原文: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 = ; 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, );

                                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可能会有惊喜!

wpf采用Xps实现文档显示、套打功能的更多相关文章

  1. wpf采用Xps实现文档显示、套打功能(原创)

    近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的DocumentView 控件可以直接将数据进行显示,xps也 ...

  2. Xps实现文档显示、套打功能

    wpf采用Xps实现文档显示.套打功能(原创) 近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的Documen ...

  3. WPF中使用流文档

    转载自:http://www.cnblogs.com/zlgcool/archive/2008/11/17/1335456.html WPF面向的是UI展现,而文本显示无疑是UI层中的重要功能之一.W ...

  4. 在MyEclipse显示struts2源码和doc文档及自动完成功能

    分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...

  5. 解决Linux文档显示中文乱码问题以及编码转换

    解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...

  6. iTextSharp带中文转换出来的PDF文档显示乱码

    刚才有写一个小练习<Html代码保存为Pdf文件>http://www.cnblogs.com/insus/p/4323224.html.马上有网友说,当截取块有中文时,保存的pdf文件将 ...

  7. 解决访问swaggerUI接口文档显示basic-error-controler问题

    问题描述 使用swagger生成接口文档后,访问http://localhost:8888/swagger-ui.html#/,显示如下: 有些强迫症的我,感觉看起来很不舒服,结果百度了好久,找到解决 ...

  8. chm帮助文档显示字体过小

    问题描述: 在查看chm帮助文档时,发现默认显示字体过小,阅读吃力 解决方案: 1. 点击选项按钮->Internet 选项 2. 点击辅助功能 3. 选中 忽略网页上指定的字号,点击确定 最后 ...

  9. 给你的Swagger文档换套附魔皮肤吧

    前言 相信无论是前端或是后端的程序员对Swagger都不怎么陌生,没有用过应该也听说过 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 简 ...

随机推荐

  1. 在云平台上基于Go语言+Google图表API提供二维码生成应用

    二维码能够说已经深深的融入了我们的生活其中.到处可见它的身影:但通常我们都是去扫二维码, 曾经我们分享给朋友一个网址直接把Url发过去,如今我们能够把自己的信息生成二维码再分享给他人. 这里就分享一下 ...

  2. 《SAS编程与数据挖掘商业案例》学习笔记之十二

    本次重点在:sas数据集管理 主要包含:包含数据集纵向拼接.转置.排序.比較.复制.重命名.删除等 1.append语句 注:base数据集和data两个数据集必须结构一样.避免使用force的情况, ...

  3. js进阶js中支持正则的四个常用字符串函数(search march replace split)

    js进阶js中支持正则的四个常用字符串函数(search march replace split) 一.总结 代码中详细四个函数的用法 search march replace split 二.js进 ...

  4. ArcEngine开发之Command控件使用篇

    转自原文 ArcEngine开发之Command控件使用篇 在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互.比如有一系列的地图浏览控件.地图查询控件.图斑选取控件.编 ...

  5. PHP接口类interface使用方法

    PHP同大多数的面向对象语言一样,并不支持多重继承.少数支持多重继承的语言中最著名的就是C++和Smalltalk.如果需要实现多重继承功能,在PHP中,可以通过接口,它是PHP解决多重继承问题的方法 ...

  6. 如何使用Name对象,包括WorkspaceNames和DatasetNames

    转自chanyinhelv原文 如何使用Name对象,包括WorkspaceNames和DatasetNames 第一原文链接 该博主还有很多有关arcgis二次开发的不错的文章. 如何使用Name对 ...

  7. [TypeScript] Typescript Interfaces vs Aliases Union & Intersection Types

    TypeScript has 'interface' and 'type', so when to use which? interface hasName { firstName: string; ...

  8. matplotlib tricks(一)—— 多类别数据的 scatter(cmap)

    cmap 的选择: binary seismic Reds 多类别数据的 scatter(逐点散列),在 matplotlib 中的实现关键在于,color关键字的定义: def plot_scatt ...

  9. 【hdu2825】ac自动机 + 状压dp

    传送门 题目大意: 给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量. 题解: 因为密码串不多,可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到 ...

  10. Word 2010/2013 菜单栏添加 MathType 菜单

    一般对于 office 的高级版本,比如 word 2010/2013,在手动安装 mathtype 之后,并不会再 word 的菜单栏,创建 mathtype 按钮,此时需要按照如下步骤,手动导入 ...