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

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

          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導(dǎo)出PDF文件講完了,如果有什么不清楚的,或是我說的不對的地方,請大家提出來。謝謝。
              
          本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請注明出處。
          posted on 2010-03-01 13:13 菠蘿大象 閱讀(6961) 評論(23)  編輯  收藏 所屬分類: Flex

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


          呵呵 ,感謝回復(fù)。

          是這樣的,我指的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

          是這些內(nèi)容。

          調(diào)試多次,確實bitMap是有的,不是null.


            回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2010-08-16 08:52 | 菠蘿大象
          @junlin
          現(xiàn)在我沒這個環(huán)境重試我的這個應(yīng)用了,但我當時做的時候,是沒有這么長的URL的,點擊導(dǎo)出后,直接彈出下載的窗口,你這種情況真奇怪啊。加我QQ9174265,我們討論一下,不過我先說好,我不是專業(yè)做FLEX的,以前項目中有用到,這樣才學(xué)了些,不能幫你解決問題請不要見怪  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2010-09-16 16:30 | 可以用ASP.NET導(dǎo)出
          AlivePDF+FLex+ASP.NET 可以用ASP.NET導(dǎo)出嗎?  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2010-09-16 16:53 | 菠蘿大象
          @可以用ASP.NET導(dǎo)出
          呃。。。這個我不清楚,大象一直做的都是Java開發(fā),對.Net不熟,對不住啊!  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解[未登錄] 2010-09-17 11:46 | jack
          哈哈我用AlivePDF+java可以到處,但是到了ASP.NET中死活獲取不到流。  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2010-11-24 10:31 | 小房
          @leke_斌
          你好!你的打印word格式的方法能夠分享下嗎?
          謝謝!  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2010-11-24 15:01 | 菠蘿大象
          @小房
          你好,我沒做打印word,當時的需求只是導(dǎo)出為pdf,后來換了工作,這部分就移交出去了,抱歉,我?guī)筒涣四恪?nbsp; 回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2011-02-11 11:38 | lyric、
          請問大家中文問題解決了嗎?  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2011-02-11 11:38 | lyric、
          請問中文問題解決了嗎?  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2015-12-23 17:23 | 孤帆
          您好,我希望能利用alivepdf生成pdf,并利用flash的打印功能打印文件
          1.pdf可以保存在本地,也可不保存
          2.服務(wù)器用的是jasperreport所以支持很多格式(pdf、xml)的輸出
          請問,客戶端flash怎么樣才能實現(xiàn)  回復(fù)  更多評論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實例詳解 2015-12-25 09:58 | 菠蘿大象
          @孤帆
          你的問題和AlivePDF沒什么關(guān)系吧,你這是怎么實現(xiàn)你的功能的問題。另外我從2010年開始就沒再搞FLEX了,現(xiàn)在差不多都忘光了。^_^  回復(fù)  更多評論
            
          主站蜘蛛池模板: 聂荣县| 类乌齐县| 阳西县| 偏关县| 尼玛县| 铁力市| 巧家县| 香港 | 嘉善县| 射阳县| 临潭县| 连山| 桂阳县| 育儿| 阜阳市| 鄱阳县| 灌阳县| 海南省| 定西市| 凤山县| 双柏县| 理塘县| 黄梅县| 乌拉特中旗| 苏尼特左旗| 旅游| 三明市| 浑源县| 丰都县| 锡林郭勒盟| 乳源| 赣州市| 井研县| 米脂县| 红桥区| 枞阳县| 防城港市| 洛南县| 温宿县| 轮台县| 静宁县|