itext 7 使用总结

一、引入依赖

<!--        引入ITEXT-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.9</version>
            <type>pom</type>
        </dependency>

二、官方文档

iText Javadoc Home,不同版本差距很大,这里引入的是7.1.9,选择该版本进去查看。

三、起步练习:创建一个Pdf文件,包含一个空白页

    //桌面路径,
    private static final String des="C:\\Users\\yl\\Desktop\\";

    //创建一个空白PDF
    @Test
    public void addEmptyPDF() throws FileNotFoundException {
        //创建一个空白pdf思路
        //Document<-PdfDocument<-PdfWriter
        //PdfWriter<-path
        //PdfDocument<-addNewPage()

        // 1、创建一个 PdfWriter ,参数为创建的路径
        String dest = des+"sample.pdf";
        PdfWriter writer = new PdfWriter(dest);

        // 2、创建一个 PdfDocument,参数为PdfWriter
        PdfDocument pdfDoc = new PdfDocument(writer);

        // 3、用PdfDocument创建一个空白 page 
        pdfDoc.addNewPage();

        // 4、创建一个 Document,参数为PdfDocument
        Document document = new Document(pdfDoc);

        // 5、关闭 document,PdfDocument
        document.close();
        pdfDoc.close();
    }

四、起步练习:创建分页

//创建区域中断对象AreaBreak,分页功能
    @Test
    public void newAreaBreak() throws FileNotFoundException {
        //创建区域中断对象AreaBreak,结果是两页的空白页
        //Document<-PdfDocument<-PdfWriter
        //PdfWriter<-path
        //Document.add(new AreaBreak())


       
        String dest = des+"addingAreaBreak.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);

        // 创建一个 Area Break
        AreaBreak aB = new AreaBreak();

        // 添加到 PDF
        document.add(aB);

       
        document.close();
        pdf.clost();
}

 五、起步练习:创建一个段落

//创建一个段落
    @Test
    public void addingParagraph() throws FileNotFoundException {
        // Creating a PdfWriter
        String dest = des+"addingParagraph.pdf";
        PdfWriter writer = new PdfWriter(dest);


        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);

        String para1 = "段落1的内容";

        String para2 = "段落2的内容";

        // 创建段落 Paragraphs
        Paragraph paragraph1 = new Paragraph(para1);
        Paragraph paragraph2 = new Paragraph(para2);

        // 把段落添加到 document
        document.add(paragraph1);
        document.add(paragraph2);

        // 关闭
        document.close();
        pdf.close;
    }

六、起步练习:创建一个表格

 //创建一个 Table 对象
    @Test
    public void addingTable() throws FileNotFoundException {
        String dest = des+"addingTable.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdf = new PdfDocument(writer);
        Document doc = new Document(pdf);
        // 创建表格 table
        //三个参数代表这个表格有三列,每列的宽度是150
        float [] pointColumnWidths = {150F, 150F, 150F};
        Table table = new Table(pointColumnWidths);

        // 逐个单元格添加内容到表格 table
        table.addCell("表头1内容");
        table.addCell("表头2内容");
        table.addCell("表头3内容");
        table.addCell("单元格1内容");
        table.addCell("单元格2内容");
        table.addCell("单元格3内容");

        //把表格添加到document
        doc.add(table);

        // 关闭
        doc.close();
        pdf.close();

    }

七、开始使用:设置页面大小和边距

        //设置页面大小A4 页边距40
        //Document
        Document document = new Document(pdfDocument,PageSize.A4);
        document.setBottomMargin(40);
        document.setLeftMargin(40);
        document.setRightMargin(40);
        document.setTopMargin(50);

八、开始使用:中文输出和字体解决

宋体细体,ITEXT本身有,可以直接使用。使用它就能输出中文。

这里添加了华文琥珀和黑体两个字体,将字体拷贝的项目的资源目录下,不拷贝也行,定义的路径直接指向系统字体库。

 //字体设置,解决中文输出问题 宋体细体,ITEXT集成的。
        PdfFont  sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
        // 创建字体  STHUPO.TTF 华文琥珀,simhei.ttf黑体
        //定义字体存放路径
        String fontsPath=this.getClass().getResource("/").getPath()+"static/fonts/";
        PdfFont boldFont = PdfFontFactory.createFont(fontsPath+"STHUPO.TTF", PdfEncodings.IDENTITY_H,true);
        PdfFont heitiFont = PdfFontFactory.createFont(fontsPath+"simhei.ttf", PdfEncodings.IDENTITY_H,true);

        //添加首页标题,字体大小30
        Text titleText=new Text("健康体检报告").setFont(boldFont).setFontSize(30);
        Paragraph titelPara=new Paragraph(titleText);
        //设置对齐方式,上边距30,下边距30,文本居中
        document.add(titelPara.setMarginTop(30).setMarginBottom(30).setTextAlignment(TextAlignment.CENTER));

九、开始使用:添加图片

//添加图片
        //获取图片路径
        String imagePath=this.getClass().getResource("/").getPath()+"static/img/wanguan.jpg";
        //创图片
        ImageData logoImageData= ImageDataFactory.create(imagePath);
        Image logoImg = new Image(logoImageData);
        //添加图片,设置宽度、高度,在页面中的坐标(left,bottom)
        logoImg.setWidth(400).setHeight(315).setFixedPosition(100,240);
        document.add(logoImg);

