0

我在 FastReports 上遇到问题,它无法在包含韩文字符的页面上正确打印。它仅在打印机 HP K5300 jet 上发生,使用 rave 对其进行 T 测试并没有问题。我认为这是快速报告的错误。我已经将我所有的报告从 rave 转换为 FastReports,并且不打算搬回来。

我打算将生成的页面作为图像获取,而不将其保存到硬盘驱动器,然后生成新的 preports。这一次,生成的图像将被使用并打印。我知道这个解决方案不好。这是现在可以使用的,等待他们的回应。

有人知道如何从生成的页面中获取图像吗?

4

2 回答 2

1

您可以使用 TfrxBMPExport(frxExportImage 单元)组件将报告另存为 BMP。

例如,此代码将导出报告:

procedure ExportToBMP(AReport: TfrxReport; AFileName: String = '');
var
  BMPExport: TfrxBMPExport;

begin
  BMPExport := TfrxBMPExport.Create(nil);
  try
    BMPExport.ShowProgress := True;
    if AFileName <> '' then
    begin
      BMPExport.ShowDialog := False;
      BMPExport.FileName := AFileName;
      BMPExport.SeparateFiles := True;
    end;
    AReport.PrepareReport(True);
    AReport.Export(BMPExport);
  finally
    BMPExport.Free;
  end;
end;

在这种情况下,导出组件对每个页面使用不同的文件名。如果传递 'c:\path\report.bmp' 作为文件名,导出组件将生成 c:\path\report.1.bmp、c:\path\report.2.bmp 等。

像往常一样,如果您喜欢这种方式,您可以在任何表单/数据模块上删除并手动配置组件。

于 2010-11-12T02:45:24.477 回答
1

如果您只是想避免保存大量文件,您可以创建一个新的导出类来在文件创建后立即打印并立即删除它。

您可以创建一个全新的导出类,从内存中打印位图(例如,使用 TPrinter 类并直接在打印机画布中绘制位图)...您将学习如何检查 TfrxBMPExport 类的源文件。

以这个未经测试的代码为例,它将指导您如何创建一个新类来保存/打印/删除:

type
  TBMPPrintExport = class(TfrxBMPExport)
  private
    FCurrentPage: Integer;
    FFileSuffix: string;
  protected
    function Start: Boolean; override;
    procedure StartPage(Page: TfrxReportPage; Index: Integer); override;
    procedure Save; override;
  end;


{ TBMPPrintExport }

procedure TBMPPrintExport.Save;
var
  SavedFileName: string;
begin
  inherited;
  if SeparateFiles then
    FFileSuffix := '.' + IntToStr(FCurrentPage)
  else
    FFileSuffix := '';
  SavedFileName := ChangeFileExt(FileName, FFileSuffix + '.bmp');
  //call your actual printing routine here.  Be sure your the control returns here when the bitmap file is not needed anymore.
  PrintBitmapFile(SavedFileName);
  try
    DeleteFile(SavedFileName);
  except
    //handle exceptions here if you want to continue if the file is not deleted 
    //or let the exception fly to stop the printing process.
    //you may want to add the file to a queue for later deletion
  end;
end;

function TBMPPrintExport.Start: Boolean;
begin
  inherited;
  FCurrentPage := 0;
end;

procedure TBMPPrintExport.StartPage(Page: TfrxReportPage; Index: Integer);
begin
  inherited;
  Inc(FCurrentPage);
end;

在生产代码中,您将需要覆盖其他方法来初始化和完成打印机作业、清理等。

代码基于 TfrxCustomImageExport 的 FastReport v4.0 实现,专门用于页码和文件命名。它可能需要针对其他 FastReport 版本进行调整。

于 2010-11-13T03:56:40.617 回答