几种使用itext生成pdf的方式

来源:互联网 发布:wap积分兑换商城源码 编辑:程序博客网 时间:2024/06/09 00:44

来源:http://blog.csdn.net/tanqian351/article/details/51192190

最近做了一个功能,生成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, 
很容易调整布局,代码如下:

//横向放置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();
  • 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
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

     第二种方法:用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();    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

第三种方法: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();  
原创粉丝点击