1. 程式人生 > >PDF模板報表匯出(Java+Acrobat+itext)

PDF模板報表匯出(Java+Acrobat+itext)

1、 首先要安裝Adobe Acrobat,裝好之後用Acrobat從一個wordexcel或者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();
  }
 }
}