天天看点

使用Itext向pdf文件末尾增加表格

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.tomcat.util.codec.binary.Base64;

import java.io.*;

/**
 *  <dependency>
 *             <groupId>com.itextpdf</groupId>
 *             <artifactId>itextpdf</artifactId>
 *             <version>5.5.13</version>
 *         </dependency>
 *         <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
 *         <dependency>
 *             <groupId>com.itextpdf</groupId>
 *             <artifactId>itext-asian</artifactId>
 *             <version>5.2.0</version>
 *         </dependency>
 *
 */
public class Itext1 {

    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(new File("D:/test1.pdf"));
            generateFinalPdf(fis,"D:/test2.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 生成版本的pdf
     * @param finalPath 的pdf生成路径
     * @throws Exception
     */
    private static String generateFinalPdf(FileInputStream fis, String finalPath ) throws Exception {
        String base64SPdf = "";
        FileOutputStream fos = new FileOutputStream(finalPath);
        //fos.write(fos);
        PdfReader reader = new PdfReader(fis);// 读取pdf模板
        Rectangle pageSize = reader.getPageSize(1);
        Document document = new Document(pageSize);

        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();
        PdfContentByte cbUnder = writer.getDirectContentUnder();

        int pageNums = reader.getNumberOfPages();
        PdfImportedPage pageTemplateAll = null;
        for (int i = 1; i <= pageNums; i++) {
            pageTemplateAll = writer.getImportedPage(reader,i);
            cbUnder.addTemplate(pageTemplateAll, 0, 0);
            document.newPage();
        }

        Paragraph paragraph = generatePdfATATable();//此处为生成的表格及内容方法
        document.add(paragraph);
        document.close();
        reader.close();

        //以下是将最终的pdf转为 base64
        File pdfFile = new File(finalPath);
        InputStream is;
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        is = new FileInputStream(pdfFile);
        byte[] b = new byte[is.available()];
        is.read(b);

        base64SPdf= Base64.encodeBase64String(b);
        is.close();
        bout.close();

        return base64SPdf;
    }

    /**
     * 生成pdf表格
     * @return
     * @see
     */
    private static Paragraph generatePdfATATable( ) throws Exception {
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font fontChinese = new Font(bfChinese, 10.5F, Font.NORMAL);// 五号
        Paragraph ret = new Paragraph("附表1: 还款计划表(元)", fontChinese);
        PdfPTable tableBox = new PdfPTable(4);
        tableBox.setWidths(new float[] { 0.2f, 0.2f, 0.2f, 0.2f });// 每个单元格占多宽
        tableBox.setWidthPercentage(80f);

        // 获取ATA分类的结果集
//        List<ParamRequest > ataList = paramRequest .getRepaylist();
        // 创建表格格式及内容
        tableBox.addCell(getCell(new Phrase("LoginName", fontChinese), false, 1, 1));
        tableBox.addCell(getCell(new Phrase("ApprovedDate", fontChinese), false, 1, 1));
        tableBox.addCell(getCell(new Phrase("Statuse", fontChinese), false, 1, 1));
        tableBox.addCell(getCell(new Phrase("ReviewComments", fontChinese), false, 1, 1));

        // 遍历查询出的结果
        for (int i=0;i<60;i++) {
            tableBox.addCell(getCell(new Phrase("account"+i, fontChinese), false, 1, 1));
            tableBox.addCell(getCell(new Phrase("2021-1-1", fontChinese), false, 1, 1));
            tableBox.addCell(getCell(new Phrase("approve", fontChinese), false, 1, 1));
            tableBox.addCell(getCell(new Phrase("null", fontChinese), false, 1, 1));

        }

        ret.add(tableBox);
        return ret;

    }

    /*每个cell的格式,合并单元格情况*/

    private static PdfPCell getCell(Phrase phrase, boolean yellowFlag, int colSpan, int rowSpan) {
        PdfPCell cells = new PdfPCell(phrase);
        cells.setUseAscender(true);
        cells.setMinimumHeight(20f);
        cells.setHorizontalAlignment(1);
        cells.setVerticalAlignment(5);
        cells.setColspan(colSpan);
        cells.setRowspan(rowSpan);
        cells.setNoWrap(false);
        return cells;
    }

}