AlivePDF是一個用ActionScript 3寫的開源PDF開發包。它有很全的文檔和示例資料,很容易上手和學習。現在已經發布
官方網站:http://alivepdf.bytearray.org/
大象當時開發的時候采用的是
//canvas是id,這是獲得整個畫布內容的快照,返回的是一個位圖
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文檔中寫的意思我沒看懂,翻譯過來就是說,這是為用戶更好的顯示不進行尺寸計算。我估計這是表示在單位面積內的像素數,不知道這樣理解對不對,如果有誤,請知道的朋友幫忙指正一下。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");
服務器端使用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配置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");
}
}
<servlet>
<servlet-name>createPDF</servlet-name>
<servlet-class>com.bolo.common.CreatePDF</servlet-class>
OK,使用AlivePDF導出PDF文件講完了,如果有什么不清楚的,或是我說的不對的地方,請大家提出來。謝謝。<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>
本文為菠蘿大象原創,如要轉載請注明出處。