请记住此代码在ISAPI模块中运行,我们宁愿不要改变应用程序登录的用户,因此使用Printer类的常用方法不太可能是一种选择。
我有以下代码:
procedure WriteFileToPrinter(const APrinterURL, AFilename: string);
var
LHandle, LWritten: Cardinal;
LFileStream: TStream;
LMemoryStream: TMemoryStream;
begin
LHandle := CreateFile(PChar(APrinterURL), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
if LHandle > 0 then
try
LFileStream := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyNone);
try
LMemoryStream := TMemoryStream.Create;
try
LFileStream.Position := 0;
LMemoryStream.CopyFrom(LFileStream, LFileStream.Size);
WriteFile(LHandle, LMemoryStream.Memory^, LMemoryStream.Size, LWritten, nil);
finally
LMemoryStream.Free;
end;
finally
LFileStream.Free;
end;
finally
CloseHandle(LHandle);
end;
end;
成功将文件发送到打印机,虽然并非所有测试的打印机都支持此功能,但打印机上有一个区别:文件是PDF,所有粗体字都被忽略。我已经确认PDF中实际上有粗体字,并且使用Acrobat Reader打印到同一台打印机时会按预期打印。
有问题的打印机是Brother MFC-9330CDW。可能是因为这个特定的打印机出现问题,但是我想我会问其他打印机是否会发生这种情况,以及是否有替代方法。