2017-03-22 12 views
0

아래 예제에서는 여러 페이지의 pdf에 하나의 비트 맵 이미지를 추가하려고합니다. 작은 bitmapdata에 대해 잘 작동합니다. 8000 픽셀을 넘으면 유효하지 않은 비트 맵 데이터를 오류로 보냅니다. 다른 방법이 있습니까? 이상 8,191 픽셀을 초과 할 수없는 문서 BitmapData으로 당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

. AIR 1.5 플래시 플레이어 (10)에서는 BitmapData 오브젝트의 최대 크기

는 8,191 폭 또는 높이를 픽셀과 16,777,215 픽셀을 초과 할 수 없다 픽셀의 총 수이다 : 여기 문서로부터 직접 취한 발췌 . 플래시 플레이어 9 (a BitmapData 객체 8,191 픽셀 폭한다면, 그것은 단지. 2,048 픽셀 높을 수) 이전 및 AIR 1.1 이전의 제한은 폭

2,880 픽셀 높이 및 2,880 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html

난 당신이 여러 개의 이미지로 뷰포트를 분할 논리를 사용하고 PDF에 넣어 추천 :

다음은 클래스 문서에 대한 링크입니다.

다른 방법은 원하는 레이아웃을 만들기 위해 AlivePDF의 기본 제공 컨트롤을 사용하는 것입니다.

희망이 도움이됩니다.

+0

뷰포트를 여러 이미지로 분할하는 방법에 대해 알고 계십니까? 바이트 배열을 사용하여 나는 또한 행운을 시도했다. –