天天看點

java-pdf-(itext+adobe acrobat+pdf模闆)生成pdf檔案

java-pdf-(itext+adobe acrobat+pdf模闆)生成pdf檔案

環境:

adobe acrobat :pdf 編輯器;

itext.jar : pdf 開發元件

1.制作 pdf 模闆方法

1.1 使用 word 随便畫一個 3*4 的表格,儲存為 pdf 格式,名稱為 pdf-template-form.pdf

1.2 打開 adobe acrobat 工具;(如果提示錯誤,右鍵選擇以管理者方式運作試試)

1.3 選擇 檔案=》建立=》建立表單;

1.4 選擇剛儲存的“pdf-template-form.pdf”檔案,并打開;

1.5 adobe acrobat 工具會在表格中自動填充一些“文本域”,預設已 “fill_” 開頭;

1.6 看到有 12 個 文本域,就說明模闆建立成功了,直接 ctrl+s 儲存下,關閉即可;

2.用 itext 填充文本域

2.1 中文不顯示問題:1>可以在編輯模闆時選擇一種中文字型;2>可以通過程式動态在填充前動态設定字型;

2.2 加入中文字型後文檔變的很大,模闆 200k,生成的檔案有 6M,有待解決;

添加 maven 依賴:

<!-- pdf 生成 ,通過  pdf 模闆-->
          <dependency>
          <groupId>com.lowagie</groupId>
          <artifactId>itext</artifactId>
          <version>2.1.7</version>
      </dependency>      

測試代碼:右鍵 run as -> junit test,運作 fillTemplate 方法

package com.demo.preview;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;


import org.junit.Test;


import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import me.grass.extend.DateExtend;
import me.grass.extend.PathExtend;
import me.grass.extend.StringExtend;


/**
 *
 * @author xxj
 */
public class ITextPdfTest {
  // 利用模闆生成pdf
  @Test
  public void fillTemplate() {
    // 模闆路徑
    String templatePath = "D:/Temp/pdf/pdf-template-form.pdf";
    // 生成的新檔案路徑
    String fileName = StringExtend.format("itext-template-{0}.pdf", DateExtend.getDate("yyyyMMddHHmmss"));
    String newPDFPath = PathExtend.Combine("D:/Temp/pdf/", fileName);


    PdfReader reader;
    FileOutputStream out;
    ByteArrayOutputStream bos;
    PdfStamper stamper;
    
    try {
      out = new FileOutputStream(newPDFPath);// 輸出流
      reader = new PdfReader(templatePath);// 讀取pdf模闆
      bos = new ByteArrayOutputStream();
      stamper = new PdfStamper(reader, bos);
      AcroFields form = stamper.getAcroFields();


      //字型,使用本機的宋體
      String font_cn = getChineseFont();
      BaseFont bf = BaseFont.createFont(font_cn+",1", //注意這裡有一個,1
           BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);


      String[] str = {
          "01.hello word!", 
          "02.你好,世界!",
          "03.hello word!", 
          "04.你好,世界!",
          "05.hello word!", 
          "06.你好,世界!",
          "07.hello word!", 
          "08.你好,世界!",
          "09.hello word!", 
          "10.你好,世界!",
          "11.hello word!", 
          "12.你好,世界!", };
      int i = 0;
      java.util.Iterator<String> it = form.getFields().keySet().iterator();
      while (it.hasNext()) {
        //擷取文本域名稱
        String name = it.next().toString();
        //設定文本域字型
        form.setFieldProperty(name,"textfont",bf,null);
        System.out.println(name);
        //設定文本域内容
        form.setField(name, str[i++]);
      }      
      stamper.setFormFlattening(true);// 如果為false那麼生成的PDF檔案還能編輯,一定要設為true
      stamper.close();


      Document doc = new Document();
      PdfCopy copy = new PdfCopy(doc, out);
      doc.open();
      PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
      copy.addPage(importPage);
      doc.close();


    } catch (IOException e) {
      e.printStackTrace();
    } catch (DocumentException e) {
      e.printStackTrace();
    } catch (Exception e){
      e.printStackTrace();
    }


  }
  /**
   * 擷取中文字型位置
   * @return
   *  @author xxj 2017年4月28日
   */
  private String getChineseFont(){


    //宋體(對應css中的 屬性 font-family: SimSun; /*宋體*/)
    String font1 ="C:/Windows/Fonts/simsun.ttc";


    //判斷系統類型,加載字型檔案
    java.util.Properties prop = System.getProperties();
    String osName = prop.getProperty("os.name").toLowerCase();
    System.out.println(osName);
    if (osName.indexOf("linux")>-1) {
      font1="/usr/share/fonts/simsun.ttc";
    }
    if(!new File(font1).exists()){
      throw new RuntimeException("字型檔案不存在,影響導出pdf中文顯示!"+font1);
    }
    return font1;
  }
}