iText 5.x 生成PDF文件项目实操

一、项目需求

      通过调用接口获取某医院门诊日报表详情,在管理后台界面点击打印报表调用浏览器打印出日报表。后端编写接口,通过java用iText 5.x 生成PDF文件,前端调用该接口拿到pdf文件并调用浏览器打印出来。

二、后台代码

1.导入jar包依赖

<!-- 生成pdf要用的jar -->

<dependency>

  <groupId>com.itextpdf</groupId>

  <artifactId>itextpdf</artifactId>

  <version>5.5.10</version>

</dependency>

<!-- pdf输出中文要用的jar -->

<dependency>

  <groupId>com.itextpdf</groupId>

  <artifactId>itext-asian</artifactId>

  <version>5.2.0</version>

</dependency>

<!-- 设置pdf的打开密码要用的jar 【暂时没有用到】 -->

        <!--<dependency>

            <groupId>org.bouncycastle</groupId>

            <artifactId>bcprov-jdk15on</artifactId>

            <version>1.54</version>

        </dependency>-->

2.创建工具类

public class PdfFUtil {

// 最大宽度

    private static int maxWidth =520;

    /**------------------------创建表格单元格的方法start----------------------------*/

/**

* 创建单元格(指定字体)

*

    * @param value

    * @param font

    * @return

    */

    public static PdfPCellcreateCell(String value, Font font) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中

        cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中

        cell.setPhrase(new Phrase(value, font));

        return cell;

    }

/**

* 创建单元格(指定字体、设置单元格高度)

*

    * @param value

    * @param font

    * @return 申请事由——这行使用的方法

*/

    public static PdfPCellcreateCell(String value, Font font, float f) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

        cell.setHorizontalAlignment(Element.ALIGN_CENTER);

        cell.setPhrase(new Phrase(value, font));

        cell.setFixedHeight(f); // 设置表格中的单行高度

        return cell;

    }

/**

* 创建单元格(指定字体、水平局左/中/右)

*

    * @param value

    * @param font

    * @param align

    * @return

    */

    public static PdfPCellcreateCell(String value, Font font, int align) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中

        cell.setHorizontalAlignment(align); //水平居中

        cell.setPhrase(new Phrase(value, font));

        return cell;

    }

/**

* 创建单元格(指定字体、水平局左/中/右、单元格跨x列合并)

*

    * @param value

    * @param font

    * @param align

    * @param colspan

    * @return

    */

    public PdfPCellcreateCell(String value, Font font, int align, int colspan) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中

        cell.setHorizontalAlignment(align); //水平居中

        cell.setColspan(colspan);

        cell.setPhrase(new Phrase(value, font));

        return cell;

    }

/**

* 创建单元格(指定字体、水平居..、单元格跨x列合并、设置单元格内边距)

*

    * @param value

    * @param font

    * @param align

    * @param colspan

    * @param boderFlag

    * @return

    */

    public static PdfPCellcreateCell(String value, Font font, int align, int colspan, boolean boderFlag) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

        cell.setHorizontalAlignment(align);

        cell.setColspan(colspan);

        cell.setPhrase(new Phrase(value, font));

        cell.setPadding(3.0f);

        if (!boderFlag) {

cell.setBorder(0);

            /*cell.setPaddingTop(15.0f);

cell.setPaddingBottom(8.0f);*/

            cell.setPaddingTop(10.0f);

            cell.setPaddingBottom(7.0f);

        }else if (boderFlag) {

cell.setBorder(0);

            cell.setPaddingTop(0.0f);

            cell.setPaddingBottom(15.0f);

        }

return cell;

    }

/**

* 创建单元格(指定字体、水平..、边框宽度:0表示无边框、内边距)

*

    * @param value

    * @param font

    * @param align

    * @param borderWidth

    * @param paddingSize

    * @param flag

    * @return

    */

    public static PdfPCellcreateCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {

PdfPCell cell =new PdfPCell();

        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

        cell.setHorizontalAlignment(align);

        cell.setPhrase(new Phrase(value, font));

        cell.setBorderWidthLeft(borderWidth[0]);

        cell.setBorderWidthRight(borderWidth[1]);

        cell.setBorderWidthTop(borderWidth[2]);

        cell.setBorderWidthBottom(borderWidth[3]);

        cell.setPaddingTop(paddingSize[0]);

        cell.setPaddingBottom(paddingSize[1]);

        if (flag) {

cell.setColspan(2);

        }

return cell;

    }

/**------------------------创建表格单元格的方法end----------------------------*/

