天天看点

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 也不能实现所有的报表功