用Java验证pdf文件的电子章签名

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>com.yalong</groupId>
  <artifactId>verifyPdf</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <lombok.version>1.18.10</lombok.version>

  </properties>
  <dependencies>
    <!--    <dependency>-->
    <!--      <groupId> e-iceblue </groupId>-->
    <!--      <artifactId>spire.pdf</artifactId>-->
    <!--      <version>3.4.2</version>-->
    <!--    </dependency>-->
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>e-iceblue</groupId>
      <artifactId>spire.pdf.free</artifactId>
      <version>2.6.3</version>
    </dependency>

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.0.1</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <id>com.e-iceblue</id>
      <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
  </repositories>
</project>

VerifySignature.java

import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfCertificate;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormFieldWidgetCollection;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
import lombok.Data;
import lombok.ToString;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.*;
import java.awt.*;

@Data
@ToString
class ExcelDataVO implements Serializable {
  private String fileName;
  private String signDate;
  private String validBefore;
  private String validAfter;
  private String subject;
  private String serialNumber;
  private Boolean isEffective = false;

}

class ExcelWriter {

  //表头
  private static final List<String> CELL_HEADS;

  static {
    // 类装载时就载入指定好的表头信息,如有需要,可以考虑做成动态生成的表头
    CELL_HEADS = new ArrayList<>();
    CELL_HEADS.add("文件名");
    CELL_HEADS.add("签名时间");
    CELL_HEADS.add("有效期");
    CELL_HEADS.add("有效期");
    CELL_HEADS.add("签名机构");
    CELL_HEADS.add("序列号");
    CELL_HEADS.add("是否通过验签");
  }

  /**
   * 生成Excel并写入数据信息
   *
   * @param dataList 数据列表
   * @return 写入数据后的工作簿对象
   */
  public static Workbook exportData(List<ExcelDataVO> dataList) {
    // 生成xlsx的Excel
    Workbook workbook = new SXSSFWorkbook();

    // 如需生成xls的Excel,请使用下面的工作簿对象,注意后续输出时文件后缀名也需更改为xls
    //Workbook workbook = new HSSFWorkbook();

    // 生成Sheet表,写入第一行的表头
    Sheet sheet = buildDataSheet(workbook);
    //构建每行的数据内容
    int rowNum = 1;
    for (ExcelDataVO data : dataList) {
      if (data == null) {
        continue;
      }
      //输出行数据
      Row row = sheet.createRow(rowNum++);
      convertDataToRow(workbook, data, row);
    }
    return workbook;
  }

  /**
   * 生成sheet表,并写入第一行数据(表头)
   *
   * @param workbook 工作簿对象
   * @return 已经写入表头的Sheet
   */
  private static Sheet buildDataSheet(Workbook workbook) {
    Sheet sheet = workbook.createSheet();
    // 设置表头宽度
    for (int i = 0; i < CELL_HEADS.size(); i++) {
      sheet.setColumnWidth(i, 4000);
    }
    // 设置默认行高
    sheet.setDefaultRowHeight((short) 400);
    // 构建头单元格样式
    CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
    // 写入第一行各列的数据
    Row head = sheet.createRow(0);
    for (int i = 0; i < CELL_HEADS.size(); i++) {
      Cell cell = head.createCell(i);
      cell.setCellValue(CELL_HEADS.get(i));
      cell.setCellStyle(cellStyle);
    }
    return sheet;
  }

  /**
   * 设置第一行表头的样式
   *
   * @param workbook 工作簿对象
   * @return 单元格样式对象
   */
  private static CellStyle buildHeadCellStyle(Workbook workbook) {
    CellStyle style = workbook.createCellStyle();
    //对齐方式设置
    style.setAlignment(HorizontalAlignment.CENTER);
    //边框颜色和宽度设置
    style.setBorderBottom(BorderStyle.THIN);
    style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下边框
    style.setBorderLeft(BorderStyle.THIN);
    style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边框
    style.setBorderRight(BorderStyle.THIN);
    style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边框
    style.setBorderTop(BorderStyle.THIN);
    style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边框
    //设置背景颜色
    style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    //粗体字设置
    Font font = workbook.createFont();
    font.setBold(true);
    style.setFont(font);
    return style;
  }

