Search code examples
delphireportbmpfastreport

Fastreports custom preview problem


I encounter problem on FastReports, it will not print correctly on pages which contain Korean character. It hapens only on Printer HP K5300 jet, T test it using rave and having no problem. I think it a bug for fast reports. I already convert all my reports from rave to FastReports and dont have plan to moved back.

I am planning to get the generated pages as images without saving it to hard drive and then generate a new preports. this time, the generated images will be used and print. I know this solution is not good. this is worable for now While waiting for their responds.

anybody has any idea how to get the images form generated pages?


Solution

  • If you just want to avoid saving a lot of files, you can create a new export class to print the file just after it is created and delete it instantly.

    You can create a whole new export class which print the bitmap from memory (for example, using the TPrinter class and drawing the bitmap directly in the printer canvas)... you will learn how checking the source file of the TfrxBMPExport class.

    Take this untested code as an example which will guide you how to create a new class to save/print/delete:

    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;
    

    In production code you will want to override another methods to initialize and finalize the printer job, cleaning up, etc.

    Code is based on FastReport v4.0 implementation of TfrxCustomImageExport, specially for page numbering and file naming. It may require adjustments for other FastReport versions.