如何在delphi中使用XPS_PASS标志将数据直接发送到XPS打印机

如何在delphi中使用XPS_PASS标志将数据直接发送到XPS打印机,delphi,Delphi,需要使用中提到的XPS_-PASS标志将数据直接发送到windows 7及更高版本的XPS打印机,但是Delphi中未定义此标志。XPS_-PASS不是标志。它是一个表示文档类型的字符串。另一个可能的值是RAW,它也是一个字符串 下面是Microsoft在中提供的示例代码的快速直接翻译(已编译,但未经测试) 您可以找到XPS打印机驱动程序的正确名称,以PrinterName的形式传递,并将要打印的数据放入TBytes数组中,以data的形式传递给函数DataCount将是该数据的长度。大概你已经

需要使用中提到的XPS_-PASS标志将数据直接发送到windows 7及更高版本的XPS打印机,但是Delphi中未定义此标志。

XPS_-PASS
不是标志。它是一个表示文档类型的字符串。另一个可能的值是
RAW
,它也是一个字符串

下面是Microsoft在中提供的示例代码的快速直接翻译(已编译,但未经测试)


您可以找到XPS打印机驱动程序的正确名称,以
PrinterName
的形式传递,并将要打印的数据放入
TBytes
数组中,以
data
的形式传递给函数
DataCount
将是该数据的长度。大概你已经知道了,因为你这里的问题只是如何传递
'XPS\u pass'

它是一个字符串,而不是一个标志。您发布的链接中的
'XPS\u PASS'
'RAW'
都在引号中,这意味着它们是字符串,而不是标志
XPS\u PASS
是一个标志,
'XPS\u PASS'
是一个字符串。你要找的是后者。嗨,谢谢,但问题是使用Delphi而不是C++。应该在Delphi中调用哪个方法,在那里我可以发送数据并指定“XPS_PASS”?我知道ExtEscape可以处理Delphi中定义的RAW和passTour,但它不能识别XPS\u PASS。德尔福没有什么可识别的,因为它不是一面旗帜。Delphi没有什么可识别的,就像编写
UserName:string后跟
用户名:='Roberto'。打印到XPS或PDF通常会提示您输入文件名。上述使用OpenPrinter和WritePrinter的过程不适用。但是,如果为PoutpFile指定文件名,则PrintJob始终为0。
uses
  Winapi.WinSpool;

function RawDataToXpsPrinter(PrinterName: String; Data: TBytes; DataCount: Cardinal): Boolean;
var
  hPrinter: NativeUInt;
  DocInfo: DOC_INFO_1;
  PrintJob: Cardinal;
  BytesWritten: Cardinal;
begin
  Result := OpenPrinter(PChar(PrinterName), hPrinter, nil);
  if Result then
  begin
    DocInfo.pDocName := PChar('My Document');
    DocInfo.pOutputFile := nil;
    DocInfo.pDatatype := PChar('XPS_PASS');

    PrintJob := StartDocPrinter(hPrinter, 1, @DocInfo);
    if (PrintJob > 0) then
    begin
      Result := WritePrinter(hPrinter, Data, DataCount, BytesWritten);
      EndDocPrinter(hPrinter);
      if Result then
        Result := ClosePrinter(hPrinter);
      Result := Result and (BytesWritten = DataCount);
    end;
  end;
end;