问题描述
我希望有人可以对此问题提出建议。 我们有一个来自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 (将#修改为@)