700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用itext为PDF添加批注文字

使用itext为PDF添加批注文字

时间:2021-12-24 13:03:42

相关推荐

使用itext为PDF添加批注文字

maven依赖

<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.12</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-xtra</artifactId><version>5.5.12</version><exclusions><exclusion><groupId>mons</groupId><artifactId>commons-imaging</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.12</version></dependency>

辅助实体类

@Datapublic class PdfAddContentParm {// 要添加的文字private String content;// 页码private Integer pageNum;// 关键字private String keyword;// 文本框坐标(左下角x,y,右上角x,y)private Float llx;private Float lly;private Float urx;private Float ury;public PdfAddContentParm() {}public PdfAddContentParm(String content, Integer pageNum, Float llx, Float lly, Float urx, Float ury) {this.content = content;this.pageNum = pageNum;this.llx = llx;this.lly = lly;this.urx = urx;this.ury = ury;}public PdfAddContentParm(String content, String keyword, Float llx, Float lly, Float urx, Float ury) {this.content = content;this.keyword = keyword;this.llx = llx;this.lly = lly;this.urx = urx;this.ury = ury;}}

按坐标添加批注

public static byte[] pdfAddContent(String filePath, List<PdfAddContentParm> pdfAddContentParms) throws Exception {PdfReader pdfReader = new PdfReader(filePath);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//设置输入文件以及输出文件地址PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);//设置字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {Font font = new Font(baseFont, 10);PdfContentByte overContent = stamper.getOverContent(pdfAddContentParm.getPageNum());ColumnText columnText = new ColumnText(overContent);columnText.setSimpleColumn(pdfAddContentParm.getLlx(), pdfAddContentParm.getLly(), pdfAddContentParm.getUrx(), pdfAddContentParm.getUry());Paragraph elements = new Paragraph(pdfAddContentParm.getContent());elements.setFont(font);columnText.addElement(elements);columnText.go();}stamper.close();return byteArrayOutputStream.toByteArray();}

按关键字添加批注

思路是:定位到关键字---->获取关键字的坐标---->根据关键字的坐标偏移得到要添加批注的坐标---->按坐标添加批注

private static byte[] pdfAddContByKeyword(String filename, List<PdfAddContentParm> pdfAddContentParms) throws Exception {PdfReader pdfReader = new PdfReader(filename);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//设置输入文件以及输出文件地址PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);// 获取PDF文件的总页数int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {StringBuilder stringBuilder = new StringBuilder("");final boolean[] hasKeyword = {false, true};String keyword = pdfAddContentParm.getKeyword();int length = keyword.length();for (int page = 1; page <= pageNum; page++) {if (hasKeyword[0]) {break;}int finalPage = page;pdfReaderContentParser.processContent(page, new RenderListener() {@Overridepublic void beginTextBlock() {}@SneakyThrows@Overridepublic void renderText(TextRenderInfo renderInfo) {// 读取PDF文件的内容String text = renderInfo.getText().trim();stringBuilder.append(text);if (stringBuilder.toString().contains(keyword)) {Rectangle2D.Float boundingRectange = renderInfo.getBaseline().getBoundingRectange();if (hasKeyword[1]) {System.out.println(boundingRectange);// 关键字的坐标double x = boundingRectange.getX();double y = boundingRectange.getY();//设置字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font font = new Font(baseFont, 10);PdfContentByte overContent = stamper.getOverContent(finalPage);ColumnText columnText = new ColumnText(overContent);// 根据关键字的坐标计算+偏移量得到批注字体的坐标columnText.setSimpleColumn((float) x+pdfAddContentParm.getLlx(), (float)y+pdfAddContentParm.getLly(),(float) x+100+pdfAddContentParm.getUrx(), (float) y+pdfAddContentParm.getUry());Paragraph elements = new Paragraph(pdfAddContentParm.getContent());elements.setFont(font);columnText.addElement(elements);columnText.go();hasKeyword[1] = false;}hasKeyword[0] = true;}if (stringBuilder.toString().length() > length * 3) {stringBuilder.setLength(0);}}@Overridepublic void endTextBlock() {}@Overridepublic void renderImage(ImageRenderInfo renderInfo) {}});}}stamper.close();pdfReader.close();return byteArrayOutputStream.toByteArray();}

调用示例:

public static void main(String[] args) throws Exception {// 按坐标添加批注PdfAddContentParm name = new PdfAddContentParm("张三", 2, 280F, 36F, 475F, 78F);PdfAddContentParm no = new PdfAddContentParm("02666666666SSS", 2, 425F, 36F, 550F, 78F);List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();Collections.addAll(pdfAddContentParms, prtno, year, month, day,name,no);byte[] bytes = pdfAddContent("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);// 按关键字批注PdfAddContentParm keyword = new PdfAddContentParm("112233", "尊敬的客户", 1F, 2F, 3F, 40F);PdfAddContentParm keyword1 = new PdfAddContentParm("112233", "销售人员签名:", 1F, 2F, 3F, 40F);List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();Collections.addAll(pdfAddContentParms, keyword,keyword1);byte[] bytes = pdfAddContByKeyword("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);}

效果:

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