Java用itextpdf生成pdf

因项目需求,要把数据生成到pdf中,并且还要可以画印章,也是初学,找资料,终于搞定了

我的做法是在pdf中画表格;我们最后的效果如下

首先建立一个pdf书写器

 // 建立一个Document对象
 // 2.建立一个书写器(Writer)与document对象关联
 PdfWriter writer = PdfWriter.getInstance(document, out);
//此处是插入水印
 writer.setPageEvent(new Watermark("水印 "));
// writer.setPageEvent(new HeaderFooter());// 页眉/页脚
 // PdfWriter.ALLOW_PRINTING 0xffffffff
//permissions &= 0xfffffffc;
writer.setEncryption(null, "123456".getBytes(),
PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
//writer.setEncryption(null, "123456".getBytes(), 0xfffff0c0, PdfWriter.STANDARD_ENCRYPTION_128);
 // 3.打开文档
 document.open();

下面是我的具体内容的插入,因为我最后的效果是要一行里面展示的文字大小和颜色不一致,我使用的方法是,一段落是一个整体,就是pdf的段落,段落里面再具体加入每一块儿;具体如下:

//创建一个表格
PdfPTable table3 = PdfReportUtil.createTable(new float[]{100});
//创建一个段落 
Paragraph p3 = new Paragraph("", PdfReportUtil.TEXT_12_FONT);
//新建一个字体对象,可以设置字体大学和颜色等
 Font font1 = new Font();
 font1.setSize(12f);
//新建一个内容块
 Chunk chunks1 = new Chunk(courseAndExamStr.toString() + "  ");
 chunks1.setFont(font1);
//将内容块加入段落
 p3.add(chunks1);

 String izPassStr = courseVO.getIzPassStr();
 if (!StringUtils.isBlankExcludeNullStr(izPassStr)) {
    Font passFont = new Font();
    passFont.setSize(12f);
    if (courseVO.getIzPass().equals(YesNoEnum.NO.getCode())) {
    //设置文字颜色
        passFont.setColor(new BaseColor(215, 55, 63));
    }
    Chunk chunk1 = new Chunk(izPassStr);
    chunk1.setFont(passFont);
    chunk1.setLineHeight(12f);
    p3.add(chunk1);
 }
 String examScoreStr = courseVO.getExamScoreStr();

 if (!StringUtils.isBlankExcludeNullStr(examScoreStr)) {
      Font examScoreFont = new Font();
      examScoreFont.setSize(10f);
      examScoreFont.setColor(new BaseColor(201, 201, 201));
      Chunk chunk1 = new Chunk("  " + examScoreStr);
      chunk1.setFont(examScoreFont);
      chunk1.setLineHeight(10f);
      p3.add(chunk1);
   }
//新建一个pdf的表格单元格
 PdfPCell cell1 = new PdfPCell();
 cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
 cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
 cell1.setColspan(1);
//将段落添加到单元格内
 cell1.setPhrase(p3);
 cell1.setPadding(1.0f);
 cell1.setBorder(0);
 cell1.setPaddingTop(5.0f);
 cell1.setPaddingBottom(5.0f);
//将单元格加入表格里
 table3.addCell(cell1);
//将这个表格加入到pdf里
 document.add(table3);

主要内容结束后,就开始右下角的盖章和标注数据:

也是通过表格插入数据,图片是通过把图片base64的流生成图片,然后插入到pdf中

 //右下角盖章处
 PdfPTable table2 = PdfReportUtil.createTable(new float[]{100});
 table2.addCell(PdfReportUtil.createCellPadding("数据中心", PdfReportUtil.TEXT_12_FONT, Element.ALIGN_RIGHT, 1, false, 3.0f));
 table2.addCell(PdfReportUtil.createCellPadding("运营组", PdfReportUtil.TEXT_12_FONT, Element.ALIGN_RIGHT, 1, false, 3.0f));
table2.addCell(PdfReportUtil.createCellPadding(DateUtils.formatDateTime(), PdfReportUtil.TEXT_12_FONT, Element.ALIGN_RIGHT, 1, false, 3.0f));
document.add(table2);
//获取当前内容的高度
float height1 = currentHeight(writer);
// 获取页面总高度
float heights = document.getPageSize().getHeight();
//添加图片
BufferedImage bufferedImage = CodeUtil.base64ToBufferedImage(studentSpecialCourseSeal);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();
Image image = Image.getInstance(imageInByte);
image.scalePercent(62);
float h = new BigDecimal(0.62).multiply(new BigDecimal(image.getHeight())).divide(new BigDecimal(2), 2, RoundingMode.HALF_UP).floatValue();
//此处是设置图片印章的位置,让印章可以跟着文字内容变化
image.setAbsolutePosition(420, (heights - height1) - h);
//图片填充方式
image.setAlignment(Image.UNDERLYING);
document.add(image);

获取pdf当前内容的高度

public static float currentHeight(PdfWriter writer) throws ReflectiveOperationException {
        Method getPdfDocument = writer.getClass().getDeclaredMethod("getPdfDocument");
        getPdfDocument.setAccessible(true);
        PdfDocument pdfD = (PdfDocument) getPdfDocument.invoke(writer);
        Field getHeight = pdfD.getClass().getDeclaredField("currentHeight");
        getHeight.setAccessible(true);
        return (float) getHeight.get(pdfD);
    }

到此主要的内容也就结束了,其余的就是根据自己业务进行判断相关的了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值