gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:21:23 31 4
gpt4 key购买 nike

我正在尝试在 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);
}
}

最佳答案

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

[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;
}

关于c# - 在 C# 中打印 pcl 文件不起作用,建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517010/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com