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实现文档显示、套打功能的更多相关文章
- wpf采用Xps实现文档显示、套打功能(原创)
近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的DocumentView 控件可以直接将数据进行显示,xps也 ...
- Xps实现文档显示、套打功能
wpf采用Xps实现文档显示.套打功能(原创) 近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的Documen ...
- WPF中使用流文档
转载自:http://www.cnblogs.com/zlgcool/archive/2008/11/17/1335456.html WPF面向的是UI展现,而文本显示无疑是UI层中的重要功能之一.W ...
- 在MyEclipse显示struts2源码和doc文档及自动完成功能
分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...
- 解决Linux文档显示中文乱码问题以及编码转换
解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...
- iTextSharp带中文转换出来的PDF文档显示乱码
刚才有写一个小练习<Html代码保存为Pdf文件>http://www.cnblogs.com/insus/p/4323224.html.马上有网友说,当截取块有中文时,保存的pdf文件将 ...
- 解决访问swaggerUI接口文档显示basic-error-controler问题
问题描述 使用swagger生成接口文档后,访问http://localhost:8888/swagger-ui.html#/,显示如下: 有些强迫症的我,感觉看起来很不舒服,结果百度了好久,找到解决 ...
- chm帮助文档显示字体过小
问题描述: 在查看chm帮助文档时,发现默认显示字体过小,阅读吃力 解决方案: 1. 点击选项按钮->Internet 选项 2. 点击辅助功能 3. 选中 忽略网页上指定的字号,点击确定 最后 ...
- 给你的Swagger文档换套附魔皮肤吧
前言 相信无论是前端或是后端的程序员对Swagger都不怎么陌生,没有用过应该也听说过 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 简 ...
随机推荐
- C++实现简单的内存块自己主动管理
#ifndef __MEM__H #define __MEM__H #include<iostream> using namespace std; //自己主动管理内存块 typedef ...
- [Angular] Enable router tracing
To enable router tracing is really simple: RouterModule.forRoot(ROUTES, { enableTracing: true }) Whe ...
- web报表工具FineReport经常使用函数的使用方法总结(文本函数)
文本函数 CHAR CHAR(number):依据指定数字返回相应的字符.CHAR函数可将计算机其它类型的数字代码转换为字符. Number:用于指定字符的数字,介于1Number:用于指定字符的数字 ...
- JavaScript调用ATL COM(二)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇文章中介绍了如何在JS中调用ATL COM: JS调用ATL COM中的C++接口的做法 现在我们可以把它嵌入到 ...
- 【t042】炮击坦克
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在一个坐标轴上,有M辆坦克,第i辆坦克在时刻0处于pos[i](pos[i]>0),speed[ ...
- 谷歌 AI 中国中心成立,人工智能势不可挡?
昨日,谷歌在上海举办了一年一度的Google中国开发者大会.在本届大会上,谷歌云首席科学家李飞飞宣布了一个重磅消息,即在北京将成立谷歌AI中国中心.对于这个即将成立的AI中心谷歌寄予厚望,希望与中国本 ...
- Oracle数据库零散知识07 -- Materialized view(转)
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...
- 战略游戏 - 树型DP
传送门 题目分析 题意:给一颗无根树,选择最少的节点将所有的边覆盖. 经典的树型DP,dp[i][0/1]表示选择或不选择i号节点的最优值. 当选择了i号节点,他的子节点可选可不选,选择最优的. 当不 ...
- 检索 04 --Stack栈 Queue队列 Hashtable哈希表
//Stack 先进后出 没有索引 Stack st = new Stack(); st.Push(12); st.Push(11); st.Push(22); st.Push(34); st.Pus ...
- 过滤Filter推断用户是否登录
WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param-name>userSessionKe ...