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

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

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

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


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

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

          我的彈出頁(yè)面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)試多次,確實(shí)bitMap是有的,不是null.


            回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2010-08-16 08:52 | 菠蘿大象
          @junlin
          現(xiàn)在我沒(méi)這個(gè)環(huán)境重試我的這個(gè)應(yīng)用了,但我當(dāng)時(shí)做的時(shí)候,是沒(méi)有這么長(zhǎng)的URL的,點(diǎn)擊導(dǎo)出后,直接彈出下載的窗口,你這種情況真奇怪啊。加我QQ9174265,我們討論一下,不過(guò)我先說(shuō)好,我不是專業(yè)做FLEX的,以前項(xiàng)目中有用到,這樣才學(xué)了些,不能幫你解決問(wèn)題請(qǐng)不要見(jiàn)怪  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2010-09-16 16:30 | 可以用ASP.NET導(dǎo)出
          AlivePDF+FLex+ASP.NET 可以用ASP.NET導(dǎo)出嗎?  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2010-09-16 16:53 | 菠蘿大象
          @可以用ASP.NET導(dǎo)出
          呃。。。這個(gè)我不清楚,大象一直做的都是Java開(kāi)發(fā),對(duì).Net不熟,對(duì)不住啊!  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解[未登錄](méi) 2010-09-17 11:46 | jack
          哈哈我用AlivePDF+java可以到處,但是到了ASP.NET中死活獲取不到流。  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2010-11-24 10:31 | 小房
          @leke_斌
          你好!你的打印word格式的方法能夠分享下嗎?
          謝謝!  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2010-11-24 15:01 | 菠蘿大象
          @小房
          你好,我沒(méi)做打印word,當(dāng)時(shí)的需求只是導(dǎo)出為pdf,后來(lái)?yè)Q了工作,這部分就移交出去了,抱歉,我?guī)筒涣四恪?nbsp; 回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2011-02-11 11:38 | lyric、
          請(qǐng)問(wèn)大家中文問(wèn)題解決了嗎?  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2011-02-11 11:38 | lyric、
          請(qǐng)問(wèn)中文問(wèn)題解決了嗎?  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2015-12-23 17:23 | 孤帆
          您好,我希望能利用alivepdf生成pdf,并利用flash的打印功能打印文件
          1.pdf可以保存在本地,也可不保存
          2.服務(wù)器用的是jasperreport所以支持很多格式(pdf、xml)的輸出
          請(qǐng)問(wèn),客戶端flash怎么樣才能實(shí)現(xiàn)  回復(fù)  更多評(píng)論
            
          # re: 在Flex中使用AlivePDF導(dǎo)出PDF實(shí)例詳解 2015-12-25 09:58 | 菠蘿大象
          @孤帆
          你的問(wèn)題和AlivePDF沒(méi)什么關(guān)系吧,你這是怎么實(shí)現(xiàn)你的功能的問(wèn)題。另外我從2010年開(kāi)始就沒(méi)再搞FLEX了,現(xiàn)在差不多都忘光了。^_^  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 漠河县| 长沙县| 双牌县| 囊谦县| 即墨市| 舞钢市| 大理市| 武邑县| 黔江区| 崇左市| 天柱县| 乌恰县| 彰化县| 同心县| 丰顺县| 安仁县| 邵武市| 宿州市| 津南区| 鄯善县| 师宗县| 南城县| 马鞍山市| 葵青区| 凤凰县| 西盟| 岳阳县| 安国市| 儋州市| 正定县| 黄浦区| 丘北县| 根河市| 梁山县| 县级市| 阜宁县| 卢湾区| 北票市| 溧水县| 海淀区| 福州市|