java iText7 9.1.0 实现PDF打印 并添加页眉和动态导出图片

项目需要实现生成PDF文件,从网上查阅资料,很多都是基于iText5版本实现的,无法查询到最新版本的实现方案,故通过本文章记录实现过程。 实现方案为 通过HTML模板,然后再java中动态拼接or添加HTML节点内容,然后通过HtmlConverter.convertToPdf 实现PDF生成,本方案支持导出图片

  1. 添加依赖

    xml 复制代码
    <!-- iText 7 Core -->
     <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>9.1.0</version>
        <type>pom</type>
    </dependency>
    
    <!-- Html2Pdf 模块 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>html2pdf</artifactId>
        <version>6.1.0</version>
    </dependency>
  2. 测试类方法

    java 复制代码
    public static void main(String[] args) throws IOException {
        // 从文件读取HTML文件内容
        String html = FileUtil.readUtf8String("C:/Users/xxxx/Desktop/report.html");
    
        // 输出PDF文件路径
        String dest = "D://generatePDF.pdf";
    
        ConverterProperties properties = new ConverterProperties();
        properties.setCharset("UTF-8");
        // 设置字体提供器
        FontProvider fontProvider = new FontProvider();
        fontProvider.addStandardPdfFonts(); // 添加标准PDF字体
        String fontPath = "C:/Windows/Fonts/simsun.ttc,1"; //你的字体路径
        fontProvider.getFontSet().addFont(fontPath, PdfEncodings.IDENTITY_H);
        properties.setFontProvider(fontProvider);
    
        // 设置页眉
        PdfDocument pdfDocument = new PdfDocument(new PdfWriter(dest));
        String headerText = "xxxxssasa中文xxxss"; // 设置动态页眉内容
        //为pdfDocument添加一个事件处理程序,用于在每页结束时添加页眉
        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new Header(headerText, fontPath));
    
        // 转换HTML到PDF
        HtmlConverter.convertToPdf(html, pdfDocument, properties);
    }
  3. 通过事件处理 添加页眉

java 复制代码
import java.io.IOException;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.event.AbstractPdfDocumentEvent;
import com.itextpdf.kernel.pdf.event.AbstractPdfDocumentEventHandler;
import com.itextpdf.kernel.pdf.event.PdfDocumentEvent;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;

public class Header extends AbstractPdfDocumentEventHandler {

  private String headerText;

  private String fontPath;

  public Header(String headerText, String fontPath) {
      this.headerText = headerText;
      this.fontPath = fontPath;
  }

  @Override
  protected void onAcceptedEvent(AbstractPdfDocumentEvent abstractPdfDocumentEvent) {

      PdfDocumentEvent docEvent = (PdfDocumentEvent)abstractPdfDocumentEvent;
      PdfDocument pdfDoc = docEvent.getDocument();
      PdfPage page = docEvent.getPage();
      Rectangle pageSize = page.getPageSize();
      float width = PageSize.A4.getWidth() - 60;

      // 获取当前页码
      int pageNumber = pdfDoc.getPageNumber(page);
      // 创建 Document 对象
      Document document = new Document(pdfDoc);

      // 表格 一行两列
      Table table = new Table(1);
      table.setWidth(width);

      // 名称
      PdfFont font = null; // 设置字体
      try {
          font = PdfFontFactory.createFont(fontPath);
      } catch (IOException e) {
          throw new RuntimeException(e);
      }
      Paragraph nameP =
          new Paragraph(String.format("%s - 页码: %d", headerText, pageNumber)).setFont(font).setFontSize(10); // 使用传入的页眉文本内容和字体
      Cell cell = new Cell().add(nameP).setHorizontalAlignment(HorizontalAlignment.RIGHT)
          .setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.RIGHT)
          .setBorderTop(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
      table.addCell(cell);

      // 设置表格的位置 页眉处
      table.setFixedPosition(pageSize.getLeft(), pageSize.getTop() - 30, width);

      // 添加表格到文档
      document.add(table);
  }
}

结尾: 如果有需要生成页脚,可自行研究

相关推荐
浪九天44 分钟前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
uhakadotcom2 小时前
Apache CXF 中的拒绝服务漏洞 CVE-2025-23184 详解
后端·面试·github
uhakadotcom2 小时前
CVE-2025-25012:Kibana 原型污染漏洞解析与防护
后端·面试·github
uhakadotcom2 小时前
揭秘ESP32芯片的隐藏命令:潜在安全风险
后端·面试·github
uhakadotcom2 小时前
Apache Camel 漏洞 CVE-2025-27636 详解与修复
后端·面试·github
uhakadotcom2 小时前
OpenSSH CVE-2025-26466 漏洞解析与防御
后端·面试·github
uhakadotcom2 小时前
PostgreSQL的CVE-2025-1094漏洞解析:SQL注入与元命令执行
后端·面试·github
zhuyasen2 小时前
Go语言开发实战:app库实现多服务启动与关闭的优雅方案
后端·go
ITlinuxP2 小时前
2025最新Postman、Apipost和Apifox API 协议与工具选择方案解析
后端·测试工具·postman·开发工具·apipost·apifox·api协议
计算机-秋大田2 小时前
基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计