Java生成荣誉证书PDF文件
版权声明:本文为博主原创文章,转载请表明出处。如果您觉得文章还行就点个赞,同时也可以关注一下我哈。 https://blog.csdn.net/ljk126wy/article/details/84299373
公司最近新需求要针对已经学完课程的同学提供下载结业证书,我们开发小组通过内部协商最终采用pdf方式让用户进行下载。操作pdf java 一般都是通过itext来实现,由于之前没有使用itext生成pdf,就去百度搜索先关信息。大部分都是通过pdf模板进行生成证书相关信息。找到一篇写的还不错的技术博客Java根据pdf模板生成荣誉证书PDF文件。先是通过word编辑好模板 然后再通过Acrobat Reader DC 来设置动态表单,之后的操作作者也提供了源码。本来想在本地跑一下看看效果如何,无奈我本地Acrobat Reader DC软件点击准备表单是如下图所示。
看到上图的信息我心中各种MMP, 但是这个并没有阻止我继续研究的决心!于是决定换种思路,既然模板不行那就将证书的图片当成pdf的背景图 然后再根据坐标点在背景图上添加内容。功夫不负有心人最终被我搞定特此分享一下。
同时我这里借用Java根据pdf模板生成荣誉证书PDF文件 作者zout邹涛的源码中的图片进行操作还望作者尽情谅解。最终效果图如下:
模板图片:
通过代码生成pdf效果:
实现代码:
这个是生成中文内容中字体的样式封装类
-
package cn.zhuoqianmingyue;
-
-
import com.itextpdf.text.BaseColor;
-
import com.itextpdf.text.Element;
-
import com.itextpdf.text.Font;
-
-
public class ContentStyle {
-
-
private String TTFPath = "C:/WINDOWS/Fonts/SIMYOU.TTF";// 字体类型
-
private float fontSize = 12;//字体大小
-
private BaseColor baseColor = new BaseColor(0, 0, 0);//默认是黑色
-
private int style = Font.NORMAL;//字体样式
-
private int alignment = Element.ALIGN_LEFT;
-
-
public String getTTFPath() {
-
return TTFPath;
-
}
-
public void setTTFPath(String tTFPath) {
-
TTFPath = tTFPath;
-
}
-
public float getFontSize() {
-
return fontSize;
-
}
-
public void setFontSize(float fontSize) {
-
this.fontSize = fontSize;
-
}
-
public BaseColor getBaseColor() {
-
return baseColor;
-
}
-
public void setBaseColor(BaseColor baseColor) {
-
this.baseColor = baseColor;
-
}
-
public int getStyle() {
-
return style;
-
}
-
public void setStyle(int style) {
-
this.style = style;
-
}
-
public int getAlignment() {
-
return alignment;
-
}
-
public void setAlignment(int alignment) {
-
this.alignment = alignment;
-
}
-
}
生产证书pdf 文件工具类
-
package cn.zhuoqianmingyue;
-
-
import java.io.FileNotFoundException;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.net.MalformedURLException;
-
import java.util.Date;
-
-
import com.itextpdf.text.Document;
-
import com.itextpdf.text.DocumentException;
-
import com.itextpdf.text.Font;
-
import com.itextpdf.text.Image;
-
import com.itextpdf.text.PageSize;
-
import com.itextpdf.text.Phrase;
-
import com.itextpdf.text.pdf.BaseFont;
-
import com.itextpdf.text.pdf.ColumnText;
-
import com.itextpdf.text.pdf.PdfContentByte;
-
import com.itextpdf.text.pdf.PdfWriter;
-
-
public class PDFUtil {
-
-
private Document document;
-
private PdfWriter writer;
-
-
public void setDocument(Document document) {
-
this.document = document;
-
}
-
-
public void setWriter(PdfWriter writer) {
-
this.writer = writer;
-
}
-
/**
-
* 开启创建PDF对象
-
* @param pafPath : 生成pdf的磁盘路径
-
* @return
-
* @throws FileNotFoundException
-
* @throws DocumentException
-
*/
-
public PDFUtil openDocumnet(String pafPath) throws FileNotFoundException, DocumentException{
-
Document document = new Document(PageSize.A4);
-
writer = PdfWriter.getInstance(document,new FileOutputStream(pafPath));
-
document.open();
-
this.document = document;
-
return this;
-
}
-
/**
-
* 添加图片背景
-
* @param imageUrl :证书图片的磁盘路径
-
* @param absoluteX :左边距
-
* @param absoluteY :底边距
-
* @return
-
* @throws MalformedURLException
-
* @throws IOException
-
* @throws DocumentException
-
*/
-
public PDFUtil addImage(String imagePath,float absoluteX, float absoluteY) throws MalformedURLException, IOException, DocumentException{
-
Image tImgCover = Image.getInstance(imagePath);
-
tImgCover.setAbsolutePosition(absoluteX, absoluteY);
-
float heigth = tImgCover.getHeight();
-
float width = tImgCover.getWidth();
-
// int percent=getPercent(heigth, width);
-
int percent = getPercent2(heigth, width);
-
// 设置图片居中显示
-
// tImgCover.setAlignment(Image.MIDDLE);
-
tImgCover.scalePercent(percent);// 表示是原来图像的比例;
-
document.add(tImgCover);
-
return this;
-
}
-
/**
-
*
-
* @param certificateContent :pdf证书的中文内容
-
* @param x :左边距
-
* @param y :底边距
-
* @param contentStyle :中文内容的样式
-
* @return
-
* @throws DocumentException
-
* @throws IOException
-
*/
-
public PDFUtil addContent(String certificateContent,float x, float y,ContentStyle contentStyle) throws DocumentException, IOException{
-
-
if(contentStyle == null){
-
contentStyle = new ContentStyle();
-
}
-
-
PdfContentByte canvas = writer.getDirectContent();
-
BaseFont bf = BaseFont.createFont(contentStyle.getTTFPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
-
Font secFont = new Font(bf, contentStyle.getFontSize(), contentStyle.getStyle(), contentStyle.getBaseColor());
-
Phrase certificateContentPhrase = new Phrase(certificateContent, secFont);
-
ColumnText.showTextAligned(canvas, contentStyle.getAlignment(), certificateContentPhrase, x,y, 0);
-
return this;
-
}
-
/**
-
* 添加日期内容
-
* @param x 插入pdf左边距
-
* @param y 插入pdf底边距
-
* @param contentStyle
-
* @return
-
* @throws DocumentException
-
* @throws IOException
-
*/
-
public PDFUtil addDateContent(float x, float y,ContentStyle contentStyle) throws DocumentException, IOException{
-
-
if(contentStyle == null){
-
contentStyle = new ContentStyle();
-
}
-
-
Date currentDate = DateTimeUtil.getCurrentDate();
-
String currentDateString = DateTimeUtil.DateToString(currentDate);
-
-
PdfContentByte canvas = writer.getDirectContent();
-
BaseFont bf = BaseFont.createFont(contentStyle.getTTFPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
-
Font secFont = new Font(bf, contentStyle.getFontSize(), contentStyle.getStyle(), contentStyle.getBaseColor());
-
Phrase certificateDatephrase = new Phrase(currentDateString, secFont);
-
ColumnText.showTextAligned(canvas,contentStyle.getAlignment(), certificateDatephrase, x,y, 0);
-
return this;
-
}
-
/**
-
* 释放资源
-
*/
-
public void close(){
-
document.close();
-
}
-
/**
-
* 第二种解决方案,统一按照宽度压缩
-
* 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的
-
* @param args
-
*/
-
public int getPercent2(float h,float w)
-
{
-
int p=0;
-
float p2=0.0f;
-
p2=595/w*100;
-
System.out.println("--"+p2);
-
p=Math.round(p2);
-
return p;
-
}
-
/**
-
* 第一种解决方案
-
* 在不改变图片形状的同时,判断,如果h>w,则按h压缩,否则在w>h或w=h的情况下,按宽度压缩
-
* @param h
-
* @param w
-
* @return
-
*/
-
-
public int getPercent(float h,float w)
-
{
-
int p=0;
-
float p2=0.0f;
-
if(h>w)
-
{
-
p2=297/h*100;
-
}
-
else
-
{
-
p2=210/w*100;
-
}
-
p=Math.round(p2);
-
return p;
-
}
-
-
public static void main(String[] args) throws MalformedURLException, FileNotFoundException, DocumentException, IOException {
-
long currentDateTime = new Date().getTime();
-
String imagePath = PDFUtil.class.getClassLoader().getResource("certificate.png").getPath();
-
String pdfFilePath = "d:/pdf/" +7+ ".pdf";
-
PDFUtil pdfUtil = new PDFUtil();
-
pdfUtil.openDocumnet(pdfFilePath)
-
.addImage(imagePath, 0, 400)
-
.addDateContent(330,462,null)
-
.addContent("张三",85,655,null)
-
.close();
-
}
-
}
日期的工具类
-
package cn.zhuoqianmingyue;
-
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
-
public class DateTimeUtil {
-
-
public static java.util.Date getCurrentDate(){
-
return new java.util.Date(System.currentTimeMillis());
-
}
-
-
public static String DateToString(Date date) {
-
if(date == null){
-
return "";
-
}
-
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
return sdf.format(date);
-
}
-
}
PDFUtil测试类:
-
package cn.zhuoqianmingyue;
-
-
import java.io.FileNotFoundException;
-
import java.io.IOException;
-
import java.net.MalformedURLException;
-
import java.util.Date;
-
-
import org.junit.Test;
-
-
import com.itextpdf.text.DocumentException;
-
-
public class PDFUtilTest {
-
-
@Test
-
public void generatingPdfCertificate () throws MalformedURLException, FileNotFoundException, DocumentException, IOException {
-
long currentDateTime = new Date().getTime();
-
String imagePath = PDFUtil.class.getClassLoader().getResource("certificate.png").getPath();
-
String pdfFilePath = "d:/pdf/" +currentDateTime+ ".pdf";
-
PDFUtil pdfUtil = new PDFUtil();
-
pdfUtil.openDocumnet(pdfFilePath)
-
.addImage(imagePath, 0, 400)
-
.addDateContent(330,462,null)
-
.addContent("张三",85,655,null)
-
.close();
-
}
-
}
pom.xml内容:
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
<groupId>cn.zhuoqianmingyue</groupId>
-
<artifactId>certificate</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
<dependencies>
-
<dependency>
-
<groupId>com.itextpdf</groupId>
-
<artifactId>itextpdf</artifactId>
-
<version>5.5.11</version>
-
</dependency>
-
-
<dependency>
-
<groupId>com.itextpdf</groupId>
-
<artifactId>itext-asian</artifactId>
-
<version>5.2.0</version>
-
</dependency>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
<scope>test</scope>
-
</dependency>
-
</dependencies>
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-compiler-plugin</artifactId>
-
<version>3.1</version>
-
<configuration>
-
<source>1.8</source>
-
<target>1.8</target>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
源码地址:https://github.com/zhuoqianmingyue/certificate
参考文献:https://blog.csdn.net/ITBigGod/article/details/81155483
相关推荐
Java 生成 PDF 文件是开发过程中常见的一种需求,用于将数据以规范化的格式导出或打印。在本例中,我们看到使用的是 `iText` 库,这是一个强大的 Java 库,专门用于创建和修改 PDF 文档。以下是 `iText` 的核心概念...
Java 生成 PDF 文件,解决中文乱码问题 Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何...
本项目着重介绍了如何在Java环境中生成PDF文件,并且对其进行加密以及设置安全性。下面我们将深入探讨相关知识点。 首先,我们关注的是"JAVA生成PDF文件"。Java中常用的PDF库有iText、Apache PDFBox、 Flying ...
在Java开发中,生成PDF文件是一项常见的需求,特别是在报表、文档和证书的生成场景中。Itext库是一个广泛使用的开源库,它允许开发者通过简单的API来创建和编辑PDF文档。本篇文章将深入探讨如何利用Itext库在Java中...
在Java开发中,生成和处理PDF文档是一项常见的需求。Itext是一个强大的库,它允许开发者在Java环境中创建、编辑和修改PDF文档。本教程将详细讲解如何使用Itext库实现PDF文件的下载,包括通过系统路径下载和通过...
Java生成PDF文件是一种常见的需求,特别是在企业级应用中,用于创建报告、发票、合同等文档。这个主题涉及到Java中的iText库,一个强大的PDF处理库,以及如何使用它来创建和操作PDF文档。 首先,iText是Java的一个...
这个过程展示了如何在Java中生成条码并将其保存到PDF文件中,同时添加水印。实践中,你可能需要根据具体需求调整代码,比如改变条码尺寸、颜色、位置以及水印的样式和透明度。理解这些基本步骤后,你可以灵活地定制...
在Java编程环境中,生成PDF文件是一项常见的需求,特别是在需要创建报告、发票或任何类型的文档时。iText是一个流行的开源库,专门用于处理PDF文档。在这个主题中,我们将深入探讨如何使用iText在Java中生成PDF文件...
在Java编程环境中,将一个URL链接的内容转换为PDF文件是一个常见的需求,这通常涉及到网络请求、HTML解析以及PDF生成等多个步骤。以下是一个详细的步骤指南,涵盖了这个过程中的关键知识点: 首先,我们需要处理URL...
在Java中,iText库提供了SignPDF方法,可以结合Java Cryptography Extension (JCE) 和Certificate Authority (CA) 的数字证书来实现这一功能。首先,你需要获取用户的私钥和公钥证书,然后使用iText的PdfStamper类将...
Java生成PDF字体库包与PDF相关的技术涉及到Java编程语言、PDF文档处理以及特定的库,如iText。本文将深入探讨这些关键知识点,以便你更好地理解如何在Java环境中创建和处理PDF文档。 首先,让我们从Java开始。Java...
在Java开发中,有时我们需要处理多个PDF文档,例如将它们合并成一个文件或者为合并后的文件生成目录和页码。这个任务通常出现在报告生成、文档整合等场景中。本项目提供了一个纯Java实现的解决方案,它能有效地完成...
在Java环境中实现PDF文件的电子签名,主要涉及到数字证书的生成、PDF处理库的使用以及签名的嵌入操作。下面将详细介绍这个过程。 首先,我们需要了解PFX(Personal Information Exchange)证书。PFX是一种包含了...
在IT行业中,生成PDF文件是常见的需求,尤其是在报告、文档或证书的生成上。Java作为一个强大的后端开发语言,提供了多种库来实现这一功能。本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF...
综上所述,生成PDF417条码涉及多个步骤和技术,包括选择和使用合适的Java库、理解数据编码、生成条码图像,以及遵循特定行业的使用规范。通过学习和实践,开发者可以熟练掌握这一技能,将其应用于各种业务场景。
这个主题“JAVA在线生成pdf包含jar文件”涉及到利用Java库来创建PDF文档,并且提供了一个包含必需jar文件的压缩包,使得开发者可以直接使用这些库进行开发。以下是关于这个主题的详细知识点: 1. **iText库**:Java...
在Java编程环境中,将URL内容转换为PDF文件是一项常见的需求,尤其在数据抓取、文档保存或自动化报告生成等场景中。"java URL转PDF文件(完美支持中文)"的主题着重于如何利用Java库来实现这一功能,并且确保中文字符...
java解析PDF格式的文件demo。JAVA实现PDF解析,对PDF文件中的文本内容可输出仅供参考学习,不喜勿喷。
在企业的信息系统中,报表处理一直占比较重要的作用,这里介绍一种生成PDF报表的Java组件--iText。通过在服务器端使用Jsp或 JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成的报表,这样就很好的解决了B...
在Java编程环境中,将Excel文件转换为PDF文件是一项常见的任务,尤其在数据报告或文档格式转换的场景下。本文将详细介绍如何使用Apache POI库处理Excel数据,以及使用iText库将这些数据导出为PDF格式。Apache POI是...