2017-03-22 37 views
0

在下面的例子中,我试图在多个页面中添加一个位图图像到pdf。 小bitmapdata它工作正常。但是当它超过8000像素时,会给出错误的无效位图数据。 有没有其他方法可以做到这一点。如何使用AlivePDF Flex将图像添加到PDF?

<?xml version="1.0" encoding="utf-8"?> 
<mx:VBox xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%" minHeight="0"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<mx:VBox width="100%" id="img1" > 
    <mx:HBox width="100%"> 
     <s:Button click="saveToPDF(event)" label="ExportPDF"/> 
    </mx:HBox> 
    <mx:HBox width="100%"> 
     <s:Label width="80" text="Emp Name:"/> 
     <s:TextInput/> 
    </mx:HBox> 
    <mx:HBox width="100%"> 
     <s:Label width="80" text="Emp Code:"/> 
     <s:TextInput/> 
    </mx:HBox> 
    <mx:HBox width="100%"> 
     <s:Label width="80" text="Emp Address:"/> 
     <s:TextInput/> 
    </mx:HBox> 
    <mx:HBox width="100%"> 
     <s:Label width="80" text="Phone No:"/> 
     <s:TextInput/> 
    </mx:HBox> 
    <mx:HBox width="100%"> 
     <s:Label width="80" text="Email Id:"/> 
     <s:TextInput/> 
    </mx:HBox> 
    <mx:DataGrid height="1000" width="100%"> 
     <mx:columns> 
      <mx:DataGridColumn headerText="Column 1" dataField="col1"/> 
      <mx:DataGridColumn headerText="Column 2" dataField="col2"/> 
      <mx:DataGridColumn headerText="Column 3" dataField="col3"/> 
     </mx:columns> 
    </mx:DataGrid> 
    <mx:Accordion width="100%" height="500"> 
     <s:NavigatorContent label="Accordion Pane 1" width="100%" height="100%"> 
     </s:NavigatorContent> 
     <s:NavigatorContent label="Accordion Pane 2" width="100%" height="100%"> 
     </s:NavigatorContent> 
     <s:NavigatorContent label="Accordion Pane 3" width="100%" height="100%"> 
     </s:NavigatorContent> 
     <s:NavigatorContent label="Accordion Pane 4" width="100%" height="100%"> 
     </s:NavigatorContent> 
     <s:NavigatorContent label="Accordion Pane 5" width="100%" height="100%"> 
     </s:NavigatorContent> 
    </mx:Accordion> 
<s:Panel height="1000" title="sample panel" width="100%" /> 
    <mx:DataGrid height="1000" width="100%"> 
     <mx:columns> 
      <mx:DataGridColumn headerText="Column 1" dataField="col1"/> 
      <mx:DataGridColumn headerText="Column 2" dataField="col2"/> 
      <mx:DataGridColumn headerText="Column 3" dataField="col3"/> 
      <mx:DataGridColumn headerText="Column 4" dataField="col4"/> 
      <mx:DataGridColumn headerText="Column 5" dataField="col5"/> 
      <mx:DataGridColumn headerText="Column 6" dataField="col6"/> 
      <mx:DataGridColumn headerText="Column 7" dataField="col7"/> 
      <mx:DataGridColumn headerText="Column 8" dataField="col8"/> 
     </mx:columns> 
    </mx:DataGrid> 
    <s:Panel height="1000" title="sample panel 2" width="100%" > 
     <s:Label text="Sample Panel 2" paddingTop="10" fontSize="18"/> 
    </s:Panel> 
    <mx:DataGrid height="1200" width="100%"> 
     <mx:columns> 
      <mx:DataGridColumn headerText="Emp no" dataField="col1"/> 
      <mx:DataGridColumn headerText="Emp Name" dataField="col2"/> 
      <mx:DataGridColumn headerText="Phone" dataField="col3"/> 
      <mx:DataGridColumn headerText="Salary" dataField="col4"/> 
      <mx:DataGridColumn headerText="Email" dataField="col5"/> 

     </mx:columns> 
    </mx:DataGrid> 
    <s:Panel height="1000" title="sample panel 3" width="100%" > 
     <s:Label text="Sample Panel 3" paddingTop="10" fontSize="24" /> 
    </s:Panel> 
    <mx:DataGrid height="1200" width="100%"> 
     <mx:columns> 
      <mx:DataGridColumn headerText="Emp Id" dataField="col1"/> 
      <mx:DataGridColumn headerText="Designation" dataField="col2"/> 
      <mx:DataGridColumn headerText="Salary" dataField="col4"/> 
      <mx:DataGridColumn headerText="Email" dataField="col5"/> 

     </mx:columns> 
    </mx:DataGrid> 
