因项目需求,要把数据生成到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);
}
到此主要的内容也就结束了,其余的就是根据自己业务进行判断相关的了