中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用java實現查找PDF關鍵字所在頁碼及其坐標

發布時間:2021-09-26 18:18:04 來源:億速云 閱讀:390 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何使用java實現查找PDF關鍵字所在頁碼及其坐標的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1、因為最近有這方面的需求,用過之后記錄一下。

2、此功能跟PDF中Ctrl+F性質一樣,如果PDF中為圖片形式的不支持定位到關鍵字。

import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfDictionary;import com.itextpdf.text.pdf.PdfName;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.*;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * 消失的太陽 */public class MyTest { public static void main(String[] args) throws IOException {  //1.給定文件  File pdfFile = new File("D://test.pdf");  //2.定義一個byte數組,長度為文件的長度  byte[] pdfData = new byte[(int) pdfFile.length()];  //3.IO流讀取文件內容到byte數組  FileInputStream inputStream = null;  try {   inputStream = new FileInputStream(pdfFile);   inputStream.read(pdfData);  } catch (IOException e) {   throw e;  } finally {   if (inputStream != null) {    try {     inputStream.close();    } catch (IOException e) {    }   }  }  //4.指定關鍵字  String keyword = "消失的太陽:";  //5.調用方法,給定關鍵字和文件  List<float[]> positions = findKeywordPostions(pdfData, keyword);  //6.返回值類型是 List<float[]> 每個list元素代表一個匹配的位置,分別為 float[0]所在頁碼 float[1]所在x軸 float[2]所在y軸  System.out.println("total:" + positions.size());  if (positions != null && positions.size() > 0) {   for (float[] position : positions) {    System.out.print("pageNum: " + (int) position[0]);    System.out.print("\tx: " + position[1]);    System.out.println("\ty: " + position[2]);   }  } } /**  * findKeywordPostions  * @param pdfData  通過IO流 PDF文件轉化的byte數組  * @param keyword  關鍵字  * @return List<float [ ]> : float[0]:pageNum float[1]:x float[2]:y  * @throws IOException  */ public static List<float[]> findKeywordPostions(byte[] pdfData, String keyword) throws IOException {  List<float[]> result = new ArrayList<>();  List<PdfPageContentPositions> pdfPageContentPositions = getPdfContentPostionsList(pdfData);  for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) {   List<float[]> charPositions = findPositions(keyword, pdfPageContentPosition);   if (charPositions == null || charPositions.size() < 1) {    continue;   }   result.addAll(charPositions);  }  return result; } private static List<PdfPageContentPositions> getPdfContentPostionsList(byte[] pdfData) throws IOException {  PdfReader reader = new PdfReader(pdfData);  List<PdfPageContentPositions> result = new ArrayList<>();  int pages = reader.getNumberOfPages();  for (int pageNum = 1; pageNum <= pages; pageNum++) {   float width = reader.getPageSize(pageNum).getWidth();   float height = reader.getPageSize(pageNum).getHeight();   PdfRenderListener pdfRenderListener = new PdfRenderListener(pageNum, width, height);   //解析pdf,定位位置   PdfContentStreamProcessor processor = new PdfContentStreamProcessor(pdfRenderListener);   PdfDictionary pageDic = reader.getPageN(pageNum);   PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);   try {    processor.processContent(ContentByteUtils.getContentBytesForPage(reader, pageNum), resourcesDic);   } catch (IOException e) {    reader.close();    throw e;   }   String content = pdfRenderListener.getContent();   List<CharPosition> charPositions = pdfRenderListener.getcharPositions();   List<float[]> positionsList = new ArrayList<>();   for (CharPosition charPosition : charPositions) {    float[] positions = new float[]{charPosition.getPageNum(), charPosition.getX(), charPosition.getY()};    positionsList.add(positions);   }   PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions();   pdfPageContentPositions.setContent(content);   pdfPageContentPositions.setPostions(positionsList);   result.add(pdfPageContentPositions);  }  reader.close();  return result; } private static List<float[]> findPositions(String keyword, PdfPageContentPositions pdfPageContentPositions) {  List<float[]> result = new ArrayList<>();  String content = pdfPageContentPositions.getContent();  List<float[]> charPositions = pdfPageContentPositions.getPositions();  for (int pos = 0; pos < content.length(); ) {   int positionIndex = content.indexOf(keyword, pos);   if (positionIndex == -1) {    break;   }   float[] postions = charPositions.get(positionIndex);   result.add(postions);   pos = positionIndex + 1;  }  return result; } private static class PdfPageContentPositions {  private String content;  private List<float[]> positions;  public String getContent() {   return content;  }  public void setContent(String content) {   this.content = content;  }  public List<float[]> getPositions() {   return positions;  }  public void setPostions(List<float[]> positions) {   this.positions = positions;  } } private static class PdfRenderListener implements RenderListener {  private int pageNum;  private float pageWidth;  private float pageHeight;  private StringBuilder contentBuilder = new StringBuilder();  private List<CharPosition> charPositions = new ArrayList<>();  public PdfRenderListener(int pageNum, float pageWidth, float pageHeight) {   this.pageNum = pageNum;   this.pageWidth = pageWidth;   this.pageHeight = pageHeight;  }  public void beginTextBlock() {  }  public void renderText(TextRenderInfo renderInfo) {   List<TextRenderInfo> characterRenderInfos = renderInfo.getCharacterRenderInfos();   for (TextRenderInfo textRenderInfo : characterRenderInfos) {    String word = textRenderInfo.getText();    if (word.length() > 1) {     word = word.substring(word.length() - 1, word.length());    }    Float rectangle = textRenderInfo.getAscentLine().getBoundingRectange();    float x = (float)rectangle.getX();    float y = (float)rectangle.getY();//    float x = (float)rectangle.getCenterX();//    float y = (float)rectangle.getCenterY();//    double x = rectangle.getMinX();//    double y = rectangle.getMaxY();    //這兩個是關鍵字在所在頁面的XY軸的百分比    float xPercent = Math.round(x / pageWidth * 10000) / 10000f;    float yPercent = Math.round((1 - y / pageHeight) * 10000) / 10000f;//    CharPosition charPosition = new CharPosition(pageNum, xPercent, yPercent);    CharPosition charPosition = new CharPosition(pageNum, (float)x, (float)y);    charPositions.add(charPosition);    contentBuilder.append(word);   }  }  public void endTextBlock() {  }  public void renderImage(ImageRenderInfo renderInfo) {  }  public String getContent() {   return contentBuilder.toString();  }  public List<CharPosition> getcharPositions() {   return charPositions;  } } private static class CharPosition {  private int pageNum = 0;  private float x = 0;  private float y = 0;  public CharPosition(int pageNum, float x, float y) {   this.pageNum = pageNum;   this.x = x;   this.y = y;  }  public int getPageNum() {   return pageNum;  }  public float getX() {   return x;  }  public float getY() {   return y;  }  @Override  public String toString() {   return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y + "]";  } }}

感謝各位的閱讀!關于“如何使用java實現查找PDF關鍵字所在頁碼及其坐標”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

公主岭市| 铅山县| 高州市| 隆尧县| 兰坪| 兴文县| 蒙城县| 兴安盟| 新平| 海阳市| 台中市| 章丘市| 洱源县| 棋牌| 南昌市| 禹城市| 阳新县| 井研县| 罗江县| 台山市| 龙山县| 汶川县| 防城港市| 龙州县| 明溪县| 青阳县| 阿尔山市| 花莲市| 阿坝县| 平度市| 台南市| 峡江县| 巴林左旗| 紫金县| 连江县| 城固县| 十堰市| 黎平县| 图木舒克市| 天全县| 柳河县|