/**--------------------------创建表格的方法start----------------------------*/

/**

* 创建默认列宽,指定列数、水平(居中、右、左)的表格

*

    * @param colNumber

    * @param align

    * @return

    */

    public PdfPTablecreateTable(int colNumber, int align) {

PdfPTable table =new PdfPTable(colNumber);

        try {

table.setTotalWidth(maxWidth);

            table.setLockedWidth(true);

            table.setHorizontalAlignment(align);

            table.getDefaultCell().setBorder(1);

        }catch (Exception e) {

e.printStackTrace();

        }

return table;

    }

/**

* 创建指定列宽、列数的表格

*

    * @param widths

    * @return

    */

    public static PdfPTablecreateTable(float[] widths) {

PdfPTable table =new PdfPTable(widths);

        try {

table.setTotalWidth(maxWidth);

            table.setLockedWidth(true);

            table.setHorizontalAlignment(Element.ALIGN_CENTER);

            table.getDefaultCell().setBorder(1);

        }catch (Exception e) {

e.printStackTrace();

        }

return table;

    }

/**

* 创建空白的表格

*

    * @return

    */

    public PdfPTablecreateBlankTable()throws IOException, DocumentException {

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        Font keyfont =new Font(bfChinese, 10, Font.BOLD);

        PdfPTable table =new PdfPTable(1);

        table.getDefaultCell().setBorder(0);

        table.addCell(createCell("", keyfont));

        table.setSpacingAfter(20.0f);

        table.setSpacingBefore(20.0f);

        return table;

    }

/**--------------------------创建表格的方法end----------------------------*/

/** --------------------------页码方法start----------------------------*/

    public static void onEndPage(PdfWriter writer, Document document)throws IOException, DocumentException {

PdfContentByte cb = writer.getDirectContent();

        PdfTemplate tpl; // 页码模板用来固定显示数据

        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        tpl = writer.getDirectContent().createTemplate(100, 100);

        cb.saveState();

        String text ="第" + writer.getPageNumber() +"页";

        cb.beginText();

        cb.setFontAndSize(bfChinese, 8);

        cb.setTextMatrix(480, 35);//定位“第x页” 在具体的页面调试时候需要更改这xy的坐标

        cb.showText(text);

        cb.endText();

        //** 创建以及固定显示总页数的位置

        cb.addTemplate(tpl, 283, 10);//定位“y页” 在具体的页面调试时候需要更改这xy的坐标

        cb.stroke();

        cb.restoreState();

        cb.closePath();

    }

/**--------------------------页码方法end----------------------------*/

}

3.生成pdf的业务逻辑处理等

public class CreateFdf {

public static void pdf(/*String title, DailyFeeVo vo*/)throws Exception {

try {

//TODO 1.新建document对象

            Document document =new Document(PageSize.A5.rotate());// 建立一个Document对象

            //TODO 2.建立一个书写器(Writer)与document对象关联

//            File file = new File("D:\\"+title+".pdf"); //修改你要生成PDF的位置路径

            File file =new File("D:\\HHH.pdf"); //修改你要生成PDF的位置路径

            file.createNewFile();

            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));

            //TODO 3.打开文档

            document.open();

            //TODO 4.向文档中添加内容

            new CreateFdf().generatePDF(document,writer/*,vo*/); // 内容添加的方法

            //TODO 5.关闭文档

            document.close();

        }catch (Exception e) {

e.printStackTrace();

        }

}

// 生成PDF文件

    public void generatePDF(Document document,PdfWriter writer/*,DailyFeeVo vo*/)throws Exception {

PdfContentByte cd = writer.getDirectContent();

        Barcode128 code128 =new Barcode128();

        code128.setCodeType(code128.CODE128);

        code128.setCode("12312312312");

        code128.setBarHeight(28);

        code128.setFont(null); //设置为空,条形码下方的数字就没有了

        //todo 标题

        Paragraph paragraph =new Paragraph("XX医院门诊日汇总报表", titlefont_16);

        paragraph.setAlignment(1); //设置文字居中 0靠左  1,居中    2,靠右

        paragraph.setIndentationLeft(12); //设置左缩进

        paragraph.setIndentationRight(12); //设置右缩进

        paragraph.setFirstLineIndent(24); //设置首行缩进

        paragraph.setLeading(20f); //行间距

        paragraph.setSpacingBefore(5f); //设置段落上空白

        paragraph.setSpacingAfter(10f); //设置段落下空白

        //todo 第一行

    /*  PdfPTable table_0 = PdfFUtil.createTable(new float[] { 75, 110, 75, 140 });

table_0.addCell(PdfFUtil.createCell("xxxxxx:", textfont_10, Element.ALIGN_CENTER, 1, false));

table_0.addCell(PdfFUtil.createCell("xxxxxx", underlinefont_10, Element.ALIGN_LEFT, 1, false));

table_0.addCell(PdfFUtil.createCell("xxxxxx:", textfont_10, Element.ALIGN_CENTER, 1, false));

table_0.addCell(PdfFUtil.createCell("xxxxxx ", underlinefont_10, Element.ALIGN_LEFT, 1, false));

PdfPTable table_1 = PdfFUtil.createTable(new float[] { 75, 110, 75, 140 });

table_1.addCell(PdfFUtil.createCell("xxxxxx: ", textfont_10, Element.ALIGN_CENTER, 1, false));

table_1.addCell(PdfFUtil.createCell("xxxxxx", underlinefont_10, Element.ALIGN_LEFT, 1, false));

table_1.addCell(PdfFUtil.createCell("", textfont_10, Element.ALIGN_CENTER, 1, false));

table_1.addCell(PdfFUtil.createCell("", textfont_10, Element.ALIGN_LEFT, 1, false));*/

// 表格

        PdfPTable table = PdfFUtil.createTable(new float[] {80, 80, 80, 80,80 });

        table.addCell(PdfFUtil.createCell("项目", textfont_10));

        table.addCell(PdfFUtil.createCell("合计", textfont_10));

        table.addCell(PdfFUtil.createCell("移动平台", textfont_10));

        table.addCell(PdfFUtil.createCell("微信", textfont_10));

        table.addCell(PdfFUtil.createCell("支付宝", textfont_10));

        table.addCell(PdfFUtil.createCell("本日实收", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("本日应收", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("本日增加", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("本日减少", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("差异", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

        table.addCell(PdfFUtil.createCell("xxxxxx", textfont_10));

//        PdfPTable table_2 = PdfFUtil.createTable(new float[] { 75, 325});

//        table_2.addCell(PdfFUtil.createCell("申请事由", textfont_10,40f));

//        table_2.addCell(PdfFUtil.createCell("xxxxxx", textfont_10,40f));

//表格下的落款——xxxxxx、打印时间

        PdfPTable table_3 = PdfFUtil.createTable(new float[] {200, 200});

        table_3.addCell(PdfFUtil.createCell("审核", textfont_10, Element.ALIGN_LEFT, 1, false));

        table_3.addCell(PdfFUtil.createCell("制表科室", textfont_10, Element.ALIGN_LEFT, 1, false));

//        String sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

//        table_3.addCell(PdfFUtil.createCell("打印时间: "+sdf, textfont_10, Element.ALIGN_RIGHT, 1, false));

        document.add(paragraph); // 标题

//        document.add(table_0); // 显示第一行

//        document.add(table_1); // 显示第二行

        document.add(table); //表格数据

//        document.add(table_2); //表格的最后一行

        document.add(table_3); //表格下面的落款

    }

/************************* 全局变量 start *************************/

// 定义全局的字体静态变量

    private static Fonttitlefont_16;

    private static Fonttitlefontnormal_16;

    private static Fontheadfont_14;

    private static Fontheadfontnormal_14;

    private static Fontheadfont_12;

    private static Fontheadfontnormal_12;

    private static Fontkeyfont_10;

    private static Fonttextfont_10;

    private static Fontunderlinefont_10;

    // 静态代码块

    static {

try {

// 不同字体(这里定义为同一种字体:包含不同字号、不同style)

            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

            titlefont_16 =new Font(bfChinese, 16, Font.BOLD);

            headfont_14 =new Font(bfChinese, 14, Font.BOLD);

            headfont_12 =new Font(bfChinese, 12, Font.BOLD);

            keyfont_10 =new Font(bfChinese, 10, Font.BOLD);

            titlefontnormal_16 =new Font(bfChinese, 16, Font.NORMAL);

            headfontnormal_14 =new Font(bfChinese, 14, Font.NORMAL);

            headfontnormal_12 =new Font(bfChinese, 12, Font.NORMAL);

            textfont_10 =new Font(bfChinese, 10, Font.NORMAL);

            underlinefont_10 =new Font(bfChinese, 10, Font.UNDERLINE);

        }catch (Exception e) {

e.printStackTrace();

        }

}

/************************* 全局变量 end *************************/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容