簡體   English   中英

使用Delphi中的模板添加新的Rave Report頁面

[英]Add new Rave Report page using template in Delphi

我是Rave Reports的新手,正努力掌握它。

目標是要有一個包含封面的PDF,然后包含本質上相同頁面但包含不同圖像的任意數量的PDF。

我已經使用設計器設置了頁面,並且可以獲取要打印或保存為PDF的報告。

我無法弄清楚如何動態復制/添加將包含圖像的頁面。

該過程將是:

  • 添加封面
  • 遍歷圖像列表並從現有布局/模板添加圖像頁面
  • 保存為PDF

任何幫助或朝着正確方向的觀點將不勝感激。

謝謝

-更新-

我使用了以下代碼,但無法弄清楚如何使其工作。 該報告每頁上應有4張圖像,因此,如果有9張圖像,則應為3頁。 循環創建了正確數量的頁面,但是列表中的最后圖像在每頁上重復。

有任何想法嗎?

procedure TForm1.Button1Click(Sender: TObject);
var
  ReportPages       : array of TRavePage;
  CoverPage         : TRavePage;
  MyProject         : TRaveReport;
  PageList          : TRaveComponentList;

  staffImage        : TRaveBitmap;

  numberOfPages     : Integer;
  numberOfImages    : Integer;

  imageNumber       : Integer;
  pageNumber        : Integer;
  imagesPerPage     : Integer;
  pageImageCounter  : Integer;

  isFirstImage      : Boolean;
  isLastImage       : Boolean;
begin
  buildImageList;

  imageNumber := 0;
  imagesPerPage := 4;

  numberOfImages := imageList.count;
  numberOfPages := ceil(numberOfImages / imagesPerPage);

  RvSystem1.DoNativeOutput := false;
  RvSystem1.RenderObject := RvRenderPDF1;
  RvSystem1.OutputFileName := 'Project1.pdf';
  RvProject1.Open;

  RvProject1.SetParam('Name1', Name1Edit.Text);
  RvProject1.SetParam('Name2', Name2Edit.Text);

  MyProject := RvProject1.ProjMan.FindReport('staffImageProof', true) as TRaveReport;

  CoverPage:= RvProject1.ProjMan.FindRaveComponent('coverPage', MyProject) as TRavePage;
  PageList:= TRaveComponentList.Create;
  PageList.Add(CoverPage);

  pageNumber := 0;
  pageImageCounter := 0;

  setLength(ReportPages, numberOfPages);

  for imageNumber := 0 to numberOfImages - 1 do
    begin
      inc(pageImageCounter);

      if pageImageCounter = 1 then
        begin
          ReportPages[pageNumber] := RvProject1.ProjMan.FindRaveComponent('imagePage', MyProject) as TRavePage;
        end;

      staffImage := ReportPages[pageNumber].FindComponent('staffImage' + intToStr(pageImageCounter)) as TRaveBitmap;
      staffImage.Image.LoadFromFile(imageList[imageNumber]);

      if (pageImageCounter = imagesPerPage) or (imageNumber = (numberOfImages - 1)) then
        begin
          PageList.Add(ReportPages[pageNumber]);
          pageImageCounter := 0;
          inc(pageNumber);
        end;
    end;

  MyProject.PageList := PageList;

  RvProject1.SelectReport('staffImageProof', false);
  RvProject1.StoreRAV := true;
  RvProject1.Execute;
  RvProject1.Close;
  Finalize(ReportPages);
end;

考慮到您有一個帶有兩個頁面的名為“ Report1”的報告的狂歡報告文件:

  • 'CoverPage':包含所有所需內容的封面
  • 'ReportPage':模板包含一個名為'Image'的位圖組件以及您需要的所有其他內容。

在您的Delphi代碼中,在表單上,​​您需要:

  • TRvProject'RvProject1',其屬性'ProjectFile'鏈接到您的RaveReport文件(擴展名.rav)
  • TRvSystem'RvSystem1'保存您的PDF
  • TRvRenderPDF'RvRenderPDF1'

在ReportButton OnClick事件中,您必須使用TRaveReport,TRavePage,TRavePage,TRaveBitmap和TRaveComponentList數組:

procedure TForm1.ReportButtonClick(Sender: TObject);
var
  ReportPages: array of TRavePage;
  CoverPage: TRavePage;
  ImageFile: TRaveBitmap;
  MyProject: TRaveReport;
  PageList: TRaveComponentList;
  i: Integer;
begin
  RvSystem1.DoNativeOutput:=false;
  RvSystem1.RenderObject:=RvRenderPDF1;
  RvSystem1.OutputFileName:='Project1.pdf';
  RvProject1.Open;

  MyProject:= RvProject1.ProjMan.FindReport('Report1', true) as TRaveReport;

  CoverPage:= RvProject1.ProjMan.FindRaveComponent('CoverPage', MyProject) as TRavePage;
  PageList:= TRaveComponentList.Create;
  PageList.Add(CoverPage);

  SetLength(ReportPages, PageCount);
  for i := 0 to PageCount - 1 do begin
    ReportPages[i]:= RvProject1.ProjMan.FindRaveComponent('ReportPage', MyProject) as TRavePage;
    ImageFile:=TRaveBitmap(RvProject1.ProjMan.FindRaveComponent('Image',ReportPages[i]));
    ImageFile.Image.LoadFromFile(MyImageList[i]);
    PageList.Add(ReportPages[i]);
  end;
  MyProject.PageList:= PageList;

  RvProject1.SelectReport('Report1', false);
  RvProject1.StoreRAV:=true;
  RvProject1.Execute;
  RvProject1.Close;
  Finalize(ReportPages);
end;

更新

好的,經過幾個小時的搜索,我發現了一個解釋:您必須克隆模板頁面才能在報告中使用它。 否則,您只需將頁面復制到RvProject中,以便將最后一頁的最后一個圖像復制到所有其他頁面中。

要克隆頁面,您必須在RvUtil單元中使用TStreamHelper類:

var
  AStreamHelper: TStreamHelper;
  AStream: TMemoryStream;
  OldName: string;
  TempName: string;
  TemplatePage: TRavePage;
begin
...
...
  TemplatePage:= RVProject1.ProjMan.FindRaveComponent('imagePage', MyProject) as TRavePage;

  for imageNumber := 0 to numberOfImages - 1 do
  begin
    inc(pageImageCounter);

    if pageImageCounter = 1 then
    begin
      AStream := TMemoryStream.Create;
      AStreamHelper := TStreamHelper.Create(AStream);
      AStreamHelper.SavePos;
      TemplatePage.SaveToStreamHelper(AStreamHelper);
      AStreamHelper.RestorePos;

      OldName := TemplatePage.Name;
      TemplatePage.Name := 'template';

      ReportPages[pageNumber] := TRavePage.Create(MyProject);
      ReportPages[pageNumber].LoadFromStreamHelper(AStreamHelper);
      AStreamHelper.Destroy;
      AStream.Destroy;

      ReportPages[pageNumber].Name := 'imagePage'+IntToStr(pageNumber);
      TemplatePage.Name := OldName;
      ReportPages[pageNumber].Parent:= MyProject;
    end;

    staffImage := ReportPages[pageNumber].FindComponent('staffImage' + intToStr(pageImageCounter)) as TRaveBitmap;
    staffImage.Image.LoadFromFile(imageList[imageNumber]);

    if (pageImageCounter = imagesPerPage) or (imageNumber = (numberOfImages - 1)) then
    begin
      PageList.Add(ReportPages[pageNumber]);
      pageImageCounter := 0;
      inc(pageNumber);
    end;
  end;
  ...
  ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM