在前一篇"使用Flex開發(fā)時空線形圖實(shí)例詳解"中,我們得到了一張時空線形圖報表,本文將說明如何使用AlivePDF導(dǎo)出PDF文件。
AlivePDF是一個用ActionScript 3寫的開源PDF開發(fā)包。它有很全的文檔和示例資料,很容易上手和學(xué)習(xí)。現(xiàn)在已經(jīng)發(fā)布0.1.5最新版本。目前在Flex中導(dǎo)出PDF,大多數(shù)都采用它來實(shí)現(xiàn)。
官方網(wǎng)站:http://alivepdf.bytearray.org/
大象當(dāng)時開發(fā)的時候采用的是0.1.4.9版本。AlivePDF給我們提供了一套模板化的導(dǎo)出方法,使用起來非常方便。
//canvas是id,這是獲得整個畫布內(nèi)容的快照,返回的是一個位圖
var bmp:BitmapData = ImageSnapshot.captureBitmapData(canvas);
var bitmap:Bitmap = new Bitmap(bmp); //將位圖轉(zhuǎn)換為顯示對象
/**
* 在創(chuàng)建PDF對象之前,設(shè)置Size對象的詳細(xì)參數(shù)
* 第一個參數(shù)是圖像大小數(shù)組(width,height),這里給它設(shè)定原始圖片大小
* 第二個參數(shù)是一個字符串,相當(dāng)于一個標(biāo)題名
* 第三個參數(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è)置其詳細(xì)參數(shù)
* 第一個參數(shù)是方向,LANDSCAPE是橫向,PORTRAIT是縱向
* 第二個參數(shù)是一個字符串,相當(dāng)于一個標(biāo)題名
* 第三個參數(shù)是單位,MM是毫米
* 第四個參數(shù)是Size對象
*/
var myPDF:PDF = new PDF(Orientation.LANDSCAPE, Unit.MM,autoSize);
myPDF.setDisplayMode(Display.FULL_PAGE); //顯示方式,設(shè)置為完全顯示
myPDF.addPage(); //加入到當(dāng)前頁面
myPDF.addImage(bitmap); //把要導(dǎo)出的顯示對象加入進(jìn)來
/**
* 生成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的步驟,是不是很簡單?官方例子中,是沒有實(shí)例化Size對象,并對它進(jìn)行參數(shù)設(shè)置的,而且使用的是固定設(shè)置,它有幾個預(yù)定義好的靜態(tài)構(gòu)造對象,可以直接使用。之所以這里要自己定義,是因?yàn)槲野l(fā)現(xiàn)如果采用預(yù)定義的設(shè)置,導(dǎo)出的圖像不清晰。我看過Size類的源碼,特別是第一個參數(shù),如果你準(zhǔn)備導(dǎo)出的尺寸不符合預(yù)定義設(shè)置的話,最好改成自己想要導(dǎo)出的對象尺寸,這樣效果要好一些,另外比較重要的就是第三和第四個參數(shù),一個是英寸一個是毫米。當(dāng)時我做的時候,將預(yù)定義中的值都換著試了遍,發(fā)現(xiàn)如果導(dǎo)出的圖像比較大,這兩組值設(shè)定的比較小的話,當(dāng)縮小看時,會很模糊。DOC文檔中寫的意思我沒看懂,翻譯過來就是說,這是為用戶更好的顯示不進(jìn)行尺寸計算。我估計這是表示在單位面積內(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
菠蘿大象 閱讀(6949)
評論(23) 編輯 收藏 所屬分類:
Flex