1. 程式人生 > >使用itext7簡單的生成一個pdf,建立一個pdf模板並進行填充

使用itext7簡單的生成一個pdf,建立一個pdf模板並進行填充

下面這段程式碼,是顯示中文字型的關鍵程式碼。如果之前學習使用itext 2*,5*和itextasian.jar.的,為了讓這段程式碼生效一定都遇到Font 'STSongStd-Light' with 'UniGB-UCS2-H' is not recognized這個異常,查了很多資料,也試過很多方法。

itext7 內建對中文(CJK字型)進行了支援,不在依賴其他元件。完美解決上述的異常。

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

 

使用itext7的maven依賴

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.0.7</version>
</dependency>

 

程式碼部分

package com.myitext.itextTest;
 
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map; import com.itextpdf.forms.PdfAcroForm; import com.itextpdf.forms.fields.PdfFormField; import com.itextpdf.forms.fields.PdfTextFormField; import com.itextpdf.kernel.color.Color; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import
com.itextpdf.kernel.geom.Rectangle; 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 com.itextpdf.layout.property.TextAlignment; /** * * @author Admin * */ public class ITextPdf7Test { /** *生成一個簡單的pdf檔案 * */ public static void createPdf(String filePath){ try { //處理中文問題 PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); PdfWriter writer = new PdfWriter(new FileOutputStream(new File(filePath))); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); Paragraph p =new Paragraph("hello word!我建立的第一個pdf檔案"); p.setFont(font); p.setFontSize(12); p.setBorder(new SolidBorder(Color.RED,0.5f));//邊框 p.setBackgroundColor(Color.GREEN);//綠色你懂的 document.add(p); document.close(); writer.close(); pdf.close();/** *生成一個簡單的模板pdf檔案 * */ public static void createTempPdf(String filePath){ try { PdfWriter writer = new PdfWriter(new FileOutputStream(new File(filePath))); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); addAcroForm(document); document.close(); writer.close(); pdf.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 新增一個簡單的模板 * @param doc * @throws IOException */ public static void addAcroForm(Document doc) throws IOException { PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); Paragraph title = new Paragraph("社會主義核心價值觀") .setTextAlignment(TextAlignment.CENTER) .setFontSize(16); title.setFont(font); doc.add(title); doc.add(new Paragraph("名稱:").setFont(font)); doc.add(new Paragraph(" 一:").setFont(font)); doc.add(new Paragraph(" 二:").setFont(font)); doc.add(new Paragraph(" 三:").setFont(font)); PdfAcroForm form = PdfAcroForm.getAcroForm(doc.getPdfDocument(), true); PdfTextFormField nameField = PdfTextFormField.createText(doc.getPdfDocument(), new Rectangle(99, 753, 425, 15), "名稱:", "");//填充座標 PdfTextFormField nameField1 = PdfTextFormField.createText(doc.getPdfDocument(), new Rectangle(50, 725, 425, 15), "一:", ""); PdfTextFormField nameField2 = PdfTextFormField.createText(doc.getPdfDocument(), new Rectangle(50, 695, 425, 15), "二:", ""); PdfTextFormField nameField3 = PdfTextFormField.createText(doc.getPdfDocument(), new Rectangle(50, 667, 425, 15), "三:", ""); form.addField(nameField); form.addField(nameField1); form.addField(nameField2); form.addField(nameField3); } /** * 使用pdf 模板生成 pdf 檔案 * */ public static void fillTemplate(String tempPdfPath,String targetPdfPath) {// 利用模板生成pdf try { //Initialize PDF document PdfDocument pdf = new PdfDocument(new PdfReader(tempPdfPath), new PdfWriter(targetPdfPath)); PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true); Map<String, PdfFormField> fields = form.getFormFields(); //處理中文問題 PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); String[] str = { "社會主義核心價值觀", "富強 民主 文明 和諧", "自由 平等 公正 法制", "愛國 敬業 誠信 友善" }; 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); } form.flattenFields();//設定表單域不可編輯 pdf.close(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } public static void main(String[] args) { createPdf("D:/firstPdf.pdf"); createTempPdf("D:/tempPdf.pdf"); fillTemplate("D:/tempPdf.pdf","D:/targetPdf.pdf"); } }

 

參考部落格:

https://blog.csdn.net/liuwenfeng554/article/details/52072164,

https://blog.csdn.net/u012397189/column/info/18037

希望能對大家有所所幫助。