AlivePDF是一個(gè)用ActionScript 3寫的開(kāi)源PDF開(kāi)發(fā)包。它有很全的文檔和示例資料,很容易上手和學(xué)習(xí)。現(xiàn)在已經(jīng)發(fā)布
官方網(wǎng)站:http://alivepdf.bytearray.org/
大象當(dāng)時(shí)開(kāi)發(fā)的時(shí)候采用的是
//canvas是id,這是獲得整個(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)知道的朋友幫忙指正一下。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");
服務(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配置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導(dǎo)出PDF文件講完了,如果有什么不清楚的,或是我說(shuō)的不對(duì)的地方,請(qǐng)大家提出來(lái)。謝謝。<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>
本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。