4

Postscript ファイルの印刷中に奇妙な問題を発見しました。

だからここに私のセットアップがあります:

私はWindows 8 PCを持っています。この PC にはC# アプリケーション"NetworkPrintTest.exe" があり、実行すると PDF が開き、Postscript ファイルが生成され、最終的には印刷されます。しかし、それは何もしません。エラーは発生しませんが、印刷もされません。同じプログラムがWindows 7でエラーなしで実行され、プリンターでファイルを印刷することさえできます。

前述のように、.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

私のアプリケーションは.Net Framework 2.0のC#で書かれています

4

1 に答える 1

4

Windows Vista 以降では、XPS ベースのドライバーを使用するプリンターには、"RAW" ではなく "XPS_PASS" のデータ型を使用する必要があります。

于 2014-02-27T18:21:29.590 に答える