  /**
   * 将数据转换成行
   *
   * @param data 源数据
   * @param row 行对象
   */
  private static void convertDataToRow(Workbook workbook, ExcelDataVO data, Row row) {

    int cellNum = 0;
    Cell cell;

    //对特殊数值设置颜色
    CellStyle cellStyle = workbook.createCellStyle();

    //字体设置
    Font font = workbook.createFont();
    font.setBold(true);
    font.setColor(IndexedColors.GREEN.getIndex());
    cellStyle.setFont(font);

    // 文件名
    cell = row.createCell(cellNum++);
    cell.setCellValue(data.getFileName());

    // 签名时间
    cell = row.createCell(cellNum++);
    cell.setCellValue(null == data.getSignDate() ? "" : data.getSignDate());

    // 有效期
    cell = row.createCell(cellNum++);
    cell.setCellValue(null == data.getValidBefore() ? "" : data.getValidBefore());

    // 有效期
    cell = row.createCell(cellNum++);
    cell.setCellValue(null == data.getValidAfter() ? "" : data.getValidAfter());
    //主题
    cell = row.createCell(cellNum++);
    cell.setCellValue(null == data.getSubject() ? "" : data.getSubject());
    //序列号
    cell = row.createCell(cellNum++);
    cell.setCellValue(null == data.getSerialNumber() ? "" : data.getSerialNumber());
    //是否通过验签
    cell = row.createCell(cellNum);
    if (data.getIsEffective()) {
      cell.setCellValue("签名有效");
    } else {
      cell.setCellValue("签名无效");
      cell.setCellStyle(cellStyle);

    }
  }

  public static void writeExcel(List<ExcelDataVO> dataVOList, String exportFilePath) {

    // 写入数据到工作簿对象内
    Workbook workbook = ExcelWriter.exportData(dataVOList);

    // 以文件的形式输出工作簿对象
    FileOutputStream fileOut = null;
    try {
      File exportFile = new File(exportFilePath);
      if (!exportFile.exists()) {
        boolean newFile = exportFile.createNewFile();
        if (!newFile) {
          System.out.println("文件创建失败");
        }
      }

      fileOut = new FileOutputStream(exportFilePath);
      workbook.write(fileOut);
      fileOut.flush();
    } catch (Exception e) {
      System.out.println("输出Excel时发生错误,错误原因:" + e.getMessage());
    } finally {
      try {
        if (null != fileOut) {
          fileOut.close();
        }
        workbook.close();
      } catch (IOException e) {
        System.out.println("关闭输出流时发生错误,错误原因:" + e.getMessage());
      }
    }
  }
}

public class VerifySignature {
  private static String fromDirPath;
  private static String toFilePath;

  public static void main(String[] args) {
    final JFrame jf = new JFrame("测试窗口");
    jf.setSize(400, 250);
    jf.setLocationRelativeTo(null);
    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();

    // 创建文本区域, 用于显示相关信息
    final JTextArea msgTextArea = new JTextArea(10, 30);
    msgTextArea.setLineWrap(true);
    panel.add(msgTextArea);

    JButton openBtn = new JButton("选择文件路径");
    openBtn.addActionListener(e -> showFileOpenDialog(jf, msgTextArea));
    panel.add(openBtn);

    JButton saveBtn = new JButton("结果保存位置");
    saveBtn.addActionListener(e -> showFileSaveDialog(jf, msgTextArea));
    panel.add(saveBtn);

    jf.setContentPane(panel);
    jf.setVisible(true);

    JButton enSureBtn = new JButton("确认");
    enSureBtn.addActionListener(e -> enSureListener(jf));
    panel.add(enSureBtn);

    jf.setContentPane(panel);
    jf.setVisible(true);
  }

  /*
   * 打开文件
   */
  private static void showFileOpenDialog(Component parent, JTextArea msgTextArea) {
    // 创建一个默认的文件选取器
    JFileChooser fileChooser = new JFileChooser();

    // 设置默认显示的文件夹为当前文件夹
    fileChooser.setCurrentDirectory(new File("."));

    // 设置文件选择的模式(只选文件、只选文件夹、文件和文件均可选)
    fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

    // 设置是否允许多选
    fileChooser.setMultiSelectionEnabled(false);

//    // 添加可用的文件过滤器(FileNameExtensionFilter 的第一个参数是描述, 后面是需要过滤的文件扩展名 可变参数)
//    fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("zip(*.zip, *.rar)", "zip", "rar"));
//
//    // 设置默认使用的文件过滤器
//    fileChooser.setFileFilter(new FileNameExtensionFilter("image(*.jpg, *.png, *.gif)", "jpg", "png", "gif"));

    // 打开文件选择框(线程将被阻塞, 直到选择框被关闭)
    int result = fileChooser.showOpenDialog(parent);

    if (result == JFileChooser.APPROVE_OPTION) {
      // 如果点击了"确定", 则获取选择的文件路径
      File file = fileChooser.getSelectedFile();
      fromDirPath = file.getAbsolutePath();

      msgTextArea.append("选择源文件: " + fromDirPath + "\n\n");
    }
  }

