隨筆-67  評論-522  文章-0  trackbacks-0
              在前一篇"使用Flex開發時空線形圖實例詳解"中,我們得到了一張時空線形圖報表,本文將說明如何使用AlivePDF導出PDF文件。
              AlivePDF是一個用ActionScript 3寫的開源PDF開發包。它有很全的文檔和示例資料,很容易上手和學習。現在已經發布0.1.5最新版本目前在Flex中導出PDF,大多數都采用它來實現。
              官方網站:
          http://alivepdf.bytearray.org/
              大象當時開發的時候采用的是0.1.4.9版本。AlivePDF給我們提供了一套模板化的導出方法,使用起來非常方便。

          //canvasid,這是獲得整個畫布內容的快照,返回的是一個位圖
          var bmp:BitmapData = ImageSnapshot.captureBitmapData(canvas);
          var bitmap:Bitmap = new Bitmap(bmp); //將位圖轉換為顯示對象
          /**
           * 在創建PDF對象之前,設置Size對象的詳細參數
           * 第一個參數是圖像大小數組(width,height),這里給它設定原始圖片大小
           * 第二個參數是一個字符串,相當于一個標題名
           * 第三個參數是尺寸,英寸數組(width,height)
           * 第四個參數是尺寸,毫米數組(width,height)
           */
          var autoSize:Size = new Size([bitmap.height,bitmap.width],"Tabloid",[11, 17],[279, 432]);
          /**
           創建PDF對象,設置其詳細參數
           * 第一個參數是方向,LANDSCAPE是橫向,PORTRAIT是縱向
           * 第二個參數是一個字符串,相當于一個標題名
           * 第三個參數是單位,MM是毫米
           * 第四個參數是Size對象
           */
          var myPDF:PDF = new PDF(Orientation.LANDSCAPE, Unit.MM,autoSize);
          myPDF.setDisplayMode(Display.FULL_PAGE); //顯示方式,設置為完全顯示
          myPDF.addPage();  //加入到當前頁面
          myPDF.addImage(bitmap); //把要導出的顯示對象加入進來
          /**
           生成PDF
           * 第一個參數是指定采用什么方式生成PDF,一般是REMOTE服務端生成
           * 第二個參數是服務器地址
           * 第三個參數是打開方式,ATTACHMENT是附件,INLINE是在瀏覽器中打開
           * 第四個參數是生成的PDF文件名
           */
          myPDF.save(Method.REMOTE, "http://server:port/appName/createpdf",Download.ATTACHMENT, "timespace.pdf");
              上面這些就是導出PDF的步驟,是不是很簡單?官方例子中,是沒有實例化Size對象,并對它進行參數設置的,而且使用的是固定設置,它有幾個預定義好的靜態構造對象,可以直接使用。之所以這里要自己定義,是因為我發現如果采用預定義的設置,導出的圖像不清晰。我看過Size類的源碼,特別是第一個參數,如果你準備導出的尺寸不符合預定義設置的話,最好改成自己想要導出的對象尺寸,這樣效果要好一些,另外比較重要的就是第三和第四個參數,一個是英寸一個是毫米。當時我做的時候,將預定義中的值都換著試了遍,發現如果導出的圖像比較大,這兩組值設定的比較小的話,當縮小看時,會很模糊。DOC文檔中寫的意思我沒看懂,翻譯過來就是說,這是為用戶更好的顯示不進行尺寸計算。我估計這是表示在單位面積內的像素數,不知道這樣理解對不對,如果有誤,請知道的朋友幫忙指正一下。
              服務器端使用Servlet來處理文件的導出,一般都是采用示例中提供的代碼,基本上是不需要改動的,我把代碼貼出來。

          public class CreatePDF extends HttpServlet {
              public void doPost(HttpServletRequest req, HttpServletResponse resp)
                      throws ServletException, IOException {
                  doGet(req, resp);
              
          }
              
          public void doGet(HttpServletRequest req, HttpServletResponse resp)
                      
          throws ServletException, IOException {
                  int i = 0;
                  
          int k = 0;
                  
          int maxLength = req.getContentLength();
                  
          byte[] bytes = new byte[maxLength];
                  
          String method = req.getParameter("method");
                  
          String name = req.getParameter("name");
                  
          ServletInputStream si = req.getInputStream();
                  
          while (true) {
                      
          k = si.read(bytes, i, maxLength);
                      
          i += k;
                      
          if (k <= 0)
                          
          break;
                  
          }
                  
          if (bytes != null) {
                      
          ServletOutputStream stream = resp.getOutputStream();
                      
          resp.setContentType("application/pdf");
                      
          resp.setContentLength(bytes.length);
                      
          resp.setHeader("Content-Disposition", method + ";filename=" + name);
                      
          stream.write(bytes);
                      
          stream.flush();
                      
          stream.close();
                  
          } else {
                      
          resp.setContentType("text");
                      
          resp.getWriter().write("bytes is null");
                  
          }
              
          }
          }
              記得要在web.xml文件里加上servlet配置
          <servlet>
              
          <servlet-name>createPDF</servlet-name>
              
          <servlet-class>com.bolo.common.CreatePDF</servlet-class>

          </servlet>
          <servlet-mapping>
              
          <servlet-name>createPDF</servlet-name>
              
          <url-pattern>/createpdf</url-pattern>
          </servlet-mapping>

              OK,使用AlivePDF導出PDF文件講完了,如果有什么不清楚的,或是我說的不對的地方,請大家提出來。謝謝。
              
          本文為菠蘿大象原創,如要轉載請注明出處。
          posted on 2010-03-01 13:13 菠蘿大象 閱讀(6960) 評論(23)  編輯  收藏 所屬分類: Flex

          評論:
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-16 17:30 | leke_斌
          你好 請問你知道Flex中怎么保存為word或ppt文件么,現在保存word我是這樣做的,在flex中發送請求及傳遞參數,后臺處理數據并轉至servlet導出,但不知flex是點擊按鈕后是怎么一種方式請求,用HTTPService請求  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-16 22:39 | 菠蘿大象
          @leke_斌
          對于你的問題我有點看不明白。你是想導出word或ppt格式的文件?還是想弄清楚請求方式?你好像又說,你現在已經實現了這部分的功能。真的不知道你的問題是什么。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-19 15:55 | leke_斌
          不好意思,我表達的不清楚,是這樣的,我需要實現以下在flex中導出內容至WORD、PDF、PPT功能,其中我已經實現了WORD,想請問你觸發什么條件導出PDF,然后你這有沒有導出PPT的例子  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-19 21:42 | 菠蘿大象
          @leke_斌
          導出PDF就是用這個SWC庫,這肯定需要一個事件來觸發了。我用的是click事件。代碼就是我寫的這些,把它們放到事件回調函數里面就可以了。目前我只做過PDF的導出,還沒做過PPT的導出。另外請問下,你的WORD導出是怎么實現的?最后補充一下,年后換了一家公司,目前沒有繼續搞FLEX開發了,我其實對FLEX沒有太深的研究,希望我目前知道的東西對你有幫助,也請分享一下成功的經驗,互相學習。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-20 09:03 | leke_斌
          非常不好意思,再次打擾你。word導出也是和你的處理方式一樣,在flex中觸發添加事件,請求至后臺java,采用控件jacob來實現功能。現在我導出pdf遇到點問題, req.getContentLength();得到值為-1,根據我的判斷,有兩種可能性,一是flex端jar程序我沒有全部導全,二是sevlet操作代碼修改。
          我現在使用的是AlivePDF0.1.5,只使用了org/alivepdf的內容,不知是否正常,你有遇到內容為-1問題么  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-20 11:39 | leke_斌
          現在可以導出PDF,郁悶,問題在于第一次請求sevlet時req.getContentLength有值,而根據電腦的一些設置點擊"是否下載文件"對話框時文件自動關聯迅雷,則第二次請求則為-1值,下載不出來  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-04-20 12:46 | 菠蘿大象
          @leke_斌
          這個導出還跟瀏覽器有關,我在IE7上面測試過,因為安全級別的問題,點導出會沒反應,而IE6就沒問題。至于你說的關聯迅雷后,第二次點擊出現的-1情況我沒有測試過呢!按理說,應該是同一個請求。沒有這個環境實在不好說。在flex里面用調試工具測試一下吧,第二次請求時,bitmap是否為null  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-07-18 21:02 | junlin
          你好,你這里有alivepdf生成的pdf嗎?我想看看打印的效果。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-07-19 08:54 | 菠蘿大象
          @junlin
          這位同學,我怎樣讓你看到打印效果?其實在前一篇的時空線性圖里面,我截取的幾張圖片就是打印后的效果,里面還有打印及預覽導出等等功能,導出后的PDF和圖片顯示是一樣的。就是要注意你的Size對象設置參數,這會影響你最終的打印效果。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-08-14 09:55 | junlin
          @leke_斌
          你好,alivePdf打印的問題解決了嗎?sevlet時req.getContentLength的值為什么總是-1呢?  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-08-14 10:45 | junlin
          @菠蘿大象
          你好,我使用pdf的 save方法傳到servlet接收到的總是req.getContentLength的值是-1,(我是向java后臺傳的)
          你有alivepdf例子嗎,發我一份好吧,
          在向servlet提交的時候瀏覽器的url能發給我看看嗎?
          謝謝!
          另外,您有qq嗎?想加您為好友  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-08-15 17:00 | 菠蘿大象
          @junlin
          傳給servlet的URL地址我已經在文章中的寫出了,就是save方法中的那個,你應該調試下FLEX代碼,你能確定要打印的東西真的截取到了么?bitmap是否為null?  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-08-15 18:53 | junlin
          @菠蘿大象


          呵呵 ,感謝回復。

          是這樣的,我指的url是提交之后彈出的頁面的url

          我的彈出頁面url是:http://127.0.0.1:8088/auditfms/print.do?name=print.pdf&method=inline?%PDF-1.51%200%20obj<</Type%20/Pages/Kids%20[3%200%20R]/Count%201>>endobj3%200%20obj<</Type%20/Page/Parent%201%200%20R/MediaBox%20[0%200%20841.89%20595.28]/Resources%202%200%20R/Rotate%200/Contents%204%200%20R>>endobj4%200%20obj<</Length%20108>>streamBT%20/F1%209.00%20Tf%20ET/GS0%20gs1.000%200.000%200.000%201.000%200.000%200.000%20cmq%2074.00%200%200%2052.00%2028.35%20514.93%20cm/I1%20Do%20Qendstreamendobj5%200%20obj<</Type%20/OCG%20/Name%20(print)/Usage%20<</Print%20<</PrintState%20/ON>>%20/View%20<</ViewState%20/OFF>>>>>>endobj6%200%20obj<</Type%20/OCG%20/Name%20(view)/Usage%20<</Print%20<</PrintState%20/OFF>>%20/View%20<</ViewState%20/ON>>>>>>endobj7%200%20obj<</Type%20/ExtGState/BM%20/Normal/ca%201/n%207/SA%20true/CA%201>>endobj8%200%20obj<</Type%20/Font/BaseFont%20/Helvetica/Subtype%20/Type1/Encoding%20/WinAnsiEncoding>>endobj9%200%20obj<</Type%20/XObject/Subtype%20/Image/Width%2074/Height%2052/ColorSpace%20/DeviceRGB/BitsPerComponent%208/Filter%20/FlateDecode/DecodeParms%20<</Predictor%2015%20/Colors%203%20/BitsPerComponent%208%20/Columns%2074>>/Length%201006>>streamx隉榹HSa瓶/Z濂以(?誆??2?$*?慇Ks^?琇思0Sgj諗靆t肒7o婮M訰粻i鍛歸苕?%層皂?阷伢撬?繯{蝟l闞誮u?劷?€b貍)憷q:p?P$W惠S吂宷? ;H<N緩F

          是這些內容。

          調試多次,確實bitMap是有的,不是null.


            回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-08-16 08:52 | 菠蘿大象
          @junlin
          現在我沒這個環境重試我的這個應用了,但我當時做的時候,是沒有這么長的URL的,點擊導出后,直接彈出下載的窗口,你這種情況真奇怪啊。加我QQ9174265,我們討論一下,不過我先說好,我不是專業做FLEX的,以前項目中有用到,這樣才學了些,不能幫你解決問題請不要見怪  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-09-16 16:30 | 可以用ASP.NET導出
          AlivePDF+FLex+ASP.NET 可以用ASP.NET導出嗎?  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-09-16 16:53 | 菠蘿大象
          @可以用ASP.NET導出
          呃。。。這個我不清楚,大象一直做的都是Java開發,對.Net不熟,對不住啊!  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解[未登錄] 2010-09-17 11:46 | jack
          哈哈我用AlivePDF+java可以到處,但是到了ASP.NET中死活獲取不到流。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-11-24 10:31 | 小房
          @leke_斌
          你好!你的打印word格式的方法能夠分享下嗎?
          謝謝!  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2010-11-24 15:01 | 菠蘿大象
          @小房
          你好,我沒做打印word,當時的需求只是導出為pdf,后來換了工作,這部分就移交出去了,抱歉,我幫不了你。  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2011-02-11 11:38 | lyric、
          請問大家中文問題解決了嗎?  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2011-02-11 11:38 | lyric、
          請問中文問題解決了嗎?  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2015-12-23 17:23 | 孤帆
          您好,我希望能利用alivepdf生成pdf,并利用flash的打印功能打印文件
          1.pdf可以保存在本地,也可不保存
          2.服務器用的是jasperreport所以支持很多格式(pdf、xml)的輸出
          請問,客戶端flash怎么樣才能實現  回復  更多評論
            
          # re: 在Flex中使用AlivePDF導出PDF實例詳解 2015-12-25 09:58 | 菠蘿大象
          @孤帆
          你的問題和AlivePDF沒什么關系吧,你這是怎么實現你的功能的問題。另外我從2010年開始就沒再搞FLEX了,現在差不多都忘光了。^_^  回復  更多評論
            
          主站蜘蛛池模板: 余江县| 波密县| 云安县| 祥云县| 榆社县| 辉县市| 通城县| 泰和县| 甘洛县| 象山县| 鄂尔多斯市| 塔城市| 墨竹工卡县| 新昌县| 辽源市| 渝北区| 陕西省| 安多县| 和龙市| 定南县| 灌南县| 南和县| 库车县| 马边| 宝鸡市| 巫溪县| 宾阳县| 海口市| 望谟县| 油尖旺区| 济源市| 外汇| 阿拉善左旗| 教育| 泗洪县| 遵义市| 福鼎市| 禄劝| 公安县| 合川市| 宁阳县|