[英]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”的報告的狂歡報告文件:
在您的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;
...
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.