26.11.打印页眉和页脚

26.11.1. 问题
我想打印出页眉和页脚
26.11.2. 解决办法
创建打印渲染器组件控制页面布局
26.11.3. 讨论
结合打印渲染器的PrintDataGrid比PrintDataGrid自身具备更多的布局控制能力。常见的任务就是打印页眉和页脚。这个技术涉及是否在布局中包含页眉和页脚以及PrintDataGrid的validNextPage属性的测试结果。下面的代码,HeaderFooterPrintRenderer.mxml,定义了一个打印渲染器生成多页打印内容,包括在适当位置的页眉和页脚:
+展开
-XML
<?xml version="1.0"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#ffffffhorizontalAlign="center">

<mx:Script>
<![CDATA[
public function startJob():void
{
//Try to print this on a single page
header.visible = true;
header.includeInLayout = true;
footer.visible = true;
footer.includeInLayout = true;
this.validateNow();
if (printGrid.validNextPage)
{
//The grid is too big to fit on a single page
footer.visible = false;
footer.includeInLayout = false;
this.validateNow();
}
}
public function nextPage():Boolean
{
header.visible = false;
header.includeInLayout = false;
printGrid.nextPage();
footer.visible = !printGrid.validNextPage;
footer.includeInLayout = !printGrid.validNextPage;
this.validateNow();
return printGrid.validNextPage;
}

]]>
</mx:Script>
<mx:DateFormatter id="formatterformatString="M/D/YYYY" />
<mx:Canvas id="headerheight="80width="100%">
<mx:Label text="Population by State"
fontSize="24"
color="0x666666"
horizontalCenter="0"
verticalCenter="0"
width="100%"
textAlign="center" />

</mx:Canvas>
<mx:VBox height="100%width="80%">
<mx:PrintDataGrid id="printGridwidth="100%"
height="100%">

<mx:columns>
<mx:DataGridColumn dataField="@name"
headerText="State" />

<mx:DataGridColumn dataField="@population"
headerText="Population"/>

</mx:columns>
</mx:PrintDataGrid>
</mx:VBox>
<mx:DateFormatter id="formatformatString="m/d/yyyy" />
<mx:Canvas id="footerheight="80width="100%">
<mx:Label text="{formatter.format(new Date())}"
left="20bottom="5" />

</mx:Canvas>
</mx:VBox>

这个组件定义了一个包含标题的页眉和显示日期的页脚。startJob方法为第一页初始化打印布局。它首先尝试把整个数据都容纳在单个页面里,然后调用validateNow强制更新组件布局,你可以通过PrintDataGrid的validNextPage属性测试其结果。如果返回值为false,则正好容纳,否则布局将被调整以隐藏页脚,重新更新布局。到此为止,无聊内容是多页还是单页,第一页都将被添加到打印机任务中。如果需要多页,nextPage方法将准备相应的布局。它将隐藏页眉(因此这已经不是第一页,不需要页眉了)以及根据情况打印页脚。

把构建智能页面布局放到渲染器里将大大简化实际打印任务。下面的代码块HeaderFooter.mxml,演示如何使用打印渲染器:
+展开
-ActionScript
public function print():void
{
var printJob:FlexPrintJob = new FlexPrintJob();
if (printJob.start())
{
var printRenderer:HeaderFooterPrintRenderer =
new HeaderFooterPrintRenderer();
printRenderer.visible = false;
this.addChild(printRenderer);
printRenderer.width = printJob.pageWidth;
printRenderer.height = printJob.pageHeight;
printRenderer.dataProvider = populationData.state;
printRenderer.startJob();
do
{
printJob.addObject(printRenderer);
}
while (printRenderer.nextPage());
//Send the last page
printJob.addObject(printRenderer);
printJob.send();
this.removeChild(printRenderer);
}
}

Print方法开始一个打印任务并建立一个打印渲染器。这部分代码完成渲染器startJob方法的调用,准备好第一页的打印。下一部分代码,do...while块继续添加页面到打印任务,直到nextPage方法返回false,指示已没有页面可打印。但是do...while块是在最后调用nextPage方法,因此当循环结束最后一页还没有加入到打印任务中,需额外加入,发送打印任务,移除显示列表中的渲染器。

加支付宝好友偷能量挖...


评论(0)网络
阅读(87)喜欢(0)flash/flex/fcs/AIR