ITEXT-定位PDF中图片的坐标与页码

14 篇文章 2 订阅

问题场景:

用itext自动生成PDF的过程中,想要在PDF中的某一页加入水印,这个水印图片的页码不固定,所以不能直接用‘sealStamperUnder = stamp.getUnderContent(page-1);’方式加入水印。但是该水印在某一固定图片的上一页,那么我们可以定位这张图片的位置信息,以此获取水印图片的页码信息。通过这种方法还可以获得图片的坐标信息。

代码

需导入的jar包:itext-pdfa-5.5.6.jar、itext-xtra-5.5.6.jar、itext-5.5.6.jar、itext-asian.jar

/**
     * 返回关键字所在页码和坐标
     * @param filePath  PDF位置
     * @param image     要定位的图片
     * @return  List<float[]>  返回关键字所在的坐标和页数 float[0] >> X; float[1] >> Y; float[2] >> page
     */
    public List<float[]> getKeyWords(String filePath, final Image image) {
        final List<float[]> arrays = new ArrayList<float[]>();
        PdfReader pdfReader;
            try {
                pdfReader = new PdfReader(filePath);
                int pageNum = pdfReader.getNumberOfPages();
                PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);

                for (int i = 1; i <= pageNum; i++) {

                    final int finalI = i;
                    pdfReaderContentParser.processContent(i, new RenderListener() {
                        //此方法是监听PDF里的文字内容,有重复情况会都把坐标和页码信息都存入arrays里
                        @Override
                        public void renderText(TextRenderInfo textRenderInfo) {
                            /*String text = textRenderInfo.getText(); // 整页内容

                            if (null != text && text.contains(key)) {
                                Rectangle2D.Float boundingRectange = textRenderInfo
                                        .getBaseline().getBoundingRectange();
                                float[] resu = new float[3];
                                resu[0] = (float)boundingRectange.getCenterX();
                                resu[1] = (float)boundingRectange.getCenterY();
                                resu[2] = finalI;
                                arrays.add(resu);
                            }*/
                        }

                        //此方法是监听PDF里的图片内容
                        @Override
                        public void renderImage(ImageRenderInfo arg0) {
                            PdfImageObject image0;
                            try {
                                image0 = arg0.getImage();
                                byte[] imageByte = image0.getImageAsBytes();
                                Image imageInPDF = Image.getInstance(imageByte);
                                if(image0!=null && imageInPDF.equals(image)){
                                    float[] resu = new float[3];
                                    // 0 => x;  1 => y;  2 => z
                                    //z的值始终为1
                                    resu[0] = arg0.getStartPoint().get(0);
                                    resu[1] = arg0.getStartPoint().get(1);
                                    resu[2] = finalI;
                                    arrays.add(resu);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            } catch (BadElementException e) {
                                e.printStackTrace();
                            }

                        }

                        @Override
                        public void endTextBlock() {


                        }

                        @Override
                        public void beginTextBlock() {


                        }

                    });

                }

                pdfReader.close();

            } catch (IOException e) {

                e.printStackTrace();
            }
            return arrays;
    }

后记:此方法是获取图片的坐标与页码信息,如果想获取文本的坐标与页码信息,请把renderText()中的注释去掉,getKeyWords()的参数换一下即可。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值