天天看點

java-pdf-itext7、itextpdf 生成pdf 文檔,使用pdf模闆生成(支援中文字型)

java-pdf-itext7、itextpdf 生成pdf 文檔,使用pdf模闆生成(支援中文字型)

itext7 内置對中文(CJK字型)進行了支援,不在依賴其他元件。

//進行中文問題  

PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); 

一、iText 7 資料:

官網:http://developers.itextpdf.com/

官網示例:http://developers.itextpdf.com/content/itext-7-jump-start-tutorial/examples

二、itext7 maven 依賴

<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itext7-core</artifactId>
  <version>7.0.2</version>
  <type>pom</type>
</dependency>      

三、生成pdf 和使用pdf模闆生成pdf 的方法

pdf模闆需要使用:Adobe Acrobat DC 進行表單制作

package com.demo.preview;


import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;


import org.junit.Test;


import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.SolidBorder;
import com.itextpdf.layout.element.Paragraph;


import me.grass.extend.DateExtend;
import me.grass.extend.PathExtend;
import me.grass.extend.StringExtend;


/**
 *
 * @author xxj
 */
public class ITextPdf7Test {
  /**
   * 生成一個簡單的pdf檔案
   * 
   */
  @Test
  public void createPdf(){
    // 生成的新檔案路徑
    String fileName = StringExtend.format("itext-pdf-{0}.pdf", DateExtend.getDate("yyyyMMddHHmmss"));
    String newPDFPath = PathExtend.Combine("D:/Temp/pdf/", fileName);
  
    try {  


      //進行中文問題  
      PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);  
      
      PdfWriter writer = new PdfWriter(new FileOutputStream(newPDFPath));
      //Initialize PDF document  
          PdfDocument pdf = new PdfDocument(writer);    
          Document document = new Document(pdf);
          
          Paragraph p =new Paragraph("你好,世界!hello word!");
          p.setFont(font);
          p.setFontSize(12);
          p.setBorder(new SolidBorder(Color.BLACK,0.5f));
      document.add(p);      
      
      document.close();
      writer.close();
      pdf.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * 使用pdf 模闆生成 pdf 檔案
   *    */
  @Test
  public void fillTemplate() {// 利用模闆生成pdf
    // 模闆路徑
    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);


    try {
          //Initialize PDF document
          PdfDocument pdf = new PdfDocument(new PdfReader(templatePath), new PdfWriter(newPDFPath));
          PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
          Map<String, PdfFormField> fields = form.getFormFields();
          
      //進行中文問題  
      PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);  
      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 = fields.keySet().iterator();
      while (it.hasNext()) {
        //擷取文本域名稱
        String name = it.next().toString();
        //填充文本域
        fields.get(name).setValue(str[i++]).setFont(font).setFontSize(12);
        System.out.println(name);
      }  
      form.flattenFields();//設定表單域不可編輯     
      pdf.close();


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


  }
}