xps文档打印后winform界面文字丢失

简介: 原文:xps文档打印后winform界面文字丢失       最近做的xps文档打印功能,绝对的一波三折,一开始开发的时候,始终用的是xps writer 虚拟打印机,测试的时候也是,一直没有发现问题,但是真正到用户使用的时候,接上正式打印机,打印时候没有问题,一旦打印完成,再次进入打印winfrom的界面就花掉了,如下图;       结果更换了多台电脑,win7、winxp都不行,然后就更换打印机,换了很多打印机也不行,自己写了一个最小的打印的程序,发现打印以后还出现同样的问题。
原文: 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比微软的可选择性就多了!

 

 

 

目录
相关文章
|
自然语言处理 数据可视化
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
|
6月前
|
存储
如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?
如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?
851 0
uniapp 文本复制及文件预览
uniapp 文本复制及文件预览
169 0
电脑报错弹窗文本内容复制,Textify
使用电脑的过程中,软件多起来难免会出现一些莫名其妙的错误弹窗,有的是运行错误,有的是缺少依赖,有的是软硬件故障……就比如弹出的缺少.dll库的问题
107 1
|
Web App开发 文字识别 JavaScript
强大的实况文本功能,直接复制图片上的文字(macOS)
用OCR软件,是很多人的选择。我曾经也给大家推荐过“天若OCR”软件,还有朋友在用吗?
383 0
|
XML Java 程序员
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器。主要采用WPF、C#语言以及AvalonEdit控件。
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
PDF - 如何 PDF 文档在全屏模式同时显示两页
PDF - 如何 PDF 文档在全屏模式同时显示两页
896 0
PDF - 如何 PDF 文档在全屏模式同时显示两页
|
C#
wpf采用Xps实现文档显示、套打功能
原文:wpf采用Xps实现文档显示、套打功能 近期的一个项目需对数据进行套打,用户要求现场不允许安装office、页面预览显示必须要与文档完全一致,xps文档来对数据进行处理。Wpf的DocumentView 控件可以直接将数据进行显示,xps也是一种开放式的文档,如果我们能够替换里面的标签就最终实现了我们想要的效果。
1793 0
|
Web App开发 索引
文档预览功能使用技巧(1)---文字拷贝
智能媒体管理提供了文档预览功能,通过 快速搭建 文章的介绍,详细描述了使用“文档转换 + JS 前端渲染引擎”实现文档预览的过程,本文将介绍预览功能中的 文字拷贝 技巧。
2072 0
下一篇
无影云桌面