  /*
   * 选择文件保存路径
   */
  private static void showFileSaveDialog(Component parent, JTextArea msgTextArea) {
    // 创建一个默认的文件选取器
    JFileChooser fileChooser = new JFileChooser();

    //把时间戳经过处理得到期望格式的时间
    Date date = new Date();
    SimpleDateFormat format0 = new SimpleDateFormat("yyyyMMddHHmmss");
    String now = format0.format(date.getTime());

    // 设置打开文件选择框后默认输入的文件名
    fileChooser.setSelectedFile(new File(now + ".xlsx"));

    // 打开文件选择框(线程将被阻塞, 直到选择框被关闭)
    int result = fileChooser.showSaveDialog(parent);

    if (result == JFileChooser.APPROVE_OPTION) {
      // 如果点击了"保存", 则获取选择的保存路径
      File file = fileChooser.getSelectedFile();
      toFilePath = file.getAbsolutePath();
      msgTextArea.append("结果文件路径: " + toFilePath + "\n\n");
    }
  }

  //找到需要的内容
  public final static Pattern pattern = Pattern.compile("\\[Subject\\].*?O=(.*?),.*?\\[Issuer\\](.*?)\\[Serial Number\\](.*?)\\[Not Before\\](.*?)\\[Not After\\](.*?)\\[Thumbprint\\](.*?)");
  // 剔除特殊字符
  public final static Pattern replacePattern = Pattern.compile("\t|\r|\n");

  /**
   * 查找某个路径下的所有pdf文件
   *
   * @return 所有的pdf绝对路径
   */
  public static HashSet<String> listDir(String path) {
    HashSet<String> FileNameString = new HashSet<String>();
    File file = new File(path);    //获取其file对象
    File[] fs = file.listFiles();  //遍历path下的文件和目录,放在File数组中
    if (fs == null) {
      System.out.println(path + "路径下没有文件");
      return null;
    }

    //遍历File[]数组
    for (File f : fs) {
      String fileName = String.valueOf(f);
      if (!f.isDirectory() && fileName.toLowerCase().endsWith(".pdf"))    //若非目录(即文件),则打印
        FileNameString.add(fileName);
    }
    return FileNameString;
  }

  /**
   * 检验pdf文件是否签名
   *
   * @param filePath pdf文件绝对路径
   */
  public static ExcelDataVO checkPdf(String filePath) {
    //创建PdfDocument实例
    PdfDocument doc = new PdfDocument();

    //创建结果集
    ExcelDataVO excelDataVO = new ExcelDataVO();

    //文件名,注意windows下应该是\\,linux下是/
    String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
    excelDataVO.setFileName(fileName);

    //加载含有签名的PDF文件
    doc.loadFromFile(filePath);

    //获取域集合
    PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();
    PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();
//    int countCollection = pdfFormFieldWidgetCollection.getCount();
//    System.out.println("共发现" + countCollection + "个域");

    //遍历域
    for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) {
      //判定是否为签名域
      if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {
        //获取签名域
        PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
        //获取签名时间
        PdfSignature signature = signatureFieldWidget.getSignature();
        excelDataVO.setSignDate(String.valueOf(signature.getDate()));

        //获取签名的内容
        PdfCertificate certificate = signature.getCertificate();

        // System.out.println("Issuer:" + certificate.getIssuer());

//        System.out.println("Subject:" + certificate.getSubject());
//        System.out.println("---------");

//        excelDataVO.setSubject(String.valueOf(certificate.getSubject()));

        String certificateString = certificate.toString();

        Matcher m = replacePattern.matcher(certificateString);
        certificateString = m.replaceAll("");

        Matcher matcher = pattern.matcher(certificateString);
        while (matcher.find()) {
//          String group = matcher.group(0);
          String subject = matcher.group(1);
//          String issuer = matcher.group(2);
          String serialNumber = matcher.group(3);

          String before = matcher.group(4);
          String after = matcher.group(5);
//          String sha1 = matcher.group(6);
          excelDataVO.setSubject(subject);
          excelDataVO.setSerialNumber(serialNumber);
          excelDataVO.setValidBefore(before);
          excelDataVO.setValidAfter(after);
        }

        //判定签名是否有效
        boolean result = signature.verifySignature();
        excelDataVO.setIsEffective(result);

        if (result) {
          return excelDataVO;
        }
      }
    }
    return excelDataVO;
  }

  /*
   * 开始执行业务逻辑
   */
  private static void enSureListener(JFrame parent) {
    parent.dispose();
    System.out.println("开始验签...");

    //从某个路径下获取所有的pdf文件路径
    HashSet<String> filePaths = listDir(fromDirPath);
    if (filePaths == null) {
      return;
    }
    List<ExcelDataVO> excelDataVOS = new ArrayList<>();

    for (String filePath : filePaths) {
      ExcelDataVO excelDataVO = checkPdf(filePath);
      excelDataVOS.add(excelDataVO);
    }

    ExcelWriter.writeExcel(excelDataVOS, toFilePath);
    System.out.println("验签完成...");

  }

}

