使用CreateFile将PDF直接发送到打印机会忽略粗体字体

时间:2018-02-05 22:47:40

标签: delphi pdf printing isapi

请记住此代码在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。可能是因为这个特定的打印机出现问题,但是我想我会问其他打印机是否会发生这种情况,以及是否有替代方法。

0 个答案:

没有答案