IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> # Itext Pdf 生成、相关API -> 正文阅读

[移动开发]# Itext Pdf 生成、相关API

Itext Pdf 生成、相关API

需求

  • 需求java代码生成PDF效果如下:后端生成 Pdf文件,内容包含基本信息表格,图片、pdf需要有页眉,pdf每页含有页码,pdf含有多页。
  • 上图看看最后生成的效果如下:
    在这里插入图片描述

功能实现

  • 使用 ItextPdf

引入依赖

  • 引入下面的依赖
<!-- itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>
<!-- pdf 中文支持 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

注意点

表格双边线的实现

  • 双边线的实现思路:使用多层单元格嵌套的效果显示所有单元格的边框

页眉和页码的实现

  • 继承PdfPageEventHelper重写对应的方法,在响应的方法中完成相关逻辑。

代码

  • ItextPdfUtils.java
public class ItextPdfUtils {

    private static final Logger logger = LoggerFactory.getLogger(ItextPdfUtils.class);
    public static final int TWENTY = 20;
    public static final int Thirty = 30;
    public static final int TWELVE = 12;

    /**
     * 中文字体,解决中文不能显示问题
     */
    public static BaseFont baseFontChinese = null;
    public static Font font = null;
    public static Font blueFont = null;
    public static Font smallThreeFont = null;
    public static Font fiveFont = null;
    public static Font smallFiveFont = null;
    public static Font smallSixFont = null;
    public static Font greenFont = null;
    public static Font messFont = null;
    public static Font titleFont = null;

    static {
        try {
            baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            font = new Font(baseFontChinese);
            font.setSize(10);
            blueFont = new Font(baseFontChinese);
            blueFont.setColor(BaseColor.BLUE);
            blueFont.setSize(5);
            smallThreeFont = new Font(baseFontChinese, TWENTY);
            smallThreeFont.setColor(BaseColor.BLACK);
            fiveFont = new Font(baseFontChinese);
            fiveFont.setColor(BaseColor.BLACK);
            fiveFont.setSize(10.5f);
            smallFiveFont = new Font(baseFontChinese);
            smallFiveFont.setColor(BaseColor.BLACK);
            smallFiveFont.setSize(9);
            smallSixFont = new Font(baseFontChinese);
            smallSixFont.setColor(BaseColor.BLACK);
            smallSixFont.setSize(6.5f);
            greenFont = new Font(baseFontChinese, TWELVE, Font.BOLD);
            greenFont.setColor(BaseColor.BLACK);
            messFont = new Font(baseFontChinese, 12);
            messFont.setColor(BaseColor.BLACK);
            titleFont = new Font(baseFontChinese, 14, Font.BOLD);
            titleFont.setColor(BaseColor.BLACK);
        } catch (Exception e) {
            logger.error("Error Occur:{0}", e);
        }
    }

    /**
     * pdf 页面生成
     *
     * @param writer
     * @param yeMei
     * @param fontSize
     * @param pageSize
     */
    public static void setFooter(PdfWriter writer, String yeMei, int fontSize, Rectangle pageSize) {
        ItextPdfHeaderFooter headerFooter = new ItextPdfHeaderFooter(yeMei, pageSize);
        writer.setPageEvent(headerFooter);
    }


    public static PdfPCell getCell(String title, Font font, int miniMumHeight, int alignMiddle) {
        PdfPCell pdfPCell;
        pdfPCell = new PdfPCell(new Phrase(title, font));
        pdfPCell.setMinimumHeight(miniMumHeight);
        pdfPCell.setVerticalAlignment(alignMiddle);
        return pdfPCell;
    }

    public static PdfPCell getCell(String title, Font font, int miniMumHeight) {
        PdfPCell pdfPCell;
        pdfPCell = new PdfPCell(new Phrase(title, font));
        pdfPCell.setMinimumHeight(miniMumHeight);
        return pdfPCell;
    }

    public static PdfPCell getCell(String title, Font font, int miniMumHeight, boolean useAscender, int horizontalAlignment, int verticalAlignment) {
        PdfPCell pdfPCell;
        pdfPCell = new PdfPCell(new Phrase(title, font));
        pdfPCell.setUseAscender(useAscender);
        pdfPCell.setMinimumHeight(miniMumHeight);
        pdfPCell.setVerticalAlignment(verticalAlignment);
        pdfPCell.setHorizontalAlignment(horizontalAlignment);
        return pdfPCell;
    }

    public static PdfPCell getCell(String title, Font font, int miniMumHeight, boolean useAscender, int horizontalAlignment, int verticalAlignment, int colSpan) {
        PdfPCell pdfPCell;
        pdfPCell = new PdfPCell(new Phrase(title, font));
        pdfPCell.setUseAscender(useAscender);
        pdfPCell.setMinimumHeight(miniMumHeight);
        pdfPCell.setVerticalAlignment(verticalAlignment);
        pdfPCell.setHorizontalAlignment(horizontalAlignment);
        pdfPCell.setColspan(colSpan);
        return pdfPCell;
    }

    public static PdfPCell getCell(String title, Font font, Integer miniMumHeight, Boolean useAscender, Integer horizontalAlignment, Integer verticalAlignment, Integer colSpan, Integer rowSpan, Integer border, Integer borderWidthTop, Integer borderWidthLeft, Integer borderWidthRight) {
        Phrase phrase = new Phrase(title, font);
        PdfPCell pdfPCell = new PdfPCell(phrase);
        if (Objects.nonNull(miniMumHeight)) {
            pdfPCell.setMinimumHeight(miniMumHeight);
        }
        if (Objects.nonNull(useAscender)) {
            pdfPCell.setUseAscender(useAscender);
        }
        if (Objects.nonNull(horizontalAlignment)) {
            pdfPCell.setHorizontalAlignment(horizontalAlignment);
        }
        if (Objects.nonNull(verticalAlignment)) {
            pdfPCell.setVerticalAlignment(verticalAlignment);
        }
        if (Objects.nonNull(colSpan)) {
            pdfPCell.setColspan(colSpan);
        }
        if (Objects.nonNull(rowSpan)) {
            pdfPCell.setRowspan(rowSpan);
        }
        if (Objects.nonNull(border)) {
            pdfPCell.setBorder(border);
        }
        if (Objects.nonNull(borderWidthTop)) {
            pdfPCell.setBorderWidthTop(borderWidthTop);
        }
        if (Objects.nonNull(borderWidthLeft)) {
            pdfPCell.setBorderWidthLeft(borderWidthLeft);
        }
        if (Objects.nonNull(borderWidthRight)) {
            pdfPCell.setBorderWidthRight(borderWidthRight);
        }
        return pdfPCell;
    }
}
  • ItextPdfTest.java
public class ItextPdfTest {

    private static final Logger logger = LoggerFactory.getLogger(ItextPdfUtils.class);

    private static final float[] columnWidths5 = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f};

    /**
     * 生成 ItextPdf
     *
     * @return String
     */
    private String createItextPdf() {
        Date date = new Date();
        String startTime = new SimpleDateFormat("yyyyMMddHHmmss").format(date);
        String fileName = "demo";
        String oldPath = fileName + ".pdf";
        // 创建文件
        Document document = new Document();
        PdfWriter writer = null;
        try {
            document.setPageSize(PageSize.A4);
            // 建立一个书写器
            writer = PdfWriter.getInstance(document, new FileOutputStream(oldPath));
            ItextPdfUtils.setFooter(writer, "测试页眉", 12, PageSize.LEGAL);
            // 打开文件
            document.open();

            // 总表设计一个 4 列的表.
            PdfPTable table = new PdfPTable(4);
            table.setWidthPercentage(100);
            table.setSpacingBefore(100f);
            table.setSpacingAfter(10f);

            // 设置列宽
            float[] columnWidths = {0.8f, 0.8f, 0.5f, 0.5f};
            table.setWidths(columnWidths);

            PdfPCell cell;
            // 第一行
            table.addCell(ItextPdfUtils.getCell("", null, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, 0, 0, 0));
            table.addCell(ItextPdfUtils.getCell("ItextPdf 打印测试", smallThreeFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, 0, 0, 0));
            table.addCell(ItextPdfUtils.getCell("", fiveFont, TWENTY, true, Cell.ALIGN_RIGHT, Cell.ALIGN_BOTTOM, 2, null, 0, null, null, null));
            // 第三行
            table.addCell(ItextPdfUtils.getCell("记录人:张三", fiveFont, TWENTY, true, Cell.ALIGN_LEFT, Cell.ALIGN_MIDDLE, 0, null, 0, null, null, null));
            table.addCell(ItextPdfUtils.getCell("打印日期:" + new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()), fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE, 0, null, 0, null, null, null));
            table.addCell(ItextPdfUtils.getCell("编号:AAAAAAAAAAAAA号", fiveFont, TWENTY, true, Cell.ALIGN_RIGHT, Cell.ALIGN_MIDDLE, 2, null, 0, null, null, null));

            // 第一个表格
            PdfPTable personInfoTable = new PdfPTable(5);
            float[] headerTableColumnWidth = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f};
            personInfoTable.setWidthPercentage(100);
            personInfoTable.setWidths(headerTableColumnWidth);
            personInfoTable.addCell(ItextPdfUtils.getCell("编号", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("姓名", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));

            Image img = Image.getInstance("demo.jpg");
            PdfPCell imageCell = new PdfPCell(new Phrase("照片", fiveFont));
            imageCell.setVerticalAlignment(Cell.ALIGN_MIDDLE);
            imageCell.setHorizontalAlignment(Cell.ALIGN_CENTER);
            imageCell.setRowspan(4);
            imageCell.setImage(img);
            personInfoTable.addCell(imageCell);
            personInfoTable.addCell(ItextPdfUtils.getCell("性别", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("籍贯", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("民族", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("出生日期", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("政治面貌", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("学历", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            personInfoTable.addCell(ItextPdfUtils.getCell("", fiveFont, Thirty, Cell.ALIGN_MIDDLE));
            PdfPCell personInfoCell = new PdfPCell(new Phrase(""));
            personInfoCell.setColspan(4);
            personInfoCell.addElement(personInfoTable);
            // 表格的总行高
            personInfoCell.setFixedHeight(120);
            table.addCell(personInfoCell);

            // 备注说明
            PdfPTable remarkTable = new PdfPTable(2);
            remarkTable.setWidthPercentage(100);
            float[] remarkColumnWidth = {0.1f, 0.9f};
            remarkTable.setWidths(remarkColumnWidth);
            PdfPCell remarkCell;
            remarkCell = new PdfPCell(new Phrase("情况说明(个人家庭情况做简单说明):", fiveFont));
            remarkCell.setHorizontalAlignment(Cell.ALIGN_CENTER);
            remarkCell.setVerticalAlignment(Cell.ALIGN_MIDDLE);
            remarkTable.addCell(remarkCell);
            remarkCell = new PdfPCell(new Phrase("", fiveFont));
            remarkCell.setMinimumHeight(200);
            remarkTable.addCell(remarkCell);

            PdfPCell remark = new PdfPCell(new Phrase(""));
            remark.setMinimumHeight(200);
            remark.setColspan(4);
            remark.addElement(remarkTable);
            table.addCell(remark);

            // 姓名性别表格
            PdfPTable mainLeftTable = new PdfPTable(2);
            mainLeftTable.setWidthPercentage(100);
            float[] columnWidths0 = {0.8f, 0.8f};
            mainLeftTable.setWidths(columnWidths0);

            mainLeftTable.addCell(ItextPdfUtils.getCell("家庭成员", fiveFont, 28, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("身份证号", fiveFont, 28, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("李四", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("王五", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("王五", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            mainLeftTable.addCell(ItextPdfUtils.getCell("632123111100000000", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));

            //左上角
            cell = new PdfPCell(new Phrase("", fiveFont));
            cell.setMinimumHeight(80);
            cell.setUseAscender(true);
            cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
            cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);
            cell.setRowspan(5);
            cell.setColspan(2);
            cell.setBorderWidthRight(0);
            cell.setBorderWidthBottom(0);
            cell.setPaddingRight(-0.2f);
            cell.addElement(mainLeftTable);
            table.addCell(cell);

            // 设计一个3列的表.
            PdfPTable rightOne = new PdfPTable(3);
            // 宽度100%填充
            rightOne.setWidthPercentage(100);
            float[] columnWidths1 = {0.06f, 0.06f, 0.06f};
            rightOne.setWidths(columnWidths1);

            rightOne.addCell(ItextPdfUtils.getCell("正常收入", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP, 3));
            rightOne.addCell(ItextPdfUtils.getCell("千", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            rightOne.addCell(ItextPdfUtils.getCell("百", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            rightOne.addCell(ItextPdfUtils.getCell("十", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            // 正常收入  3行
            for (int i = 0; i < 9; i++) {
                rightOne.addCell(ItextPdfUtils.getCell("", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            }
            //正常收入 3行
            cell = new PdfPCell(new Phrase("", fiveFont));
            cell.setMinimumHeight(68);
            cell.setUseAscender(true);
            cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
            cell.setVerticalAlignment(Cell.ALIGN_TOP);
            cell.setBorderWidthRight(0);
            cell.setBorderWidthLeft(0);
            cell.setBorderWidthBottom(0);
            cell.setPaddingLeft(2.5f);
            cell.setPaddingBottom(-3);
            cell.setRowspan(5);
            cell.addElement(rightOne);
            table.addCell(cell);

            // 设计一个 3 列的表.
            PdfPTable rightTwo = new PdfPTable(3);
            // 宽度100%填充
            rightTwo.setWidthPercentage(102);
            // 设置列宽
            float[] columnWidths2 = {0.06f, 0.06f, 0.06f};
            rightTwo.setWidths(columnWidths2);
            PdfPCell cell2;
            rightTwo.addCell(ItextPdfUtils.getCell("补助", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP, 3));
            rightTwo.addCell(ItextPdfUtils.getCell("千", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            rightTwo.addCell(ItextPdfUtils.getCell("百", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            rightTwo.addCell(ItextPdfUtils.getCell("十", fiveFont, 14, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));
            // 补助 3 行
            for (int i = 0; i < 9; i++) {
                rightTwo.addCell(ItextPdfUtils.getCell("十", fiveFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_TOP));

            }
            // 补助 3行
            cell = new PdfPCell(new Phrase("", fiveFont));
            cell.setMinimumHeight(80);
            cell.setUseAscender(true);
            cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
            cell.setVerticalAlignment(Cell.ALIGN_TOP);
            cell.setBorderWidthLeft(0);
            cell.setBorderWidthBottom(0);
            cell.setPaddingRight(3);
            cell.setPaddingBottom(-3);
            cell.setRowspan(5);
            cell.addElement(rightTwo);
            table.addCell(cell);

            // 设计一个1列的表.
            PdfPTable table4 = new PdfPTable(1);
            table4.setWidthPercentage(100);
            float[] columnWidths4 = {1.6f};
            table4.setWidths(columnWidths4);
            table4.addCell(ItextPdfUtils.getCell("金额合计:捌佰陆拾壹元陆角玖分", fiveFont, TWENTY, true, Cell.ALIGN_LEFT, Cell.ALIGN_MIDDLE));

            //最后一行
            cell = new PdfPCell(new Phrase("", fiveFont));
            cell.setBorderWidthRight(0);
            cell.setBorderWidthTop(0);
            cell.setPaddingRight(-0.2f);
            cell.setPaddingTop(-0.5f);
            cell.addElement(table4);
            cell.setColspan(2);
            table.addCell(cell);

            // 设计一个 3 列的表.
            PdfPTable table3 = new PdfPTable(3);
            table3.setWidthPercentage(102);
            float[] columnWidths3 = {0.06f, 0.06f, 0.06f,};
            table3.setWidths(columnWidths3);
            for (int i = 0; i < 3; i++) {
                table3.addCell(ItextPdfUtils.getCell("", smallSixFont, TWENTY, true, Cell.ALIGN_CENTER, Cell.ALIGN_MIDDLE));
            }
            cell = new PdfPCell(new Phrase("", smallFiveFont));
            cell.setBorderWidthRight(0);
            cell.setBorderWidthLeft(0);
            cell.setBorderWidthTop(0);
            cell.setPaddingLeft(2.5f);
            cell.setPaddingTop(-0.5f);
            cell.addElement(table3);
            table.addCell(cell);

            cell = new PdfPCell(new Phrase("", smallFiveFont));
            cell.setBorderWidthLeft(0);
            cell.setBorderWidthTop(0);
            cell.setPaddingTop(-0.5f);
            cell.setPaddingRight(3);
            cell.addElement(table3);
            table.addCell(cell);


            // 领导意见
            PdfPTable remarkTableOne = new PdfPTable(2);
            remarkTableOne.setWidthPercentage(100);
            remarkTableOne.setWidths(remarkColumnWidth);
            remarkTableOne.addCell(ItextPdfUtils.getCell("领导意见", fiveFont, 200, true, Cell.ALIGN_CENTER, Cell.ALIGN_CENTER));
            remarkTableOne.addCell(ItextPdfUtils.getCell("", fiveFont, 200, true, Cell.ALIGN_CENTER, Cell.ALIGN_CENTER));
            remarkTableOne.addCell(ItextPdfUtils.getCell("", fiveFont, 200));
            PdfPCell remarkOne = new PdfPCell(new Phrase(""));
            remarkOne.setMinimumHeight(200);
            remarkOne.setColspan(4);
            remarkOne.addElement(remarkTableOne);
            table.addCell(remarkOne);


            document.add(table);

            // 表尾
            Paragraph paragraphTail = new Paragraph("制单人:李某某", fiveFont);
            paragraphTail.setLeading(10);
            paragraphTail.setAlignment(Element.ALIGN_LEFT);
            document.add(paragraphTail);

            // 第二页
            createTwoPage(document);
        } catch (Exception e) {
            logger.error("Error Occur:", e);
        } finally {
            // 关闭文档
            document.close();
            // 关闭书写器
            if (writer != null) {
                writer.close();
            }
        }
        return oldPath;
    }

    /**
     * 第二三页的内容
     *
     * @param document
     * @throws DocumentException
     */
    private void createTwoPage(Document document) throws DocumentException {
        document.newPage();
        document.setMargins(4, 4, 4, 50);
        document.addAuthor("张三");
        document.addHeader("测试", "测试打印页头部");
        PdfPTable table = new PdfPTable(5);
        table.setWidths(columnWidths5);
        table.setWidthPercentage(100);
        PdfPCell cell;
        for (int i = 0; i < 500; i++) {
            if (i <= 4) {
                cell = new PdfPCell(new Phrase("测试列" + i, fiveFont));
                cell.setMinimumHeight(20);
            } else {
                cell = new PdfPCell(new Phrase(String.valueOf(i), fiveFont));
                cell.setMinimumHeight(15);
            }
            table.addCell(cell);
        }
        document.add(table);
    }

    @Test
    public void test1() {
        createItextPdf();
    }
}
  • 页眉和页码处理:ItextPdfHeaderFooter.java
public class ItextPdfHeaderFooter extends PdfPageEventHelper {

    public String header;

    public PdfTemplate total;

    public Rectangle pageSize;

    public ItextPdfHeaderFooter(String yeMei, Rectangle pageSize) {
        this.header = yeMei;
        this.pageSize = pageSize;
    }

    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        // 写入页眉
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, ItextPdfUtils.font), document.left(250), document.top() + 20, 0);
        // 写入前半部分的 第 X页/共
        int pageS = writer.getPageNumber();
        String foot1 = "第 " + pageS + "页 / 共";
        Phrase footer = new Phrase(foot1, ItextPdfUtils.font);
        // 计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
        float len = ItextPdfUtils.baseFontChinese.getWidthPoint(foot1, ItextPdfUtils.font.getSize());
        // 拿到当前的PdfContentByte
        PdfContentByte cb = writer.getDirectContent();
        // 写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了 ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);
        // 写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y 轴和之前的保持一致,底边界-20
        cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20);
    }

    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
        // 关闭文档的时候,将模板替换成实际的 Y 值
        total.beginText();
        // 生成的模版的字体、颜色
        total.setFontAndSize(ItextPdfUtils.baseFontChinese, ItextPdfUtils.font.getSize());
        String foot = (writer.getPageNumber()) + "页";
        // 模版显示的内容
        total.showText(foot);
        total.endText();
        total.closePath();
    }
}

完整代码

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:54:07  更:2022-04-18 17:54:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:41:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码