zoukankan      html  css  js  c++  java
  • xps文档打印后winform界面文字丢失

         最近做的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)
                {
                   
                }
            }
        }
    View Code

    直接在进程里面调用:

        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比微软的可选择性就多了!

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/lizhaoduo/p/3607403.html
Copyright © 2011-2022 走看看