前一段时间一个项目需要在Android手机上制作含有复杂表格的文档(吐槽:我国的表格应该是全世界最复杂的了,而老外的就简单的多),前前后后共花了一个多星期(word、excel、pdf都尝试过),搜索了很多博客和教程,做了很多次试验,总结了一些经验,在这里和大家分享一下。
需求
这个文档对字体和格式要求比较高,并且生成后的文档需求通过手机蓝牙连接蓝牙打印机进行打印,最好选择了生成PDF文档的方式,首先上一张效果图:
分析
- 搜索Java生成PDF文档,一般都推荐使用iText库。
- 搜索iText发现2个版本的jar包:com.lowagie.*与com.itextpdf.*,那么到底使用哪一个呢?
- 最后在stackoverflow上找到了两者的关系,原来iText是Lowagie创造的,之前的版本是用他的名字com.lowagie作为包名的,慢慢的大家忽略了他还是一个人,于是他就把包名给改成com.itextpdf了。参考Lowagie的回答:Lowagie is a passionate developer, and iText is his creation. Many people love Lowagie for the work he has done, but even more people don't care, and just take his work for granted. They don't even know he's a human being(http://lowagie.com/lowagie-itext)
- 扯了一会蛋,下面开始说说表格制作的事,在搜索到的博客中,这篇博客对我的帮助最大,可惜里面只有一张图,最后在自己的摸索中,对这张图也有了更多的理解。 http://www.cnblogs.com/xuqiang/archive/2011/01/02/1953343.html
下载itext
推荐使用Google搜索iText,iText目前最新版本是5.4.4,下载、解压,把itextpdf-5.4.4.jar加入你的项目,附上下载链接:
http://sourceforge.net/projects/itext/files/iText/
引用外部字体
你可以在windows系统C:WindowsFonts的目录中找到相应的字体,把你需要用到的字体拷贝到assets目录中,然后在应用中把assets中的ttf字体文件拷贝到SDCard中,FontUtil是我封装的工具类,使用该类,需要在manifest文件中添加写SDCard的权限:android.permission.WRITE_EXTERNAL_STORAGE
1 |
Font simfang12 = FontUtil.getFont(mContext, 12, "simfang.ttf");
|
创建PDF文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Font simfang12 = FontUtil.getFont(mContext, 12, "simfang.ttf");
Font simfang14 = FontUtil.getFont(mContext, 14, "simfang.ttf");
Font simfangBold14 = FontUtil.getFont(mContext, 14, "simfang.ttf",Font.BOLD, null);
Font simhei18 = FontUtil.getFont(mContext, 18, "simhei.ttf");
Document document = new Document(PageSize.A4, 30, 30, 20, 0);
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
// 标题
Paragraph titleParagraph = new Paragraph("我是十八号的黑体", simhei18);
titleParagraph.setAlignment(Element.ALIGN_CENTER);
document.add(titleParagraph);
// 编号
Chunk m1 = new Chunk("编号:", simfang12);
Chunk m2 = new Chunk("201309250001", simfang12);
Paragraph snoParagraph = new Paragraph();
snoParagraph.add(m1);
snoParagraph.add(m2);
snoParagraph.setAlignment(Element.ALIGN_RIGHT);
document.add(snoParagraph);
//内容
Paragraph contentParagraph = new Paragraph("我是使用了14号的仿宋字体",simfang14);
document.add(contentParagraph);
contentParagraph = new Paragraph("我是使用了14号加粗的仿宋字体",simfangBold14);
document.add(contentParagraph);
document.close();
|
阶段效果图: