在 C# 中打印 pcl 文件不起作用,有建议吗?

发布于 2024-09-14 15:06:17 字数 4095 浏览 11 评论 0原文

我正在尝试在 C# 中以编程方式打印 pcl 文件。

我使用以下 Microsoft 链接作为参考。 (注意是用VB写的)

http://support.microsoft.com/kb/298141

不幸的是,这不起作用..我只打印空白页。

请注意,如果我只是根据提示将 pcl 文件复制到打印机 - 即复制文件名打印机。页面打印正确。

建议?

public class PrintRaw
  {
    [StructLayout(LayoutKind.Sequential)]
    public class DocInfo
    {
      [MarshalAs(UnmanagedType.LPWStr)] public String docName;
      [MarshalAs(UnmanagedType.LPWStr)] public String outputFile;
      [MarshalAs(UnmanagedType.LPWStr)] public String dataType;
    }

    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
      ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter,
                                          IntPtr pd);

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

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
      ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level,
                                              [In, MarshalAs(UnmanagedType.LPStruct)] DocInfo di);

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

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

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

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true,
      CallingConvention = CallingConvention.StdCall)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

    public void Print(String printerName, String filename)
    {
      IntPtr lhPrinter;
      OpenPrinter(printerName, out lhPrinter, new IntPtr(0));

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

      var rawPrinter = new DocInfo() {docName = "My Document", dataType = "RAW"};

      StartDocPrinter(lhPrinter, 1, rawPrinter);

      using (var b = new BinaryReader(File.Open(filename, 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, 0, bufferSize);
          IntPtr unmanagedPointer = Marshal.AllocHGlobal(buffer.Length);
          Marshal.Copy(buffer, 0, unmanagedPointer, buffer.Length);
          WritePrinter(lhPrinter, unmanagedPointer, bufferSize, out dwWritten);
          Marshal.FreeHGlobal(unmanagedPointer);
        }

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

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

      EndDocPrinter(lhPrinter);
      ClosePrinter(lhPrinter);
    }
  }

I'm trying to print a pcl file programatically in c#.

I'm using the following Microsoft link for reference. (Note it's in VB)

http://support.microsoft.com/kb/298141

Unfortunatly, it's not work .. I'm only getting blank pages printed.

Note that if I just copy the pcl file to the printer from prompt - i.e. copy filename printer. The page gets printed corrrectly.

Suggestions?

public class PrintRaw
  {
    [StructLayout(LayoutKind.Sequential)]
    public class DocInfo
    {
      [MarshalAs(UnmanagedType.LPWStr)] public String docName;
      [MarshalAs(UnmanagedType.LPWStr)] public String outputFile;
      [MarshalAs(UnmanagedType.LPWStr)] public String dataType;
    }

    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
      ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter,
                                          IntPtr pd);

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

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
      ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level,
                                              [In, MarshalAs(UnmanagedType.LPStruct)] DocInfo di);

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

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

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

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true,
      CallingConvention = CallingConvention.StdCall)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

    public void Print(String printerName, String filename)
    {
      IntPtr lhPrinter;
      OpenPrinter(printerName, out lhPrinter, new IntPtr(0));

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

      var rawPrinter = new DocInfo() {docName = "My Document", dataType = "RAW"};

      StartDocPrinter(lhPrinter, 1, rawPrinter);

      using (var b = new BinaryReader(File.Open(filename, 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, 0, bufferSize);
          IntPtr unmanagedPointer = Marshal.AllocHGlobal(buffer.Length);
          Marshal.Copy(buffer, 0, unmanagedPointer, buffer.Length);
          WritePrinter(lhPrinter, unmanagedPointer, bufferSize, out dwWritten);
          Marshal.FreeHGlobal(unmanagedPointer);
        }

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

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

      EndDocPrinter(lhPrinter);
      ClosePrinter(lhPrinter);
    }
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

趴在窗边数星星i 2024-09-21 15:06:17

好吧,我在示例中使用的数据类型似乎无效。我将其更新为以下内容(注意字符集的设置)并解决了问题。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOC_INFO_1
{
  [MarshalAs(UnmanagedType.LPStr)]
  public string pDocName;
  [MarshalAs(UnmanagedType.LPStr)]
  public string pOutputFile;
  [MarshalAs(UnmanagedType.LPStr)]
  public string pDataType;
}

Ok, it seems like the datatype that I was using was invalid in the example. I updated it to the following (note the setting of Charset) and it fixed the problem.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOC_INFO_1
{
  [MarshalAs(UnmanagedType.LPStr)]
  public string pDocName;
  [MarshalAs(UnmanagedType.LPStr)]
  public string pOutputFile;
  [MarshalAs(UnmanagedType.LPStr)]
  public string pDataType;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文