使用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高级教程之html2pdf——3.基于媒体查询生成PDF
iText7高级教程之html2pdf——3.基于媒体查询生成PDF
iText7 & C# 从存储在 MSSQL DB 中的 PDF 中提取页面