开发过程中遇到的问题 
1.虚拟打印机打印的时候保存SPL文件后能解析成TIFF多层图片,而实际打印机比如惠普打印的时候生成的SPL文件就不能解析成图片了,后来比较了下两种打印的状态下生成的SPL文件,发现对于同份文件中用物理打印机(惠普)生成的SPL要比用虚拟打印机(腾讯)的要大的多,而且在程序调试的过程中发现用物理打印机生成的SPL文件的数据格式和用虚拟打印机生成的SPL文件不一样,所以我认为是不是惠普的驱动程序对原始的SPL文件处理了,我想问的是有没有办法让处理过的SPL文件还原为标准的SPL文件?或者直接重某些入口直接获取标准的SPL,好像有看到过替换打印处理器,但是我是一JAVA程序员研究VB才几天所以不明白,希望各位高手能帮助解答 2.监听打印服务的过程中,使用的是c#.net                  
public void testPrintJob()
        {
            while (this.bRun)
            {
                try
                {
                    ManagementClass c = new ManagementClass("Win32_PrintJob");
                    ManagementObjectCollection co = c.GetInstances();
                    foreach (ManagementObject m in co)
                    {
                        foreach (PropertyData p in m.Properties)
                        {
                            Console.WriteLine(p.Name + "--------" + p.Value);
                        }
                        string statusMask = m.GetPropertyValue("StatusMask").ToString();
                        //statusMask为16是正在打印状态,本意是想在打印的时候SPOOL FILE应该已经生成完毕了,然后去获取SPL生成对应的TIFF图片
                        if (statusMask.Equals("16"))
                        {   //暂停打印机
                            m.InvokeMethod("Pause", null);
                            //将SPL转换为图片,自己写的一个DLL提供图片转换(目前只能转换由虚拟打印机生成的SPL文件)
                            this.savePic();
                            break;
                        }
                    }
                }
                catch(Exception e){
                    e.GetBaseException();
                }
            }
            //this.timer1.Enabled = true;
            this.LogMessage("Service Started");
        }
在监控的过程中发现StatusMask有时候为8(Spooling),有时候为16(正在打印),有时候为17(正在打印 ¦暂停)。我可以将其转换为2进制然后读取相应的位来判断打印所处的状态,我想是正在打印的状态下SPOOL文件应该是已经填充完毕了是,请问是这样么。还有没有什么更加好的办法?

解决方案 »

  1.   

    基本上以前的问题已经解决  ,,但是新的问题又出来了,,如何获取打印的总页数? 
    在JOB_INFO_2找那个可以获取到TOTALPAGES..这个是针对打印任务的总页数可是不包括份数所以必须要获取JOB_INFO_2中的DEVMODE,然后在DEVMODE中获取dmcopies这个属性问题出来了。天杀的word居然在dmcopies这个上面有BUG  返回的值永远都是1 
    只有重新安装OFFICE2003SPL3或者是office2007spl1才能够正常的使用dmcopies这个属性可是我写的是监控程序  我不可能强迫客户端去安装这个补丁的请问各位高手  这个问题我该如何解决?
      

  2.   

    The most reliable function I've been used is GdiGetPageCount. Even you set "Start printing immediately" in printer's property page, this function can still return the right value, it can guarantee that the spool file is cached completely.
      

  3.   

    非常谢谢你的回复已经搞定了  在spl中获取可以得到份数,,,,唯一可惜的是,我硬盘挂了,程序要重写,,,
      

  4.   

    Yes, once the spool file have all the pages cached, you can open it and analysis every piece of section to count how many page it contains.
      

  5.   

    请问LZ,你是怎么将非标准的SPL文件转庆标准的SPL文件的?望分享!
      

  6.   

    基本上以前的问题已经解决  ,,但是新的问题又出来了,,如何获取打印的总页数? 
    在JOB_INFO_2找那个可以获取到TOTALPAGES..这个是针对打印任务的总页数可是不包括份数所以必须要获取JOB_INFO_2中的DEVMODE,然后在DEVMODE中获取dmcopies这个属性问题出来了。天杀的word居然在dmcopies这个上面有BUG  返回的值永远都是1 
    只有重新安装OFFICE2003SPL3或者是office2007spl1才能够正常的使用dmcopies这个属性可是我写的是监控程序  我不可能强迫客户端去安装这个补丁的请问各位高手  这个问题我该如何解决?遇到相同的问题
    希望楼主能够共享一下解决方案!
    email:  [email protected]
      

  7.   

    SPL标准的获取,同问,谢谢!
      

  8.   

    spl文件是由哪个部分生成的?是spooler还是驱动?有没有生成spl的函数?
      

  9.   

    请问楼主是如何解决惠普打印机的spl文件不是标准的这个问题的?怎么获得该打印机的标准spl文件?
    谢谢!!
      

  10.   

    楼主,你是怎么将非标准的SPL文件转庆标准的SPL文件的?
    或者由虚拟打印机生成的SPL