以上就是用Java验证pdf文件的电子章签名的详细内容,更多关于Java验证pdf文件的电子章签名的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java PDF 添加数字签名的实现方法

    经过数字签名的文档,能够使作者之外的人无法对其进行修改.因此,在PDF文档中添加数字签名可以保证其安全性和真实性.同时根据添加内容的差异性,数字签名可分为文本数字签名.图片数字签名.图片及文本数字签名.本文将通过Spire.PDF for Java来演示如何在PDF文档中添加数字签名. 使用工具:Spire.PDF for Java 2.11.4 Jar文件获取及导入: 方法1:通过官网下载获取Jar包.下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序.(如下

  • 三种Java打印PDF文档的实例代码

    以下内容归纳了通过Java程序打印PDF文档时的3种情形.即: 1 静默打印 2 显示打印对话框打印 3 打印PDF时自定义纸张大小 使用工具:Spire.PDF for Java Jar文件获取及导入: 方法1:下载jar包.下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar导入java程序. 方法2:可通过maven库导入.参考导入方法. Java代码示例 [示例1]静默打印 即通过使用默认打印机直接打印PDF文档.打印时,我们可以设置打印份数,设置纸张打印页边距等. impo

  • Java 在PDF中添加条形码的两种方法

    条形码,是由宽度不等的多个黑条和空白所组成,用以表达一组信息的图形标识符.通过给文档添加条形码,可以直观,快捷地访问和分享一些重要的信息.本文就将通过使用Java程序来演示如何在PDF文档中添加Codebar.Code128A和Code39条形码.除此之外,还可支持创建Code11.Code128B.Code32.Code39 Extended .Code93和Code93 Extended条形码. 使用工具:Free Spire.PDF for Java(免费版) Jar文件获取及导入: 方法

  • Java实现Word/Pdf/TXT转html的示例

    引言: 最近公司在做一个教育培训学习及在线考试的项目,本人主要从事网络课程模块,主要做课程分类,课程,课件的创建及在线学习和统计的功能,因为课件涉及到多种类型,像视频,音频,图文,外部链接及文档类型.其中就涉及到一个问题,就是文档型课件课程在网页上的展示和学习问题,因为要在线统计学习的课程,学习的人员,学习的时长,所以不能像传统做法将文档下载到本地学习,那样就不受系统控制了,所以最终的方案是,在上传文档型课件的时候,将其文件对应的转换成HTML文件,以便在网页上能够浏览学习 下边主要针对word

  • Java 在PDF中添加骑缝章示例解析

    骑缝章是用于往来业务合同,以确保合同真实.有效的印章加盖方法,是一种防范风险的重要方式.在Java程序中,可以通过使用工具来辅助加盖这种骑缝章. 工具:Free Spire.PDF for Java (免费版) 工具获取及jar文件导入: 方式1:通过官网下载jar包,并解压,手动导入lib文件夹下的Spire.Pdf.jar文件. 方式2:通过创建Maven程序,在pom.xml中配置maven仓库路径并指定Free Spire.PDF for Java 的依赖,配置完成后,在IDEA中,点击

  • Java实现Word/Excel/TXT转PDF的方法

    引言: 前段时间公司做的教育系统,系统需要实时记录用户学习课程的情况和时间,所以对一些除视频课程之外,对一些文本文档型课件同样如此,初次的方案是讲office相关类型的文件进行转换Html文件,然后展示对应的html文件,PC端差不多没问题了,但是个别文件再转换html之后,样式出现了错乱,即时做了编码转换处理,但是还是有个别乱码,最后改变方案,最后统一将文件转为pdf,然后通过流的方式在前端展示,其中包括Word Excel PPT TXT PDF等文件,代码如下: 备注:本来是可以直接展示p

  • Java 在PDF中绘制形状的两种方法

    在我们编辑PDF文档的过程中,有时候需要在文档中添加一些如多边形.矩形.椭圆形之类的图形,而Free Spire PDF for Java 则正好可以帮助我们在Java程序中通过代码在PDF文档中绘制形状,以及设置形状边线颜色和填充色. Jar包导入 方法一:下载Free Spire.PDF for Java包并解压缩,然后将lib文件夹下的Spire.Pdf.jar包作为依赖项导入到Java应用程序中 方法二:直接通过Maven仓库安装JAR包,配置pom.xml文件的代码如下: <repos

  • 用Java验证pdf文件的电子章签名

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <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

  • 利用Java对PDF文件进行电子签章的实战过程

    目录 一. 概述 二. 技术选型 三. 生成一个图片签章 1. 生成一个如下图的签章图片 2. 相关代码 四. 如何按模板生成PDF文件 1. 制作PDF模板 2. 制作一个如下图的PDF模板,该模板是带有PDF的表单域的 五. 如何生成PKCS12证书 1. PKCS的简单介绍 2. 使用JAVA生成一个PKCS12证书并进行存贮,相关分析见代码注解 六. 如何生成一个高清晰的签章 1. 由PDF模板生成一个PDF文件,见代码注解 2. 对PDF文件进行签章 3. 高清签章 七. 如何进行多次

  • Java实现PDF文件的分割与加密功能

    由于``某些不可抗力原因,公司不允许使用itext系列的jar包,因此系统中使用的相关jar得替换成开源的.经比较和尝试考虑使用org.apache.pdfbox来替换,同时修改系统中原有的方法,发现比itext系列稍显简洁一点,记录如下: 加密文件 /** * 加密文件测试 * @from fhadmin.cn */ @Test public void encryptTest(){ try { String filePath = "D:\\test\\像李开复一样思考人生.pdf";

  • java实现pdf文件截图的方法【附PDFRenderer.jar下载】

    本文实例讲述了java实现pdf文件截图的方法.分享给大家供大家参考,具体如下: 最近做的一个网站中,有个需求是上传pdf文件,显示pdf的封页,点击封页之后进行在线阅读,这里使用的是PDFRender对pdf进行截图. public static boolean createScreenShoot(String source, String target) { File file = new File(source); if (!file.exists()) { System.err.prin

  • JAVA生成pdf文件的实操指南

    目录 一.简介 二.实操 三.原理解析 1.是什么? 1.1.关键技术 2.怎么做?为什么? 3.参考 总结 一.简介 PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.本文实现将html页面转PDF. 二.实操 生成pdf文件成功,但是文字对不上.当修改”GetHtmlContent“部分的编码之后,再次执行生成PDF文件即可完成正确的实现. Edit Configurations 三.原理解析 从这几点深入剖析和总结这个小项目: 1.是什么? 该项目

  • Java生成PDF文件的实例代码

    复制代码 代码如下: package com.qhdstar.java.pdf; import java.awt.Color;import java.io.FileOutputStream; import com.lowagie.text.Chapter;import com.lowagie.text.Document;import com.lowagie.text.Font;import com.lowagie.text.FontFactory;import com.lowagie.text.

  • Java生成pdf文件或jpg图片的案例讲解

    在一些业务场景中,需要生成pdf文件或者jpg图片,有时候还需要带上水印.我们可以事先用freemarker定义好html模板,然后把模板转换成pdf或jpg文件. 同时freemarker模板还支持变量的定义,在使用时可以填充具体的业务数据. 1.Maven导包 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</ar

  • Java使用iTextPDF生成PDF文件的实现方法

    iText介绍和说明 因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮. 如果你想通过java操作PDF文件,那么 iText 绝对是你的首选. 引入依赖 这里使用的是iText5 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</ve

  • Java基于PDFbox实现读取处理PDF文件

    目录 前言 pdfbox介绍 开发环境 PDFbox依赖 快速开始 结语 前言 嗨,大家好,2022年春节已经接近尾声,各地都陆陆续续开工了.近期有朋友做一个小项目正好使用Java读取PDF文件信息.因此记录一下相关过程. pdfbox介绍 PDFbox是一个开源的.基于Java的.支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容.Apache PDFBox还包含了数个命令行工具. PDF文件的数据时一系列基本对象的集合:数组,布

随机推荐