</mx:VBox> 
<fx:Script> 
<![CDATA[ 
import org.alivepdf.display.Display; 
import org.alivepdf.images.ResizeMode; 
import org.alivepdf.layout.Orientation; 
import org.alivepdf.layout.Size; 
import org.alivepdf.layout.Unit; 
import org.alivepdf.pdf.PDF; 
import org.alivepdf.saving.Method; 

protected function saveToPDF(e:MouseEvent):void 
{ 


var singlepageheight:Number=1500; 
var totalheight:Number=0; 

totalheight=img1.height; 


var totalpages:Number=0; 
var myPDFEncoder:PDF = new PDF (Orientation.PORTRAIT, Unit.MM,Size.A4); 
myPDFEncoder.setDisplayMode(Display.FULL_PAGE); 

myPDFEncoder.addPage(); 

totalpages=Math.ceil(totalheight/singlepageheight); 

for(var i:Number=0;i<totalpages;i++) 
{ 

if(i==0) 
{ 

var bmd:BitmapData = new BitmapData(img1.width, singlepageheight); 
bmd.draw(img1, null, null, null, new Rectangle(0, 0, img1.width, singlepageheight)); 
var bm:Bitmap = new Bitmap(bmd); 
myPDFEncoder.addImage(bm,0,24,0,0,'PNG', 100, 1,ResizeMode.FIT_TO_PAGE); 
} 
else 
{ 

myPDFEncoder.addPage(); 

var loaderBMD:BitmapData = new BitmapData(img1.width,(i+1)*singlepageheight); 
loaderBMD.draw(img1); 

var bmd2:BitmapData = new BitmapData(img1.width, singlepageheight, false, 0xFFFFFF); 
bmd2.copyPixels(loaderBMD, new Rectangle(0, ((i)*singlepageheight), img1.width,totalheight), new Point(0,0)); 
var bm1:Bitmap = new Bitmap(bmd2); 
myPDFEncoder.addImage(bm1,0,10,0,0,'PNG', 100, 1,ResizeMode.FIT_TO_PAGE); 

} 


} 

var bytes:ByteArray = myPDFEncoder.save(Method.LOCAL); 
var fx:FileReference = new FileReference(); 
fx.save(bytes,"sample.pdf"); 




} 

]]> 
</fx:Script> 

回答

2

作为每文档BitmapData不能超过大于8191个象素。下面是直接从文件取出的摘录:

在AIR 1.5和Flash播放器10中,BitmapData 对象的最大尺寸的宽度或高度8191个像素,和 像素总数不能超过16,777,215像素。 (因此,如果BitmapData对象是 8191像素宽,它只能是2048个像素高。)在Flash Player 9及更早版本和AIR 1.1和更早版本中,限制是2880个像素 在高度和2880在宽度

这里的链接类文档:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html

我会建议你用逻辑来视口拆分成多张图片,然后把它们放在PDF。

其他方法是使用AlivePDF的内置控件来创建所需的布局。

希望这会有所帮助。

+0

你有什么想法如何将视口分成多个图像?使用字节数组我也试过,但没有运气。 –

相关问题