2011年10月19日 星期三

[教學] 輸出PDF 文件

ALIVEPDF 是一個免費開源程式集, 用戶端使用Adobe Flash 直接輸出PDF 文件, 不需經由伺服器處理.
以下一個簡單範例, 介紹內建的FileReference 與外掛的ALIVEPDF 結合使用.

範例功能:
  1. 用戶瀏覽一個影像檔案
  2. 將影像檔案嵌入PDF 文件給用戶下載





使用類別:
  • FileReference - 提供一個可以在使用者電腦與伺服器之間上傳和下載檔案的工具
  • ByteArray位元組的封裝陣列, 瀏覽檔案的內容
  • org.alivepdf.pdf.PDF - 外掛程式庫, 可生產PDF 文件

範例說明:
  • 用戶瀏覽一個影像檔案
    定義一個FileReference 物件
    var _file:FileReference = new FileReference();
    
    當用戶按下"Select a Image", 利用FileReference 打開瀏覽檔案視窗
    function selectClickHandler(event:MouseEvent):void{
      // <----- open file browser
      _file.addEventListener(Event.SELECT, fileSelectHandler);
      _file.browse(getTypes());
    }
    selectBtn.addEventListener(MouseEvent.CLICK, selectClickHandler);
    
    載入已瀏覽檔案
    function fileSelectHandler(event:Event):void{
      // <----- load image raw data
      _file.addEventListener(Event.COMPLETE, loadCompleteHandler);
      _file.load();
    }
    
    檔案內容儲存為ByteArray 物件, 然後跳至下一版面
    function loadCompleteHandler(event:Event):void{
      // <----- cache image raw data
      _data = _file.data as ByteArray;
      
      // <----- goto save scene
      gotoAndPlay("save");
    }
    
    
    

  • 將影像檔案嵌入PDF 文件給用戶下載
    當用戶按下"Save as PDF", 建立PDF 物件, 把檔案嵌入, 最後利用FileReference 給用戶下載
    function saveClickHandler(event:MouseEvent):void{
      // <----- define variable
      var file:FileReference = new FileReference();
      var pdf:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);
      var resize:Resize = new Resize(Mode.FIT_TO_PAGE,Position.CENTERED);
      
      // <----- create page
      pdf.addPage();
      pdf.addImageStream(_data, ColorSpace.DEVICE_RGB, resize);
      
      // <----- output PDF file
      file.save(pdf.save(Method.LOCAL), "output.pdf");
    }
    saveBtn.addEventListener(MouseEvent.CLICK, saveClickHandler);
    

大家可以 [下載], 然後一齊看看.
當然這個PDF 類別, 還可以嵌入文字和Flash 內的任何MovieCLip.

參考資料: http://alivepdf.bytearray.org/?p=20

注意事項: 透過FileReference.save 給用戶下載檔案, 函數內必須包含由Flash Player 產生的MouseEvent. 若在一段情況下, 程式不能任意呼叫FileReference.save.

沒有留言: