Java 导出pdf 写出demo 1、需要设置自定义页眉和文字 2、可以插入表格 3、可以插入图片

发布于:2025-07-09 ⋅ 阅读:(20) ⋅ 点赞:(0)

以下是一个使用 iText 7 库实现 PDF 导出的 Java 示例,包含自定义页眉、文字、表格和图片功能:

添加 Maven 依赖

<dependencies>
    <!-- iText 7 Core -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.2.5</version>
    </dependency>
    <!-- PDF Layout 扩展 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>layout</artifactId>
        <version>7.2.5</version>
    </dependency>
</dependencies>

Java 示例代码

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
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.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;

import java.io.File;
import java.io.IOException;

public class PdfExportDemo {

    public static void main(String[] args) throws IOException {
        // 1. 创建PDF文档
        String dest = "demo.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);

        // 添加自定义页眉处理器
        HeaderEventHandler handler = new HeaderEventHandler();
        pdf.addEventHandler(PdfDocumentEvent.START_PAGE, handler);

        // 2. 添加文字内容
        PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");
        Paragraph title = new Paragraph("PDF导出示例")
                .setFont(font)
                .setFontSize(20)
                .setBold()
                .setTextAlignment(TextAlignment.CENTER);
        document.add(title);

        Paragraph content = new Paragraph("这是一个使用iText 7创建的PDF文档示例,展示了如何添加自定义页眉、文字、表格和图片。")
                .setFont(font)
                .setFontSize(12)
                .setMarginTop(20);
        document.add(content);

        // 3. 添加表格
        Table table = new Table(UnitValue.createPercentArray(new float[]{2, 3, 2}))
                .setWidth(UnitValue.createPercentValue(80))
                .setHorizontalAlignment(HorizontalAlignment.CENTER)
                .setMarginTop(20);

        // 表头
        table.addHeaderCell(createCell("ID", true, font));
        table.addHeaderCell(createCell("产品名称", true, font));
        table.addHeaderCell(createCell("价格", true, font));

        // 表格内容
        table.addCell(createCell("001", false, font));
        table.addCell(createCell("Java编程指南", false, font));
        table.addCell(createCell("¥89.00", false, font));

        table.addCell(createCell("002", false, font));
        table.addCell(createCell("PDF生成教程", false, font));
        table.addCell(createCell("¥59.00", false, font));

        document.add(table);

        // 4. 添加图片
        String imagePath = "logo.png"; // 替换为实际图片路径
        if (new File(imagePath).exists()) {
            Image img = new Image(ImageDataFactory.create(imagePath))
                    .setWidth(150)
                    .setHorizontalAlignment(HorizontalAlignment.CENTER)
                    .setMarginTop(30);
            document.add(img);
        } else {
            System.out.println("图片文件不存在: " + imagePath);
        }

        // 5. 关闭文档
        document.close();
        System.out.println("PDF生成成功: " + dest);
    }

    // 创建表格单元格辅助方法
    private static Cell createCell(String text, boolean isHeader, PdfFont font) {
        Cell cell = new Cell().add(new Paragraph(text).setFont(font));
        if (isHeader) {
            cell.setBackgroundColor(ColorConstants.LIGHT_GRAY);
            cell.setBold();
        }
        cell.setBorder(new SolidBorder(1));
        cell.setPadding(5);
        return cell;
    }

    // 自定义页眉处理器
    static class HeaderEventHandler implements IEventHandler {
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfPage page = docEvent.getPage();
            Rectangle pageSize = page.getPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), docEvent.getDocument());
            Canvas canvas = new Canvas(pdfCanvas, pageSize);

            // 绘制页眉文本
            Paragraph header = new Paragraph("公司机密文档 - 2023年度报告")
                    .setFontSize(10)
                    .setFontColor(ColorConstants.DARK_GRAY)
                    .setTextAlignment(TextAlignment.CENTER)
                    .setFixedPosition(0, pageSize.getTop() - 30, pageSize.getWidth());

            // 绘制页眉分隔线
            LineSeparator line = new LineSeparator(new SolidBorder(0.5f));
            line.setWidth(pageSize.getWidth() - 60);
            line.setMarginTop(5);
            line.setHorizontalAlignment(HorizontalAlignment.CENTER);

            canvas.add(header);
            canvas.add(line);
            canvas.close();
        }
    }
}

功能说明

  1. 自定义页眉

    • 使用 HeaderEventHandler 实现在每页顶部添加页眉
    • 包含居中文本和分隔线
    • 通过 PdfDocumentEvent.START_PAGE 事件触发
  2. 文字内容

    • 添加标题和正文段落
    • 支持中文字体(使用 STSong-Light
    • 设置字体大小、加粗、对齐方式等样式
  3. 表格功能

    • 创建3列表格(ID、产品名称、价格)
    • 设置表头背景色和单元格边框
    • 控制表格宽度和页面居中
  4. 图片插入

    • 从文件系统加载图片(需替换实际路径)
    • 设置图片宽度和居中显示
    • 添加错误处理(文件不存在时提示)

使用说明

  1. 替换图片路径:

    String imagePath = "your_image_path.png"; // 修改为实际图片路径
    
  2. 调整中文字体:

    • 如需使用其他中文字体,需引入字体文件:
    PdfFont font = PdfFontFactory.createFont("font_path.ttf", PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
    
  3. 运行程序:

    • 执行后生成 demo.pdf 文件
    • 完整功能包括:页眉、标题、正文、表格和图片

常见问题解决

  1. 中文显示问题

    • 确保使用支持中文的字体
    • 或添加额外中文字体依赖:
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>font-asian</artifactId>
        <version>7.2.5</version>
    </dependency>
    
  2. 图片路径错误

    • 使用绝对路径或确保相对路径正确
    • 添加文件存在检查逻辑
  3. 页眉位置调整

    • 修改 setFixedPosition 的 Y 坐标值:
    .setFixedPosition(0, pageSize.getTop() - 40, pageSize.getWidth()); // 调整-40值
    

这个示例提供了完整的 PDF 导出功能,可根据实际需求调整样式和内容布局。


网站公告

今日签到

点亮在社区的每一天
去签到