l 萬惡的HelloWord
1. 配置AndroidManifest.xml檔案,容許通路SD卡
2. 下載下傳droidText.jar,并且将Jar放入Android Project的Libs目錄,并且設定ClassPath(設定依賴外部Jar和普通的Java項目一樣設定)
3. 建立Document
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
4. 建立PDFWriter
PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+ java.io.File.separator + "droidtext" + java.io.File.separator + "hellowd.pdf"));
5. 打開Document
document.open();
6. 建立Paragraph
Paragraph text = new Paragraph("HelloWorld");
7. 将paragraph加入daoDocument
document.add(text);
8. 關閉Document
document.close();
代碼如下:
生成的PDF檔案:
l 關于建立新的一頁PDF
說明:關于建立新的一頁,IText提供二種方式,一種是本頁無法顯示所有的内容,IText會自動建立一頁,還有一種是手動建立一個新的一頁。
收到建立的代碼如下:
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter writer = PdfWriter.getInstance(document, newFileOutputStream(android.os.Environment.getExternalStorageDirectory() +java.io.File.separator + "droidtext" + java.io.File.separator + "newPage.pdf"));
document.open();
document.add(new Paragraph("This is anew page"));
document.newPage();
document.add(new Paragraph("This is anew page"));
document.newPage();
document.add(new Paragraph("This is anew page"));
document.close();
l PDF的Header和Footer,對于PDF報表在Java項目中可以使用IReport畫出PDF的Header和Footer,在IText中也可以使用代碼完成我們的Header和Footer
1. 建立PdfPageEventHelper的子類
public class EndPage extends PdfPageEventHelper
備注:PdfPageEventHelper是幫助實作所有接口方法的使用PdfPageEvent,
一個類可以擴充PdfPageEventHelper的,隻是實作了所需要的方法.
2. 建立Document
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
3. 建立PDFWriter
PdfWriter writer = PdfWriter.getInstance(document, newFileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + "droidtext" + java.io.File.separator + "headAndFooter.pdf"));
4. 打開Document
document.open();
5. 設定PageEvent
writer.setPageEvent(new EndPage());
6. 報表中寫入内容
String text = "Lots of text. ";
document.add(new Paragraph(text));
//new page
document.newPage();
document.add(new Paragraph("newPage"));
7. 關閉Document
document.close();
參考代碼:
class EndPage extends PdfPageEventHelper{
@Override
publicvoid onEndPage(PdfWriter writer, Document document) {
try {
Rectangle page = document.getPageSize();
PdfPTable head = new PdfPTable(1);
PdfPCell cell;
cell = new PdfPCell(new Paragraph("YuhuaHopeRun Software Outsourcing Park"));
cell.setBorder(0);
head.addCell(cell);
head.setTotalWidth(page.getWidth() - document.leftMargin() -document.rightMargin());
head.writeSelectedRows(0,-1, document.leftMargin(), page.getHeight() - document.topMargin()+head.getTotalHeight(), writer.getDirectContent());
PdfPTable foot = new PdfPTable(1);
PdfPCell footerCellell;
footerCellell = new PdfPCell(new Paragraph("page:"+document.getPageNumber()));
footerCellell.setBorder(0);
foot.addCell(footerCellell);
foot.setTotalWidth(page.getWidth() - document.leftMargin() -document.rightMargin());
foot.writeSelectedRows(0, -1, document.leftMargin(),document.bottomMargin(), writer.getDirectContent());
} catch (Exception e) {
thrownew ExceptionConverter(e);
}
}
}
Document document = new Document(PageSize.A4, 80, 50, 30, 65);
try {
PdfWriter writer = PdfWriter.getInstance(document, newFileOutputStream(android.os.Environment.getExternalStorageDirectory() +java.io.File.separator + "droidtext" + java.io.File.separator + "headerFooter.pdf"));
document.open();
writer.setPageEvent(new EndPage());
String text = "Lots oftext. ";
document.add(new Paragraph(text));
document.newPage();
document.add(new Paragraph("newPage"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
document.close();
}
效果圖:
l 萬惡的中日文亂碼
IText對中日文支援并不是很好,隻能使用Unicode字元實作.
生成的PDF效果圖
l 使用Html模闆檔案生成PDF檔案
1. 建立HTML模闆檔案,将Html檔案放在SD卡中
2. 建立Document
3. 建立PDFWriter
4. 打開Document(以上三步請參考Helloword裡面)
5. 讀取Html,傳回成Itext中的Tag
StyleSheet st = new StyleSheet();
FileReader fileReader = new FileReader(android.os.Environment.getExternalStorageDirectory()+java.io.File.separator + "droidtext"+java.io.File.separator +"html.html");
ArrayList list = HTMLWorker.parseToList(fileReader, st);
6. 将Html Tag添加到Document中
for (int k = 0; k <list.size(); ++k) {
Element element = (Element) list.get(k);
document.add(element);
}
7. 關閉Document
效果圖如下:
參考代碼如下:
Document document = new Document(PageSize.A4, 50, 50, 70, 70);
try {
PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+ java.io.File.separator + "droidtext" + java.io.File.separator + "html.pdf"));
document.open();
StyleSheet st = new StyleSheet();
FileReader fileReader = new FileReader(android.os.Environment.getExternalStorageDirectory()+java.io.File.separator + "droidtext"+java.io.File.separator +"html.html");
ArrayList list = HTMLWorker.parseToList(fileReader,st);
for (int k = 0; k < list.size(); ++k) {
Element element = (Element) list.get(k);
document.add(element);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
document.close();
}
備注說明:
1. 如果使用Html作為IText模闆檔案,在Java中可以使用Freemarker,綁定資料,但是Freemarker不支援android,是否自己編寫綁定資料插件
2. 關于報表的頁頭和頁腳還是需要編寫代碼完成,無法使用Html,但是可以使用共通代碼實作
3. IText對于Html的Css不支援,并且對于Tag中的屬性也不是全部支援,在Java中有第三方開源檔案支援,我們是不是也需要重寫第三方開源代碼
4. 定位問題,最好不使用Div,因為PDF是按照A4紙等方式設定PDF内容所占的位置,DIV定位就不适合PDF,最好使用Table定位
5. Table的單元格寬度設定:
5.1. 表格上列的寬度無法由第一行的各個 <td> 的寬度來決定,舉個例子就是,假如某個表格,第一行各列<td>設定了寬度,但是後面的<td> 未設定寬度,在網頁上是可以由第一行的列寬來配置設定。
5.2. 表格必須指定 width 屬性,否則基本寬度視為 0,不能顯示.
6. 特殊報表估計還是需要使用代碼實作.
l 其他說明
1. 關于使用Eclipse使用Android ADT使用Itext Jar時候會出現記憶體不足情況,請修改eclise.ini配置檔案
2. 關于Html模闆的使用
在讀取Html的時候,IText會預設将Html Tag轉化為Itext中的Tag,如果需要特殊處理,可以在添加到Document之前進行處理
3. IText在做資料報表時候使用到的類不是很多,通常使用到的有Document,PdfWriter,PdfPTable,StyleSheet,HTMLWorker,Element,Paragraph,PdfContentByte等常用類
l 個人建議
在沒有很好的畫出很好的PDF模闆檔案的IDE的時候,盡量不要使用Html檔案作為模闆檔案。原因如下:
1. 使用Html檔案操作步驟過多
1.1.1 從伺服器接受到所有的資料(任何模式都需要)
1.1.2 讀取Html模闆檔案
1.1.3 生成Html資料模闆檔案
1.1.4 讀取Html資料模闆檔案
1.1.5 生成PDF檔案
說明:以上讀取生成HTML檔案,如果資料量過大的話可能出現記憶體異常
2. 即使使用Dreamweaver編寫html,但是由于Html的Css不支援和隻支援部分屬性導緻生成的HTML效果和生成PDF效果不同
Html 也不能實作所有的報表功