zoukankan      html  css  js  c++  java
  • PDF模板报表导出(Java+Acrobat+itext)

    1、 首先要安装Adobe Acrobat,装好之后用Acrobat从一个word,excel或者pdf中转换一个pdf模板,我做的模板很简单,直接写一个简单的word再生成一个pdf表单,之后编辑文本域的名字属性等,根据名字在Java中导入。下图是Acrobat10打开的,每个文本域都有一个名字,在Java中根据名字(xh、xm等)添表格,(文本域的字体设置成kozuka Mincho,能接受汉字导入)。

    2、文件准备(附近查看我的下载资源)

    (1)向java工程导入两个包 iText.jar(我用的5.0.6版本),iTextAsian.jar(汉字支持包)

    (2)把“学生信息模板.pdf”和“图片.jpg”放到D盘跟 目录下

    3、 Java代码

    代码从网上一个大神那看到只改动了一点- -

    注意主类中有四个方法,未注释的哪个就是PDF模板导出,其他三个测试方法写的也非常好。

     多看看注释

    注意改文件名,包名

    package org.test;
    import java.io.ByteArrayOutputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Iterator;
    import java.util.List;
    import com.itextpdf.text.Chunk;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.FontFactory;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.Paragraph;
    import com.itextpdf.text.html.simpleparser.HTMLWorker;
    import com.itextpdf.text.html.simpleparser.StyleSheet;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    import com.itextpdf.text.pdf.PdfWriter;
    public class sss {
     // http://prdownloads.sourceforge.net/itext/iTextAsian.jar
     public static void main(String[] args) {
       //createPDFWithChinese();
      //createPdf();
      fromPDFTempletToPdfWithValue();
      // fromHtmlToPdf();
     }
     /**
      * 根据pdf模板填充相应的值: 1,如果是根据excel填充的话,在用Acrobat生成PDF模板前,
      * Excel单元格格式最好设置成文本,否则pdf填充值时可能中文无法显示
      */
     public static void fromPDFTempletToPdfWithValue() {
      String fileName = "d:\学生信息模板.pdf"; // 
      try {
       PdfReader reader = new PdfReader(fileName);
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       PdfStamper ps = new PdfStamper(reader, bos);
       /**
        * 使用中文字体 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了
        */
       BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
         BaseFont.NOT_EMBEDDED);
       Font font = new Font(bf, 12, Font.NORMAL);
       AcroFields s = ps.getAcroFields();
       System.out.println("s: " + s);
       System.out.println("AcroFields: " + s.getFields());
       System.out.println("AcroFields.class: " + s.getFields().getClass());
       System.out.println("getSignatureNames: " + s.getSignatureNames());
       System.out.println("getSignatureNames: " + s.getTotalRevisions());
       System.out.println("s: " + s.getBlankSignatureNames());
       System.out.println("s: " + s.getFieldCache());
       System.out.println("s: " + s.getSubstitutionFonts());
       /*
        * int i = 1; for (Iterator it = s.getFields().keySet().iterator();
        * it.hasNext(); i++) { String name = (String) it.next(); String
        * value = s.getField(name); System.out.println("[" + i + "- name:" +
        * name + ", value: "+value+"]"); s.setField(""+name.trim(),
        * "aaa一二三"); }
        * 
        * s.setField("Text1", "NOHI"); s.setField("Text2", "2011-04-05");//
        * 注意pdf中域的大小,这里设置的值太长,pdf中会显示不全
        */
       // 设置为true/false在点击生成的pdf文档的填充域时有区别,
       
       s.setField("xh", "201001");
       s.setField("xm", "姓名");
       s.setField("xb", "男");
       s.setField("cssj", "1989-02-15");
       s.setField("zy_id", "001");
       s.setField("zxf", "123");
       s.setField("bz", "三好学生"); 
       
       //Document document = new Document();
       //document.open();
       Image gif = Image.getInstance("d:\图片.jpg");
       gif.setDpi(100, 100);
       gif.setBorderWidth(200);
       gif.scaleAbsolute(80, 100); 
       gif.setAbsolutePosition(400, 700);
       PdfContentByte over = ps.getOverContent(1);
       over.addImage(gif);
       
       ps.setFormFlattening(true);
       ps.close();
       FileOutputStream fos = new FileOutputStream("d:\学生信息导出.pdf");
       fos.write(bos.toByteArray());
      } catch (FileNotFoundException e) {
       e.printStackTrace();
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       // doc.close();
      }
     }
     /**
      * 创建pdf
      */
     public static void createPdf() {
      Document doc = null;
      try {
       doc = new Document();
       PdfWriter.getInstance(doc, new FileOutputStream("d:\itext.pdf"));
       doc.open();
       BaseFont bfChi = BaseFont.createFont("STSong-Light",
         "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
       Font fontChi = new Font(bfChi, 12, Font.NORMAL);
       doc.add(new Paragraph(
         "Hello World,看看中文支持不........aaaaaaaaaaaaaaaaa", fontChi));
      } catch (FileNotFoundException e) {
       e.printStackTrace();
      } catch (DocumentException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } finally {
       doc.close();
      }
     }
     /**
      * 生成一个PDF,with图片
      */
     public static void createPDFWithChinese() {
      System.out.println("createPDFWithChinese...........");
      try {
       // 1.建立Document实例
       Document document = new Document();
       // 2.建立一个书写器与Document对象关联,通过书写器将文档写入磁盘
       PdfWriter.getInstance(document,
         new FileOutputStream("D:\test.pdf"));
       // 3.打开文档
       document.open();
       // 4.向文档中添加内容
       // a)添加一个图片
       Image gif = Image.getInstance("d:\pdf.BMP");
       
       System.out.println("gif" + gif);
       gif.setDpi(100, 100);
       gif.setBorderWidth(200);
       gif.scaleAbsoluteHeight(100);
       gif.scaleAbsoluteWidth(80);
       document.add(gif);
       // b)添加一个段落
       document.add(new Paragraph("iText HelloWorld"));
       // c)添加一个块
       document.add(new Chunk("Text is underline", FontFactory.getFont(
         FontFactory.HELVETICA_BOLD, 12, Font.UNDERLINE)));
       // d)添加中文,需要引入iTextAsian.jar
       // BaseFont bfChi = BaseFont.createFont("STSong-Light",
       // "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
       BaseFont bfChi = BaseFont.createFont("STSong-Light",
         "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
       Font fontChi = new Font(bfChi, 12, Font.NORMAL);
       document.add(new Paragraph("中文测试", fontChi));
       // e)添加一个表格
       // 表格内部格式和html中的格式差不多
       PdfPTable table = new PdfPTable(4);
       table.setWidthPercentage(100);
       table.setWidthPercentage(100);
       table.addCell(new Paragraph("学号", fontChi));
       PdfPCell cell = new PdfPCell(new Paragraph("00000001", fontChi));
       cell.setColspan(3);
       table.addCell(cell);
       table.addCell(new Paragraph("姓名", fontChi));
       table.addCell(new Paragraph("张三", fontChi));
       table.addCell(new Paragraph("总成绩", fontChi));
       table.addCell(new Paragraph("160", fontChi));
       table.addCell(new Paragraph("学号", fontChi));
       PdfPCell cell2 = new PdfPCell(new Paragraph("00000002", fontChi));
       cell2.setColspan(3);
       table.addCell(cell2);
       table.addCell(new Paragraph("姓名", fontChi));
       table.addCell(new Paragraph("李四", fontChi));
       table.addCell(new Paragraph("总成绩", fontChi));
       table.addCell(new Paragraph("167", fontChi));
       document.add(table);
       // 5.关闭文档
       document.close();
      } catch (FileNotFoundException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (DocumentException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (MalformedURLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     /**
      * 根据html生成pdf没有试过,不知道行不
      */
     public static void fromHtmlToPdf() {
      try {
       Document document = new Document();
       StyleSheet st = new StyleSheet();
       st.loadTagStyle("body", "leading", "16,0");
       PdfWriter.getInstance(document, new FileOutputStream(
         "d:\html2.pdf"));
       document.open();
       List<Element> p = HTMLWorker.parseToList(new FileReader(
         "d:\to_pdf.htm"), st);
       for (int k = 0; k < p.size(); ++k)
        document.add((Element) p.get(k));
       document.close();
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
    }

  • 相关阅读:
    python练习:正则表达式
    python练习:字典value值排序,key值排序
    python练习:字符串中的数字排序
    python练习:计算出字符串中每个字符出现的次数
    Jmeter3.1、Ant、Jenkins接口自动化平台配置
    Jmeter3.1、Ant、Jenkins接口自动化平台搭建步骤;所遇问题及解决方案
    Jmeter:实例(测试报告)
    Jmeter:实例(测试指标)
    Python with as 用法
    Python-报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence
  • 原文地址:https://www.cnblogs.com/exmyth/p/4988331.html
Copyright © 2011-2022 走看看