天天看點

Android Itext調查文檔

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 也不能實作所有的報表功