2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Java用itextpdf生成pdf

Java用itextpdf生成pdf

时间:2024-02-27 02:38:14

相关推荐

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);}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。