`
shuai1234
  • 浏览: 971735 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

Java生成荣誉证书PDF文件

    博客分类:
  • java
 
阅读更多

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效果:

实现代码:

这个是生成中文内容中字体的样式封装类

  1.  
    package cn.zhuoqianmingyue;
  2.  
     
  3.  
    import com.itextpdf.text.BaseColor;
  4.  
    import com.itextpdf.text.Element;
  5.  
    import com.itextpdf.text.Font;
  6.  
     
  7.  
    public class ContentStyle {
  8.  
     
  9.  
    private String TTFPath = "C:/WINDOWS/Fonts/SIMYOU.TTF";// 字体类型
  10.  
    private float fontSize = 12;//字体大小
  11.  
    private BaseColor baseColor = new BaseColor(0, 0, 0);//默认是黑色
  12.  
    private int style = Font.NORMAL;//字体样式
  13.  
    private int alignment = Element.ALIGN_LEFT;
  14.  
     
  15.  
    public String getTTFPath() {
  16.  
    return TTFPath;
  17.  
    }
  18.  
    public void setTTFPath(String tTFPath) {
  19.  
    TTFPath = tTFPath;
  20.  
    }
  21.  
    public float getFontSize() {
  22.  
    return fontSize;
  23.  
    }
  24.  
    public void setFontSize(float fontSize) {
  25.  
    this.fontSize = fontSize;
  26.  
    }
  27.  
    public BaseColor getBaseColor() {
  28.  
    return baseColor;
  29.  
    }
  30.  
    public void setBaseColor(BaseColor baseColor) {
  31.  
    this.baseColor = baseColor;
  32.  
    }
  33.  
    public int getStyle() {
  34.  
    return style;
  35.  
    }
  36.  
    public void setStyle(int style) {
  37.  
    this.style = style;
  38.  
    }
  39.  
    public int getAlignment() {
  40.  
    return alignment;
  41.  
    }
  42.  
    public void setAlignment(int alignment) {
  43.  
    this.alignment = alignment;
  44.  
    }
  45.  
    }

 生产证书pdf 文件工具类

  1.  
    package cn.zhuoqianmingyue;
  2.  
     
  3.  
    import java.io.FileNotFoundException;
  4.  
    import java.io.FileOutputStream;
  5.  
    import java.io.IOException;
  6.  
    import java.net.MalformedURLException;
  7.  
    import java.util.Date;
  8.  
     
  9.  
    import com.itextpdf.text.Document;
  10.  
    import com.itextpdf.text.DocumentException;
  11.  
    import com.itextpdf.text.Font;
  12.  
    import com.itextpdf.text.Image;
  13.  
    import com.itextpdf.text.PageSize;
  14.  
    import com.itextpdf.text.Phrase;
  15.  
    import com.itextpdf.text.pdf.BaseFont;
  16.  
    import com.itextpdf.text.pdf.ColumnText;
  17.  
    import com.itextpdf.text.pdf.PdfContentByte;
  18.  
    import com.itextpdf.text.pdf.PdfWriter;
  19.  
     
  20.  
    public class PDFUtil {
  21.  
     
  22.  
    private Document document;
  23.  
    private PdfWriter writer;
  24.  
     
  25.  
    public void setDocument(Document document) {
  26.  
    this.document = document;
  27.  
    }
  28.  
     
  29.  
    public void setWriter(PdfWriter writer) {
  30.  
    this.writer = writer;
  31.  
    }
  32.  
    /**
  33.  
    * 开启创建PDF对象
  34.  
    * @param pafPath : 生成pdf的磁盘路径
  35.  
    * @return
  36.  
    * @throws FileNotFoundException
  37.  
    * @throws DocumentException
  38.  
    */
  39.  
    public PDFUtil openDocumnet(String pafPath) throws FileNotFoundException, DocumentException{
  40.  
    Document document = new Document(PageSize.A4);
  41.  
    writer = PdfWriter.getInstance(document,new FileOutputStream(pafPath));
  42.  
    document.open();
  43.  
    this.document = document;
  44.  
    return this;
  45.  
    }
  46.  
    /**
  47.  
    * 添加图片背景
  48.  
    * @param imageUrl :证书图片的磁盘路径
  49.  
    * @param absoluteX :左边距
  50.  
    * @param absoluteY :底边距
  51.  
    * @return
  52.  
    * @throws MalformedURLException
  53.  
    * @throws IOException
  54.  
    * @throws DocumentException
  55.  
    */
  56.  
    public PDFUtil addImage(String imagePath,float absoluteX, float absoluteY) throws MalformedURLException, IOException, DocumentException{
  57.  
    Image tImgCover = Image.getInstance(imagePath);
  58.  
    tImgCover.setAbsolutePosition(absoluteX, absoluteY);
  59.  
    float heigth = tImgCover.getHeight();
  60.  
    float width = tImgCover.getWidth();
  61.  
    // int percent=getPercent(heigth, width);
  62.  
    int percent = getPercent2(heigth, width);
  63.  
    // 设置图片居中显示
  64.  
    // tImgCover.setAlignment(Image.MIDDLE);
  65.  
    tImgCover.scalePercent(percent);// 表示是原来图像的比例;
  66.  
    document.add(tImgCover);
  67.  
    return this;
  68.  
    }
  69.  
    /**
  70.  
    *
  71.  
    * @param certificateContent :pdf证书的中文内容
  72.  
    * @param x :左边距
  73.  
    * @param y :底边距
  74.  
    * @param contentStyle :中文内容的样式
  75.  
    * @return
  76.  
    * @throws DocumentException
  77.  
    * @throws IOException
  78.  
    */
  79.  
    public PDFUtil addContent(String certificateContent,float x, float y,ContentStyle contentStyle) throws DocumentException, IOException{
  80.  
     
  81.  
    if(contentStyle == null){
  82.  
    contentStyle = new ContentStyle();
  83.  
    }
  84.  
     
  85.  
    PdfContentByte canvas = writer.getDirectContent();
  86.  
    BaseFont bf = BaseFont.createFont(contentStyle.getTTFPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  87.  
    Font secFont = new Font(bf, contentStyle.getFontSize(), contentStyle.getStyle(), contentStyle.getBaseColor());
  88.  
    Phrase certificateContentPhrase = new Phrase(certificateContent, secFont);
  89.  
    ColumnText.showTextAligned(canvas, contentStyle.getAlignment(), certificateContentPhrase, x,y, 0);
  90.  
    return this;
  91.  
    }
  92.  
    /**
  93.  
    * 添加日期内容
  94.  
    * @param x 插入pdf左边距
  95.  
    * @param y 插入pdf底边距
  96.  
    * @param contentStyle
  97.  
    * @return
  98.  
    * @throws DocumentException
  99.  
    * @throws IOException
  100.  
    */
  101.  
    public PDFUtil addDateContent(float x, float y,ContentStyle contentStyle) throws DocumentException, IOException{
  102.  
     
  103.  
    if(contentStyle == null){
  104.  
    contentStyle = new ContentStyle();
  105.  
    }
  106.  
     
  107.  
    Date currentDate = DateTimeUtil.getCurrentDate();
  108.  
    String currentDateString = DateTimeUtil.DateToString(currentDate);
  109.  
     
  110.  
    PdfContentByte canvas = writer.getDirectContent();
  111.  
    BaseFont bf = BaseFont.createFont(contentStyle.getTTFPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  112.  
    Font secFont = new Font(bf, contentStyle.getFontSize(), contentStyle.getStyle(), contentStyle.getBaseColor());
  113.  
    Phrase certificateDatephrase = new Phrase(currentDateString, secFont);
  114.  
    ColumnText.showTextAligned(canvas,contentStyle.getAlignment(), certificateDatephrase, x,y, 0);
  115.  
    return this;
  116.  
    }
  117.  
    /**
  118.  
    * 释放资源
  119.  
    */
  120.  
    public void close(){
  121.  
    document.close();
  122.  
    }
  123.  
    /**
  124.  
    * 第二种解决方案,统一按照宽度压缩
  125.  
    * 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的
  126.  
    * @param args
  127.  
    */
  128.  
    public int getPercent2(float h,float w)
  129.  
    {
  130.  
    int p=0;
  131.  
    float p2=0.0f;
  132.  
    p2=595/w*100;
  133.  
    System.out.println("--"+p2);
  134.  
    p=Math.round(p2);
  135.  
    return p;
  136.  
    }
  137.  
    /**
  138.  
    * 第一种解决方案
  139.  
    * 在不改变图片形状的同时,判断,如果h>w,则按h压缩,否则在w>h或w=h的情况下,按宽度压缩
  140.  
    * @param h
  141.  
    * @param w
  142.  
    * @return
  143.  
    */
  144.  
     
  145.  
    public int getPercent(float h,float w)
  146.  
    {
  147.  
    int p=0;
  148.  
    float p2=0.0f;
  149.  
    if(h>w)
  150.  
    {
  151.  
    p2=297/h*100;
  152.  
    }
  153.  
    else
  154.  
    {
  155.  
    p2=210/w*100;
  156.  
    }
  157.  
    p=Math.round(p2);
  158.  
    return p;
  159.  
    }
  160.  
     
  161.  
    public static void main(String[] args) throws MalformedURLException, FileNotFoundException, DocumentException, IOException {
  162.  
    long currentDateTime = new Date().getTime();
  163.  
    String imagePath = PDFUtil.class.getClassLoader().getResource("certificate.png").getPath();
  164.  
    String pdfFilePath = "d:/pdf/" +7+ ".pdf";
  165.  
    PDFUtil pdfUtil = new PDFUtil();
  166.  
    pdfUtil.openDocumnet(pdfFilePath)
  167.  
    .addImage(imagePath, 0, 400)
  168.  
    .addDateContent(330,462,null)
  169.  
    .addContent("张三",85,655,null)
  170.  
    .close();
  171.  
    }
  172.  
    }

 日期的工具类

  1.  
    package cn.zhuoqianmingyue;
  2.  
     
  3.  
    import java.text.SimpleDateFormat;
  4.  
    import java.util.Date;
  5.  
     
  6.  
    public class DateTimeUtil {
  7.  
     
  8.  
    public static java.util.Date getCurrentDate(){
  9.  
    return new java.util.Date(System.currentTimeMillis());
  10.  
    }
  11.  
     
  12.  
    public static String DateToString(Date date) {
  13.  
    if(date == null){
  14.  
    return "";
  15.  
    }
  16.  
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  17.  
    return sdf.format(date);
  18.  
    }
  19.  
    }

 PDFUtil测试类:

  1.  
    package cn.zhuoqianmingyue;
  2.  
     
  3.  
    import java.io.FileNotFoundException;
  4.  
    import java.io.IOException;
  5.  
    import java.net.MalformedURLException;
  6.  
    import java.util.Date;
  7.  
     
  8.  
    import org.junit.Test;
  9.  
     
  10.  
    import com.itextpdf.text.DocumentException;
  11.  
     
  12.  
    public class PDFUtilTest {
  13.  
     
  14.  
    @Test
  15.  
    public void generatingPdfCertificate () throws MalformedURLException, FileNotFoundException, DocumentException, IOException {
  16.  
    long currentDateTime = new Date().getTime();
  17.  
    String imagePath = PDFUtil.class.getClassLoader().getResource("certificate.png").getPath();
  18.  
    String pdfFilePath = "d:/pdf/" +currentDateTime+ ".pdf";
  19.  
    PDFUtil pdfUtil = new PDFUtil();
  20.  
    pdfUtil.openDocumnet(pdfFilePath)
  21.  
    .addImage(imagePath, 0, 400)
  22.  
    .addDateContent(330,462,null)
  23.  
    .addContent("张三",85,655,null)
  24.  
    .close();
  25.  
    }
  26.  
    }

 pom.xml内容:

  1.  
    <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">
  2.  
    <modelVersion>4.0.0</modelVersion>
  3.  
    <groupId>cn.zhuoqianmingyue</groupId>
  4.  
    <artifactId>certificate</artifactId>
  5.  
    <version>0.0.1-SNAPSHOT</version>
  6.  
    <dependencies>
  7.  
    <dependency>
  8.  
    <groupId>com.itextpdf</groupId>
  9.  
    <artifactId>itextpdf</artifactId>
  10.  
    <version>5.5.11</version>
  11.  
    </dependency>
  12.  
     
  13.  
    <dependency>
  14.  
    <groupId>com.itextpdf</groupId>
  15.  
    <artifactId>itext-asian</artifactId>
  16.  
    <version>5.2.0</version>
  17.  
    </dependency>
  18.  
    <dependency>
  19.  
    <groupId>junit</groupId>
  20.  
    <artifactId>junit</artifactId>
  21.  
    <version>4.12</version>
  22.  
    <scope>test</scope>
  23.  
    </dependency>
  24.  
    </dependencies>
  25.  
    <build>
  26.  
    <plugins>
  27.  
    <plugin>
  28.  
    <groupId>org.apache.maven.plugins</groupId>
  29.  
    <artifactId>maven-compiler-plugin</artifactId>
  30.  
    <version>3.1</version>
  31.  
    <configuration>
  32.  
    <source>1.8</source>
  33.  
    <target>1.8</target>
  34.  
    </configuration>
  35.  
    </plugin>
  36.  
    </plugins>
  37.  
    </build>
  38.  
    </project>

源码地址:https://github.com/zhuoqianmingyue/certificate

 

参考文献:https://blog.csdn.net/ITBigGod/article/details/81155483

                 https://blog.csdn.net/mr_li13/article/details/78292277

分享到:
评论

相关推荐

    使用java生成pdf文件

    Java 生成 PDF 文件是开发过程中常见的一种需求,用于将数据以规范化的格式导出或打印。在本例中,我们看到使用的是 `iText` 库,这是一个强大的 Java 库,专门用于创建和修改 PDF 文档。以下是 `iText` 的核心概念...

    Java生成pdf文件,解决中文乱码问题.pdf

    Java 生成 PDF 文件,解决中文乱码问题 Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何...

    JAVA生成PDF文件(Demo+jar),可加密及设置安全性

    本项目着重介绍了如何在Java环境中生成PDF文件,并且对其进行加密以及设置安全性。下面我们将深入探讨相关知识点。 首先,我们关注的是"JAVA生成PDF文件"。Java中常用的PDF库有iText、Apache PDFBox、 Flying ...

    java生成pdf文件分页输出并添加水印

    在Java开发中,生成PDF文件是一项常见的需求,特别是在报表、文档和证书的生成场景中。Itext库是一个广泛使用的开源库,它允许开发者通过简单的API来创建和编辑PDF文档。本篇文章将深入探讨如何利用Itext库在Java中...

    java使用itext实现pdf文件下载

    在Java开发中,生成和处理PDF文档是一项常见的需求。Itext是一个强大的库,它允许开发者在Java环境中创建、编辑和修改PDF文档。本教程将详细讲解如何使用Itext库实现PDF文件的下载,包括通过系统路径下载和通过...

    java生成pdf文件

    Java生成PDF文件是一种常见的需求,特别是在企业级应用中,用于创建报告、发票、合同等文档。这个主题涉及到Java中的iText库,一个强大的PDF处理库,以及如何使用它来创建和操作PDF文档。 首先,iText是Java的一个...

    Java 生成条码 保存在pdf上例子(亲测)

    这个过程展示了如何在Java中生成条码并将其保存到PDF文件中,同时添加水印。实践中,你可能需要根据具体需求调整代码,比如改变条码尺寸、颜色、位置以及水印的样式和透明度。理解这些基本步骤后,你可以灵活地定制...

    java生成PDF文件

    在Java编程环境中,生成PDF文件是一项常见的需求,特别是在需要创建报告、发票或任何类型的文档时。iText是一个流行的开源库,专门用于处理PDF文档。在这个主题中,我们将深入探讨如何使用iText在Java中生成PDF文件...

    java URL转PDF文件

    在Java编程环境中,将一个URL链接的内容转换为PDF文件是一个常见的需求,这通常涉及到网络请求、HTML解析以及PDF生成等多个步骤。以下是一个详细的步骤指南,涵盖了这个过程中的关键知识点: 首先,我们需要处理URL...

    java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密

    在Java中,iText库提供了SignPDF方法,可以结合Java Cryptography Extension (JCE) 和Certificate Authority (CA) 的数字证书来实现这一功能。首先,你需要获取用户的私钥和公钥证书,然后使用iText的PdfStamper类将...

    java生成PDF字体库包+PDF包亲测成功

    Java生成PDF字体库包与PDF相关的技术涉及到Java编程语言、PDF文档处理以及特定的库,如iText。本文将深入探讨这些关键知识点,以便你更好地理解如何在Java环境中创建和处理PDF文档。 首先,让我们从Java开始。Java...

    java 多个pdf合并,目录生成(支持自定义目录),页码生成(源码)

    在Java开发中,有时我们需要处理多个PDF文档,例如将它们合并成一个文件或者为合并后的文件生成目录和页码。这个任务通常出现在报告生成、文档整合等场景中。本项目提供了一个纯Java实现的解决方案,它能有效地完成...

    java实现pdf文件电子签名

    在Java环境中实现PDF文件的电子签名,主要涉及到数字证书的生成、PDF处理库的使用以及签名的嵌入操作。下面将详细介绍这个过程。 首先,我们需要了解PFX(Personal Information Exchange)证书。PFX是一种包含了...

    Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)

    在IT行业中,生成PDF文件是常见的需求,尤其是在报告、文档或证书的生成上。Java作为一个强大的后端开发语言,提供了多种库来实现这一功能。本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF...

    java生成PDF417条码

    综上所述,生成PDF417条码涉及多个步骤和技术,包括选择和使用合适的Java库、理解数据编码、生成条码图像,以及遵循特定行业的使用规范。通过学习和实践,开发者可以熟练掌握这一技能,将其应用于各种业务场景。

    JAVA在线生成pdf包含jar文件

    这个主题“JAVA在线生成pdf包含jar文件”涉及到利用Java库来创建PDF文档,并且提供了一个包含必需jar文件的压缩包,使得开发者可以直接使用这些库进行开发。以下是关于这个主题的详细知识点: 1. **iText库**:Java...

    java URL转PDF文件(完美支持中文)

    在Java编程环境中,将URL内容转换为PDF文件是一项常见的需求,尤其在数据抓取、文档保存或自动化报告生成等场景中。"java URL转PDF文件(完美支持中文)"的主题着重于如何利用Java库来实现这一功能,并且确保中文字符...

    java解析PDF文件

    java解析PDF格式的文件demo。JAVA实现PDF解析,对PDF文件中的文本内容可输出仅供参考学习,不喜勿喷。

    java Excel文件转PDF文件

    在Java编程环境中,将Excel文件转换为PDF文件是一项常见的任务,尤其在数据报告或文档格式转换的场景下。本文将详细介绍如何使用Apache POI库处理Excel数据,以及使用iText库将这些数据导出为PDF格式。Apache POI是...

    Java根据模板动态生成Pdf(添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64)

    6、若对资源有疑问,可以在详见others/《Java生成Pdf文档使用说明.pdf》中的博主个人联系方式中寻求帮助。 1、Demo示例:https://img-blog.csdnimg.cn/b8f771e24f814d718595710f0e3c0d93.png 2、页码示例:...

Global site tag (gtag.js) - Google Analytics