使用 Delphi 中的模板添加新的 Rave Report 页面
Add new Rave Report page using template in Delphi
我对 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;
考虑到您有一份包含两页名为 '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 class :
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;
...
...
我对 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;
考虑到您有一份包含两页名为 '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 class :
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;
...
...