C# Windows 8以编程方式打印Postscript文件

C# Windows 8以编程方式打印Postscript文件,c#,windows-8,printing,dllimport,postscript,C#,Windows 8,Printing,Dllimport,Postscript,我在打印Postscript文件时发现了一个奇怪的问题 下面是我的设置: 我有一台Windows8电脑,在这台电脑上有一个C#应用程序“networkprintest.exe”,它在执行时应该打开一个PDF,生成一个Postscript文件,并最终打印出来。 但它什么也没用。我没有收到错误,但也不会打印。 同样的程序在Windows7上运行时没有错误,我甚至让打印机打印文件 public static bool SendBytesToPrinter(string szPrinterName, I

我在打印Postscript文件时发现了一个奇怪的问题

下面是我的设置:

我有一台Windows8电脑,在这台电脑上有一个C#应用程序“networkprintest.exe”,它在执行时应该打开一个PDF,生成一个Postscript文件,并最终打印出来。 但它什么也没用。我没有收到错误,但也不会打印。 同样的程序在Windows7上运行时没有错误,我甚至让打印机打印文件

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, int dwCount, params string[] docName)
        {
            int dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool flag = false;
            di.pDocName = "print document";
            if (docName.Length > 0)
                di.pDocName = docName[0];
            di.pDataType = "RAW";
            if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
            {
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    if (StartPagePrinter(hPrinter))
                    {
                        flag = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            if (!flag)
            {
                Marshal.GetLastWin32Error();
            }
            return flag;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }
如上所述,在两个操作系统上都成功生成了.ps文件,但打印失败

这是我的源代码,可以打印文件

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, int dwCount, params string[] docName)
        {
            int dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool flag = false;
            di.pDocName = "print document";
            if (docName.Length > 0)
                di.pDocName = docName[0];
            di.pDataType = "RAW";
            if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
            {
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    if (StartPagePrinter(hPrinter))
                    {
                        flag = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            if (!flag)
            {
                Marshal.GetLastWin32Error();
            }
            return flag;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }
我使用了一些DLL导入

    [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)]
    public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport("gdi32.dll")]
    private static extern int GetDeviceCaps(IntPtr hdc, int capindex);

[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
我发现,GDI32.dll在版本上有所不同,但到目前为止我没有发现任何问题

Windows 7->6.1.7601.18275

Windows 8->6.2.9200.16654


我的应用程序是用C#.Net Framework 2.0

中编写的。在Windows Vista以后的版本中,对于使用基于XPS的驱动程序的打印机,您需要使用数据类型“XPS\u PASS”而不是“RAW”。

Tony,您救了我一天。我在挖掘这个问题。当我用“XPS\u PASS”替换“RAW”时,它按预期工作。我在nuget上为此创建了一个解决方案,很抱歉回复太晚。我会尽快测试,看看它是否有效。谢谢你到目前为止+1