十、特殊需求:体检表格中如果结果列是异常的,让该单元格显示红色


            //五列,EResultDetail对象是体检结果对象,
            float [] pointColumnWidths = {230F, 90F,70F,60F, 85F};
            Table table = new Table(pointColumnWidths);
            table.addCell("项目");
            table.addCell("结果");
            table.addCell("异常指标");
            table.addCell("单位");
            table.addCell("正常值范围");
            List<EResultDetail> resultDetailList = eExamResults.getResultDetailList();
            for (EResultDetail eResultDetail : resultDetailList) {
                table.addCell(eResultDetail.getItemName()+"");
                table.addCell(eResultDetail.getResult()+"");
                //异常指标设置红色
                //从对象中取值,如果空就写空串
                String abnor=eResultDetail.getAbnormalResult()==null?"":eResultDetail.getAbnormalResult()+"";
                //创建一个单元格
                Cell cell = new Cell();
                cell.add((IBlockElement) new Paragraph(abnor));
                //如果单元格内容不为空,设置该单元格的字体颜色为红色
                if(!abnor.equals("")){
                    cell.setFontColor(new DeviceRgb(255,0,0));
                }
                table.addCell(cell);
                table.addCell(eResultDetail.getUnit()+"");
                table.addCell(eResultDetail.getNormalValueRange()+"");
            }
            table.setFont(sysFont);
            document.add(table);

十一、特殊需求:设置页面页脚,并且在页眉上显示体检客户的基本信息和第几页

        实现需要分成两个步骤,

1、自定义一个ITEXT事件处理器,这个类需要实现IEvenHandler,在这个类里面写实现页眉页脚的逻辑;

2、在创建PdfDocument对象后调用该事件处理类即可。

处理器代码:

import com.hjt.point.model.mysql.EPatientInfo;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;
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.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;

import java.io.IOException;

public class PdfHandler implements IEventHandler {
    //定义一个变量对页面进行计数,第一页不加页眉页脚
    private int pageNumber = 0;

    private PdfDocument document;

    private EPatientInfo ePatientInfo;

    //定义这个构造器,为了能够在使用时给其传入要显示的信息数据
    public PdfHandler(EPatientInfo ePatientInfo) throws IOException {
        this.ePatientInfo = ePatientInfo;
    }
    //设置字体
    PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");

    //自己创建一个处理器,实现IEventHandler事件方法
    @Override
    public void handleEvent(Event event) {
        //如果传入的事件参数符合PdfDocumentEvent,执行相关逻辑
        if (event instanceof PdfDocumentEvent) {
            //强转一下参数
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            //获取到PdfDocument
            if (document == null) {
                document = docEvent.getDocument();
            }
            //获取到PdfPage
            PdfPage page = docEvent.getPage();
            //构建一个画布
            PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), document);


            if (docEvent.getType() == PdfDocumentEvent.START_PAGE) {
                pageNumber++;
                if (pageNumber > 1) {
                    // 设置页眉
                    //构建一个矩形,坐标为(0,页面高度-30),宽度:页面的宽度,高度:20
                    Rectangle startPageRec = new Rectangle(0, page.getPageSize().getHeight() - 30, page.getPageSize().getWidth(), 25);
                    //把构建的矩形在页面上画出来
                    Canvas headerCanvas = new Canvas(canvas, document, startPageRec);
                    //设置段落的内容
                    Paragraph headerParagraph = new Paragraph("姓名:"+ePatientInfo.getName()+"             性别:"
                            +ePatientInfo.getGender()+"             年龄:"+ePatientInfo.getAge()
                    +"           体检编号:"+ePatientInfo.getVisitSerialNumber()+ "             第"+pageNumber+"页")
                            .setTextAlignment(TextAlignment.CENTER).setFont(sysFont);
                    headerCanvas.add(headerParagraph);

                    // 在页眉下方添加横线
                    canvas.setLineWidth(1);
                    //横线的起点
                    canvas.moveTo(50, page.getPageSize().getHeight() - 32);
                    //横线的终点
                    canvas.lineTo(page.getPageSize().getWidth()-50, page.getPageSize().getHeight() - 32);
                    canvas.stroke();
                }

//            } else if (docEvent.getType() == PdfDocumentEvent.END_PAGE) {
                if (pageNumber > 1) {
                    // 设置页脚
                    Rectangle endPageRec = new Rectangle(page.getPageSize().getWidth(), 30);
                    Canvas footerCanvas = new Canvas(canvas, document, endPageRec);
                    Paragraph footerParagraph = new Paragraph("页脚广告语")
                            .setTextAlignment(TextAlignment.CENTER).setFont(sysFont);
                    footerCanvas.add(footerParagraph);

                    // 在页脚上方添加横线
                    canvas.setLineWidth(1);
                    canvas.moveTo(50, 32);
                    canvas.lineTo(page.getPageSize().getWidth()-50, 32);
                    canvas.stroke();
                }
            }
        }
    }
}
调用代码:

        //PdfWriter
        String  desc="C:/Users/yl/Desktop/"+epi.getName()+epi.getVisitSerialNumber()+".pdf";
        PdfWriter pdfWriter = new PdfWriter(desc);

        //PdfDocument
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        //调用设置页眉页脚的处理器
        PdfHandler pdfHandler = new PdfHandler(epi);
        pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE,pdfHandler);
        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,pdfHandler);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值