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

x33g5p2x  于2021-12-28 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(571)

问题场景:

用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

  1. /** * 返回关键字所在页码和坐标 * @param filePath PDF位置 * @param image 要定位的图片 * @return List<float[]> 返回关键字所在的坐标和页数 float[0] >> X; float[1] >> Y; float[2] >> page */
  2. public List<float[]> getKeyWords(String filePath, final Image image) {
  3. final List<float[]> arrays = new ArrayList<float[]>();
  4. PdfReader pdfReader;
  5. try {
  6. pdfReader = new PdfReader(filePath);
  7. int pageNum = pdfReader.getNumberOfPages();
  8. PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
  9. for (int i = 1; i <= pageNum; i++) {
  10. final int finalI = i;
  11. pdfReaderContentParser.processContent(i, new RenderListener() {
  12. //此方法是监听PDF里的文字内容,有重复情况会都把坐标和页码信息都存入arrays里
  13. @Override
  14. public void renderText(TextRenderInfo textRenderInfo) {
  15. /*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); }*/
  16. }
  17. //此方法是监听PDF里的图片内容
  18. @Override
  19. public void renderImage(ImageRenderInfo arg0) {
  20. PdfImageObject image0;
  21. try {
  22. image0 = arg0.getImage();
  23. byte[] imageByte = image0.getImageAsBytes();
  24. Image imageInPDF = Image.getInstance(imageByte);
  25. if(image0!=null && imageInPDF.equals(image)){
  26. float[] resu = new float[3];
  27. // 0 => x; 1 => y; 2 => z
  28. //z的值始终为1
  29. resu[0] = arg0.getStartPoint().get(0);
  30. resu[1] = arg0.getStartPoint().get(1);
  31. resu[2] = finalI;
  32. arrays.add(resu);
  33. }
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. } catch (BadElementException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. @Override
  41. public void endTextBlock() {
  42. }
  43. @Override
  44. public void beginTextBlock() {
  45. }
  46. });
  47. }
  48. pdfReader.close();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. return arrays;
  53. }

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

相关文章