IBM HP5Si Print Stream到XPS打印驱动程序

问题描述

我希望有人可以对此问题提出建议。 我们有一个来自https://docs.microsoft.com/en-us/samples/microsoft/windows-driver-samples/xpsdrv-driver-and-filter-sample/

自定义驱动程序

以MS Word或PDF打开文档时,打印驱动程序运行良好,并输出XPS。但是,从HP5Si系列打印机打印文档时,驱动程序将返回0字节。作业从HP5Si打印机发送到XPS驱动程序。当来源是HP系列打印机时,为什么驱动程序拒绝此输入。我该怎么解决

使用IBM HP5Si驱动程序设置AS400上的打印机,并将该作业发送到服务器上的Windows服务。该Windows服务将作业路由到XPS驱动程序,就好像它是HP系列打印机一样。 XPS驱动程序处理此作业,然后将XPS返回到Windows服务。然后,Windows服务将转换为tiff文件

由于某些原因,如果使用此工作流程完成打印,则XPS驱动程序将返回0。 如果在Word或记事本或任何非AS400 + HP中打开了相同的文档,则该文档将起作用并返回XPS。 为了证明我的理论,我用C#代码向驱动程序发送了PCL文件,该文件返回了0个字节。

    public static void SendBytesToPrinterPCL(string printerName,string szFileName) {
    IntPtr lhPrinter;
    OpenPrinter(printerName,out lhPrinter,new IntPtr(0));

    if (lhPrinter.ToInt32() == 0) return; //Printer not found!!

    var rawPrinter = new DOCINFOA() {
        pDocName = "My Document",pDataType = "RAW"
    };

    StartDocPrinter(lhPrinter,1,rawPrinter);

    using(var b = new BinaryReader(File.Open(szFileName,FileMode.Open))) {
        var length = (int) b.BaseStream.Length;
        const int bufferSize = 8192;

        var numLoops = length / bufferSize;
        var leftOver = length % bufferSize;

        for (int i = 0; i < numLoops; i++) {
            var buffer = new byte[bufferSize];
            int dwWritten;

            b.Read(buffer,bufferSize);
            IntPtr unmanagedPointer = Marshal.AllocHGlobal(buffer.Length);
            Marshal.copy(buffer,unmanagedPointer,buffer.Length);
            WritePrinter(lhPrinter,bufferSize,out dwWritten);
            Marshal.FreeHGlobal(unmanagedPointer);
        }

        if (leftOver > 0) {
            var buffer = new byte[leftOver];
            int dwWritten;

            b.Read(buffer,leftOver);
            IntPtr unmanagedPointer = Marshal.AllocHGlobal(buffer.Length);
            Marshal.copy(buffer,leftOver,out dwWritten);
            Marshal.FreeHGlobal(unmanagedPointer);
        }
    }

    EndDocPrinter(lhPrinter);
    ClosePrinter(lhPrinter);
}
string filePath = @"C:\Users\tom\Desktop\form.PCL";
string szPrinterName = @"\\server\xpsdrv";

Print.SendBytesToPrinterPCL(szPrinterName,filePath);

然后我将常规文本文件发送给驱动程序,并将其成功转换为XPS。

 public static void SendToPrinterNonPCL(string filePath)
            {
                processstartinfo info = new processstartinfo();
                info.Verb = "print";
                info.FileName = filePath;
                info.CreateNowindow = true;
                info.WindowStyle = ProcessWindowStyle.Hidden;

                Process p = new Process();
                p.StartInfo = info;
                p.Start();

                p.WaitForInputIdle();
                System.Threading.Thread.Sleep(3000);
                if (false == p.CloseMainWindow())
                    p.Kill();
            }
 string filePath = @"C:\Users\tom\Desktop\form.txt";
    string szPrinterName = @"\\server\xpsdrv";
          
            Print.SendToPrinterNonPCL(filePath);

为什么Microsoft示例中的驱动程序不接受PCL?我该怎么办。我不是驱动程序开发人员。这个项目是给我的。

编辑: 最初我不知道AS400的这种打印方式。我们的旧版驱动程序建于15年前。开发人员将自定义打印驱动程序编写为PCL,并将自定义转换器编写为Tiff。但是驱动程序仅支持单色。我不是驱动程序专家,PCL专家或转换器专家。为了支持最终的Tiff的颜色和减少像素化的感觉,我决定将其更改为XPS驱动程序。另外,它的定制代码更少,可以在WPF中使用Microsoft的XPS转换。对于非驱动程序开发人员而言,与学习PCL并随后将转换器更改为适应颜色Tiff相比,这并不是一个很大的学习曲线。但是我想这是分崩离析的,因为用户也从发送PCL的AS400打印。

您知道我们可以购买许可证的任何好的产品吗?我们需要PCL驱动程序和Tiff转换器

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)