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

时间:2016-09-14 09:23:51

标签: delphi pdf rave-reports

我对Rave Reports完全陌生,并努力掌握它。

目标是拥有一个包含封面页的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;

1 个答案:

答案 0 :(得分:1)

考虑到你有一个狂野的报告文件,其中一个名为'Report1'的报告有两个页面:

  • 'CoverPage':包含您想要的所有内容的封面
  • 'ReportPage':带有名为'Image'的Bitmap组件的模板以及您需要的所有其他内容。

在您的Delphi代码中,您需要在表单上

  • TRvProject'RvProject1',其属性'ProjectFile'链接到您的RaveReport文件(扩展名.rav)
  • 用于保存PDF的TRvSystem'RvSystem1'
  • 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;
  ...
  ...