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