最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机,测试的时候也是,一直没有发现问题,但是真正到用户使用的时候,接上正式打印机,打印时候没有问题,一旦打印完成,再次进入打印winfrom的界面就花掉了,如下图;

结果更换了多台电脑,win7、winxp都不行,然后就更换打印机,换了很多打印机也不行,自己写了一个最小的打印的程序,发现打印以后还出现同样的问题。

没有办法,试着去微软的官方论坛上看看有没有大牛能帮忙解决一下,结果还真有一个搭理我的,我发了一个测试的程序过去,人家说他们那边没有问题。我当时凌乱了,突然想到,这个会不会跟window语言有关系,结果下载了一个英文的语言包,把window修改成英语版就OK了。

不过,这样的做法绝对是要被人唾弃的,我们的项目总不能让用户直接用英文windows吧。

解决的方法有两个

1、  所有界面上的字体不用宋体(不保证图片不花,没有测试过),我们的项目这么大药吧所有的界面都进行修改不可能。

2、  使用wpf单独做一个进程,进行打印,打印的时候,由程序直接写入到打印队列中,不需要有任何的form交互即可。

这个地方有三个地方比较值得注意:

(1)       winform开启新进程,这个没啥难度,唯一注意的是,如果需要传递参数的话,不能和程序名写到一起

Process.Start("NewPrint.exe",”参数1”);

(2)       wpf运行程序,获取程序带入参数值,通过重载OnStartup函数实现

protected override void OnStartup(StartupEventArgs e)

{

string  IDCard = e.Args[0];

base.OnStartup(e);

}

(3)       将wpf文档直接写入打印机队列里面,参照下文:

如何以编程的方式直接打印

http://msdn.microsoft.com/zh-cn/library/vstudio/aa969772(v=vs.90).aspx

我们就用了一个比较偷懒的办法,代码如下:

 public class BatchXPSPrinter
{ public static void PrintXPS(object sender)
{
string strFilename = sender.ToString(); LocalPrintServer localPrintServer = new LocalPrintServer();
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
bool tt = defaultPrintQueue.IsXpsDevice;
FileInfo f = new FileInfo(strFilename);
try
{
PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob(f.Name, strFilename, false);
}
catch (PrintJobException e)
{ }
}
}

直接在进程里面调用:

string DocName="";

Thread printingThread = new Thread(new ParameterizedThreadStart(BatchXPSPrinter.PrintXPS));      printingThread.SetApartmentState(ApartmentState.STA);      printingThread.Start(DocName);                 MessageBox.Show("打印完成");


通过在这次的问题解决的过程对我触动比较深的几点:

1、做程序的最好查谷歌。百度在技术领域的搜索真心不行,很多时候答非所问。技术类的文章不明白的单词就那么几个,看熟了就会了!

2、不要怕自己的英语水平烂,我的英语水平也烂,属于初中毕业水平,但是就我这个初中水平,也能在国外论坛上提出问题,并且老外能看明白,并

能够进行解答,说明一个问题,很多时候不需要那么多华丽的句型,只要说明白主要意思,哪怕全部都是this is ,that is ,都没有关系。后面还有程序语句这种全球通用的代码

来进行二次说明的!

3、微软的东西不一定都是好的,如果真的遇到了实在解决不了的,干脆就绕过去!不过这点个人感觉java比微软的可选择性就多了!

xps文档打印后winform界面文字丢失的更多相关文章

  1. C# 对Excel文档打印时的页面设置

    1.对打印页面的朝向,页宽,页高进行设置 参考源码[1] using Excel = Microsoft.Office.Interop.Excel; Excel.Application tmpExce ...

  2. C#中5步完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ...

  3. wpf中xps文档合并功能实现

    跟着上一篇的xps文档套打的文章,近期一直在研究xps打印技术,其中用户提到了一个需求,要求能够多页面进行打印,我的想法是,先生成xps文件,然后将文件读取出来以后,合并成一个文件来处理. 如果要是直 ...

  4. Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***.

    Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***. Mongodb是一种面向文档的 ...

  5. man帮助文档打印

    这里不讨论大家都知道的man重定向的一般常用方法(col处理方法)$ man find | col -b > man_fine.txt [跟着我的思路走]假如您像我一样,直接使用如下命令导出fi ...

  6. js导读,js引入,js选择器,事件,操作页面文档,计算后样式,数据类型

    js导读 ''' js属于编写运行在浏览器上的脚本语言 js采用ECMAScript语法 操作BOM:浏览器对象模型 eg:浏览器上下滑动,浏览器历史记录 操作DOM:文档对象模型 ''' js引入 ...

  7. js事件,操作页面文档,计算后样式,数据类型

    js:运行在浏览器的脚本语言 js引入 1.行间式:存在于行间事件中 <div id="div" onclick="this.style.color="r ...

  8. Python批量创建word文档(1)- 纯文字

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.最后贴上自己的联系方式.代码如下: 1 ''' 2 #python根据需求新 ...

  9. 利用iTextSharp组件给PDF文档添加图片水印,文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为:   using S ...

随机推荐

  1. Docker intercontainer 网络解释

    https://segmentfault.com/a/1190000000669312

  2. careercup-中等难度 17.5

    17.5 写一个函数来模拟游戏. 游戏规则如下: 4个槽,里面放4个球,球的颜色有4种,红(R ),黄(Y),绿(G),蓝(B).比如, 给出一个排列RGGB,表示第一个槽放红色球,第二和第三个槽放绿 ...

  3. [Effective C++ --010]令赋值操作符返回一个reference to *this

    差不多最经典的就是这个了: x = y = z = ; 解读为: x = (y = ( z = )); 如果没有返回值,上述代码就不能通过编译. 其实看到标题就差不多明白这一条了,但是为什么连续赋值时 ...

  4. 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验

    本文接着上一篇文章二.Socket之UDP异步传输文件,在上一篇文章的基础上实现多文件的传输和文件传输完成后进行完整性校验. 要实现多文件的传输,必须要对文(2)中发送文件的数据格式进行改进,必须加入 ...

  5. 如何强化 TCP/IP 堆栈

    TCP/IP 是一种本质上不安全的协议.但是,Windows 2000 实现可以使您配置其操作以防止网络的拒绝服务攻击.默认情况下,本文中所涉及的一些项和值可能并不存在.在这些情况下,请创建该项.值或 ...

  6. C#获取指定网页源码的几种方法

    // WebClient private string GetWebClient(string url) { string strHTML = ""; WebClient myWe ...

  7. git 撤销修改以及删除文件

    撤销修改 1.如果当你修改了代码,然后又发现修改错误以后,想撤销前面的操作的时候该怎么办呢? 既然错误发现得很及时,就可以很容易地纠正它.你可以删掉最后一行,手动把文件恢复到上一个版本的状态.如果用 ...

  8. [记录]ns_error_unexpected firefox tinymce

    参考: Form not saving, NS_ERROR_UNEXPECTED  Error: NS_ERROR_UNEXPECTED #794 NS_ERROR_UNEXPECTED on Fir ...

  9. [MSDN]使用 REST 处理文件夹和文件

    msdn: http://msdn.microsoft.com/zh-cn/library/dn292553.aspx 了解如何使用 SharePoint 2013 REST 界面对文件夹和文件执行基 ...

  10. Android——列表选择框(Spinner)

    通常情况下,如果列表选择框中要显示的列表项是可知的,那么可以将其保存在数组资源文件中,然后通过数组资源来为列表选择框指定列表项.这样就可以在不编写Java代码的情况下实现一个下拉选择框. 1.在布局文 ...