使用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

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

原文地址:https://www.cnblogs.com/wpy123/p/10089971.html

时间: 2024-11-09 23:31:37

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

ZeroMQ接口函数之 :zmq_connect - 由一个socket创建一个对外连接

ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_connect zmq_connect(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_connect - 由一个socket创建一个对外连接(outgoing connection) Synopsis int zmq_connect (void *socket, const char *endpoint); Description zmq_connect()函数将socket连接到节点

最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像

什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如何构建. 下面通过一个具体的例子来学习dockerfile的写法. 新建一个dbuild文件夹,创建一个自定义的Nginx首页,逻辑很简单,显示一个自定义的图片文件train.jpg. 我想基于标准的Nginx镜像做一些修改,让Nginx支持SSL.SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Tr

创建一个实例&amp;创建一个线程。。

1 using System; 2 using System.Threading; 3 4 5 namespace WorkerThread02 6 { 7 class ThreadTest 8 { 9 bool done; 10 static void Main() 11 { 12 ThreadTest tt=new ThreadTest();//创建一个类的实例 13 Thread t=new Thread(WriteY);//创建一个线程. 14 .............. 15 ...

【spring教程之中的一个】创建一个最简单的spring样例

1.首先spring的主要思想,就是依赖注入.简单来说.就是不须要手动new对象,而这些对象由spring容器统一进行管理. 2.样例结构 如上图所看到的,採用的是mavenproject. 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

不要点击一个功能就创建一个新的网页,要尽量少的新创建页面(例如:办事指南,点击一个部门创建一个网页,选择具体事项时,又创建一个网页,这样创建的网页太多)

就是这样,可以根据点击部门传值(部门id)到后台 来进行查询! // 获取后台根据区划配置显示的事项类型 20150228 zhangh if (BaseParameter.SERVICETYPE_REG_FLAG.equals(BaseParameter.YES)) { if (!Common.isNullOrSpace(areaId)) { System.out.println("进入"); hql.append(" and ((sb.serviceType in (se

【Head First Servlets and JSP】笔记7:如何创建一个全局的dog?

重定向与请求分派 “局部”参数——ServletConfig——servlet初始化参数 “全局”参数——ServletContext——上下文初始化参数 Web app的“构造器”——ServletContextListener 实战:如何创建一个全局的dog? 1.重定向与请求分派. resp.sendRedirect("http://www.cnblogs.com/xkxf/"); RequestDispatcher view = req.getRequestDispatcher

创建一个成功的App前要考虑的5个要点

在智能机时代,相比浏览网页而言,人们一般更喜欢喜欢使用手机应用.这种趋势就导致了成千上万的APP在Google Play 和 Apple Store 平台的诞生.有一些企业想要通过创建APP去提升他们的业务,其他人比如兄弟连学编程的学员也想要通过创建APP去获得收益. 移动应用的热潮激发人们都想要去开发一个自己的APP.你是不是也是其中一员呢? 你是不是想要创建一个APP但是却又不知道如何开始呢?如果是,兄弟连的小编整理的这篇文章可以指导你创建一个APP的流程. 1. 计划阶段 开始构建应用程序

用eclipse pydev 创建一个新py文件时 文件的coding设置问题

问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带一行#coding=utf-8 设置之后,再创建一个新的文件.文件的文件头会自带#coding=utf-8 待续 还有其他方法的朋友,欢迎交流.

【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】

iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了. 1.包的引用 1 import java.io.FileNotFoundException; 2 import java.i