几种使用itext生成pdf的方式
2016-04-19 17:08
597 查看
最近做了一个功能,生成pdf报销单、并在前台页面可供下载,报销单有各种文字和图片,
还有动态生成的条形码图片。
这个功能粗略的解析下,1.页面排版布局;2.生成pdf技术;3.图片如何加载。
ok,开始动工,网上搜了下,itext还是比较成熟的生成pdf的技术,就使用itext了。
使用的jar包:iText-5.0.6.jar,iTextAsian.jar,core-renderer.jar,
jar包建议都使用最新版本的,不然各种坑。
总的来说,用iText生成PDF文档需要5个步骤:
①建立Document对象的实例。
Document document = new Document();
②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PDFWriter.getInstance(document, new FileOutputStream(“D:\Helloworld.PDF”));
③打开文档。
document.open();
④向文档中添加内容。
document.add(new Paragraph(“Hello World”));
⑤关闭文档。
document.close();
通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为”Hello World”。
通过下面的代码就可以在文档中使用中文了,字体大小和粗细可以调整Font()方法中的12和Font.NORMAL,
切记:Font不是AWT.Font,是我们jar包中的
BaseFont bfChinese = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
Paragraph pragraph=new Paragraph(“你好”, FontChinese);
第一种方法:用itext自己布局加元素生成pdf
这样是最简单最直接的,至于排版,一个不错的建议,就是一切排版都用table,内容都用Paragraph,
很容易调整布局,代码如下:
第三种方法:java动态构建html,然后用itext把html转成pdf
个人觉得这种很强大,不过itext对css和html标签的支持还有待提高
还有动态生成的条形码图片。
这个功能粗略的解析下,1.页面排版布局;2.生成pdf技术;3.图片如何加载。
ok,开始动工,网上搜了下,itext还是比较成熟的生成pdf的技术,就使用itext了。
使用的jar包:iText-5.0.6.jar,iTextAsian.jar,core-renderer.jar,
jar包建议都使用最新版本的,不然各种坑。
总的来说,用iText生成PDF文档需要5个步骤:
①建立Document对象的实例。
Document document = new Document();
②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PDFWriter.getInstance(document, new FileOutputStream(“D:\Helloworld.PDF”));
③打开文档。
document.open();
④向文档中添加内容。
document.add(new Paragraph(“Hello World”));
⑤关闭文档。
document.close();
通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为”Hello World”。
中文支持:
通过下面的代码就可以在文档中使用中文了,字体大小和粗细可以调整Font()方法中的12和Font.NORMAL,
切记:Font不是AWT.Font,是我们jar包中的
BaseFont bfChinese = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
Paragraph pragraph=new Paragraph(“你好”, FontChinese);
第一种方法:用itext自己布局加元素生成pdf
这样是最简单最直接的,至于排版,一个不错的建议,就是一切排版都用table,内容都用Paragraph,
很容易调整布局,代码如下:
//横向放置pdf Document document = new Document(PageSize.A4.rotate()); PdfWriter.getInstance(document, response.getOutputStream()); document.open(); //设置字体 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); com.itextpdf.text.Font FontChinese20 = new com.itextpdf.text.Font(bfChinese, 20, com.itextpdf.text.Font.BOLD); com.itextpdf.text.Font FontChinese18 = new com.itextpdf.text.Font(bfChinese, 18, com.itextpdf.text.Font.BOLD); com.itextpdf.text.Font FontChinese16 = new com.itextpdf.text.Font(bfChinese, 16, com.itextpdf.text.Font.BOLD); com.itextpdf.text.Font FontChinese12 = new com.itextpdf.text.Font(bfChinese, 12, com.itextpdf.text.Font.NORMAL); com.itextpdf.text.Font FontChinese11Bold = new com.itextpdf.text.Font(bfChinese, 11, com.itextpdf.text.Font.BOLD); com.itextpdf.text.Font FontChinese9 = new com.itextpdf.text.Font(bfChinese, 9, com.itextpdf.text.Font.ITALIC); com.itextpdf.text.Font FontChinese9Normal = new com.itextpdf.text.Font(bfChinese, 9, com.itextpdf.text.Font.NORMAL); //table1 PdfPTable table1 = new PdfPTable(3); PdfPCell cell11 = new PdfPCell(new Paragraph("大家好",FontChinese20)); //垂直居中 cell11.setVerticalAlignment(Element.ALIGN_MIDDLE); //水平居中 cell11.setHorizontalAlignment(Element.ALIGN_CENTER); //去掉边框 cell11.setBorder(0); Image image1 = Image.getInstance("d:/xxx1.jpg"); Image image2 = Image.getInstance("d:/xxx2.jpg"); //设置每列宽度比例 int width11[] = {35,40,25}; table1.setWidths(width11); table1.getDefaultCell().setBorder(0); table1.addCell(image1); table1.addCell(cell11); table1.addCell(image2); //把table加入document document.add(table1); //加入空行 Paragraph blankRow1 = new Paragraph(18f, " ", FontChinese18); document.add(blankRow1); //可以继续增加其他table和空行来布局,很好编辑 document.close();
第二种方法:用itext把html文件转成pdf
String inputFile = "D:/xxx.html"; String url = new File(inputFile).toURI().toURL().toString(); OutputStream os = new FileOutputStream("D/xxx.pdf"); ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(url); // 解决中文支持问题,这个是系统自带的字体 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); // 解决图片的相对路径问题,要加载的图片在html中 //<img src='D:/xxxx.jpg'/> renderer.getSharedContext().setBaseURL("file:/D:"); renderer.layout(); renderer.createPDF(os); os.close();
第三种方法:java动态构建html,然后用itext把html转成pdf
个人觉得这种很强大,不过itext对css和html标签的支持还有待提高
// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误 html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">"). append("<head>") .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />") .append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>") .append("</head>") .append("<body>"); html.append("<div>support chinese!支持中文!</div>"); html.append("<div> <img src=\"alibaba.jpg\" alt=\"\" /> </div>"); html.append("</body></html>"); String outputFile = "D:/htmlToPdf2.pdf"; OutputStream os = new FileOutputStream(outputFile); ITextRenderer renderer = new ITextRenderer(); ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); renderer.setDocumentFromString(html.toString()); // 解决图片的相对路径问题 renderer.getSharedContext().setBaseURL("file:D:/"); renderer.layout(); renderer.createPDF(os); System.out.println("======转换成功!"); os.close();
相关文章推荐
- 27. Remove Element
- 一个最不可思议的MySQL死锁分析
- arm neon 优化原理
- 【转】程序包com.sun.image.codec.jpeg不存在 问题的完美解决
- Linux电源管理(4)_Power Management Interface
- OC基础----数组排序(OC)
- JAVA虚拟机之四:G1垃圾收集器
- Linux下使用popen()执行shell命令
- JS获取时间段内的工作时长
- 图像预处理第9步:存为.bmp文件
- 工程师离不开的那些电路设计工具 干货get√
- Eclipse 出现的问题总结
- java 对redis 的基本操作
- 用python进行科学统计及数据挖掘--便捷工具环境搭建
- php日记——获取当天产生的数据(比较日期)
- Android adb 命令
- NPOI使用手册
- warning C4819 解决方案 warning C4819: The file contains a character that cannot be represented in the cu
- Bundle研究
- 关于JAVA取本机ip的一些传说