我对Rave Reports完全陌生,并努力掌握它。
目标是拥有一个包含封面页的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;
答案 0 :(得分:1)
考虑到你有一个狂野的报告文件,其中一个名为'Report1'的报告有两个页面:
在您的Delphi代码中,您需要在表单上
在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;
...
...