使用itext7简单的生成一个pdf,创建一个pdf模板并进行填充

Posted 一页书丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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

希望能对大家有所所帮助。

 

以上是关于使用itext7简单的生成一个pdf,创建一个pdf模板并进行填充的主要内容,如果未能解决你的问题,请参考以下文章

新手如何使用itext7生成pdf盖章

iText7高级教程之html2pdf——3.基于媒体查询生成PDF

iText7高级教程之html2pdf——3.基于媒体查询生成PDF

iText7 & C# 从存储在 MSSQL DB 中的 PDF 中提取页面

无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上放置印章(显示倒置印章)

pdf格式在itext7中为空