作者:木易_迪迪 | 来源:互联网 | 2024-10-17 17:05
很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。这个时候,就需要对pdf文件进行再次处理。处理的方式就是:1、获取要处理的位置2、将要盖章的图片添加上去代码如下:publ
很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。 这个时候,就需要对pdf文件进行再次处理。 处理的方式就是: 1、获取要处理的位置 2、将要盖章的图片添加上去 代码如下:
public void printSign(OutputStream outputStream){ List keyWords = new ArrayList(); keyWords.add("打印人,打印机构");//支持多关键字,默认选择第一个找到的关键字 PdfReader pdfReader; PdfStamper pdfStamper; try { pdfReader = new PdfReader(((ByteArrayOutputStream)outputStream).toByteArray()); pdfStamper = new PdfStamper(pdfReader, outputStream); List> arrayLists = findKeywords(keyWords, pdfReader);//查找关键字所在坐标 //一个坐标也没找到,就返回 if (ObjectUtil.isEmpty(arrayLists)) { return; } if (!ObjectUtil.isEmpty(arrayLists.get(0))) { for (int i=0; i> findKeywords(final List keyWords, PdfReader pdfReader) { if (keyWords == null || keyWords.size() == 0) { return null; } int pageNum = pdfReader.getNumberOfPages(); final List> arrayLists = new ArrayList>(keyWords.size()); for (int k=0; k List positiOns= new ArrayList(); arrayLists.add(positions); } PdfReaderContentParser pdfReaderCOntentParser= new PdfReaderContentParser(pdfReader); try { for (int i = 1; i <= pageNum; i++) { final int finalI = i; pdfReaderContentParser.processContent(i, new RenderListener() { private StringBuilder pdfsb = new StringBuilder(); private float yy = -1f; @Override public void renderText(TextRenderInfo textRenderInfo) { String text = textRenderInfo.getText(); com.itextpdf.awt.geom.Rectangle2D.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange(); if(yy == -1f) { yy = boundingRectange.y; } if(yy != boundingRectange.y) { yy = boundingRectange.y; pdfsb.setLength(0); } pdfsb.append(text); if (pdfsb.length()>0) { for (int j=0; j List key_words = ListUtil.parseList (keyWords.get(j), ","); //假如配置了多个关键字,找到一个就跑 for (final String key_word : key_words) { if (arrayLists.get(j) != null) { break; } if (pdfsb.length()>0 && pdfsb.toString ().contains(key_word)) { float[] resu = new float[3]; resu[0] = boundingRectange.x + boundingRectange.width * (key_word.length()-1); resu[1] = boundingRectange.y; resu[2] = finalI; arrayLists.get(j).add(resu); pdfsb.setLength(0); break; } } } } } @Override public void renderImage(ImageRenderInfo arg0) { //renderImage } @Override public void endTextBlock() { //endTextBlock } @Override public void beginTextBlock() { //beginTextBlock } }); } } catch (Exception e) { e.printStackTrace(); } return arrayLists; } public static List parseList(String source, String regex) { if (source == null || "".equals(source)) { return null; } List strList = new ArrayList(); if (regex== null || "".equals(regex)) { strList.add(source); } else { String[] strArr = source.split(regex); for (String str : strArr) { if (str!= null || !"".equals(str)) { strList.add(str); } } } return strList; }
1、将上面的代码考到项目中,把该导的包导好。该方法所需的类都在iTextpdf里 https://download.csdn.net/download/esc_tab_end/10730983 。如果你的报表里还需要什么条形码生成的。可以下载条形码所需的包: https://download.csdn.net/download/esc_tab_end/10730999 2、然后调用printSign方法。 2.1 printSign方法入参是pdf的二进制流对象。 2.2 还有就是关键字写上自己所需要的关键字就行了。方法内的代码都是现成的,不需要改动,若有特殊需求可以自己微调。
注意:pdf中的关键字的字体必须是中文字体 ,例如:宋体,黑体,楷体等等。如果pdf生成的时候关键字是用英文字体例如:Arial,Dialog等等这些。
效果图如下: