国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java實(shí)戰(zhàn):高效提取PDF文件指定坐標(biāo)的文本內(nèi)容

這篇具有很好參考價(jià)值的文章主要介紹了Java實(shí)戰(zhàn):高效提取PDF文件指定坐標(biāo)的文本內(nèi)容。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java實(shí)戰(zhàn):高效提取PDF文件指定坐標(biāo)的文本內(nèi)容,web開發(fā),編程藝術(shù),并發(fā)編程,java,pdf,批量PDF文本提取,pdfbox

前言

臨時(shí)接到一個(gè)緊急需要處理的事項(xiàng)。業(yè)務(wù)側(cè)一個(gè)同事有幾千個(gè)PDF文件需要整理:需要從文件中的指定位置獲取對(duì)應(yīng)的編號(hào)和地址。
要的急,工作量大。所以就問到技術(shù)部有沒有好的解決方案。
問技術(shù)的話就只能寫個(gè)demo跑下了。

解決辦法

1. 研究下PDF文檔,找出解決方案

PDF的文檔看起來比較簡(jiǎn)單,因?yàn)橹皇切枰x取兩個(gè)坐標(biāo)位置的文本內(nèi)容,而且位置相對(duì)固定。所以就直接用java的第三方庫(kù)pdfbox來操作PDF文檔。

2. 找個(gè)能操作PDF的第三方庫(kù)pdfbox。

  1. 先下載pdfbox的jar包。
    官網(wǎng)介紹
  2. pdfbox能干啥:
    • pdfbox是Apache軟件基金會(huì)的一個(gè)開源項(xiàng)目,它提供API和工具來處理PDF文檔。

    • pdfbox是Apache PDFBox的Java版本,它提供了一個(gè)類庫(kù),用于讀取,寫入,轉(zhuǎn)換和創(chuàng)建PDF文檔。

    • pdfbox支持處理各種PDF特性,如文本,字體,圖像,表單字段,注釋,書簽,頁(yè)面布局等。

    • pdfbox還提供了對(duì)加密和數(shù)字簽名PDF文檔的支持,以及對(duì)PDF文檔的提取和合并。

    • pdfbox還提供了對(duì)PDF文檔的驗(yàn)證,簽名驗(yàn)證,加密驗(yàn)證和數(shù)字簽名的支持。

    • PDFBox是一個(gè)用于處理PDF文檔的Java庫(kù)。它提供了一組功能強(qiáng)大的API,可以用于創(chuàng)建、修改和提取PDF文檔的內(nèi)容。PDFBox可以用于各種用途,包括生成PDF文檔、提取文本和圖像、合并和拆分PDF文件、添加水印和書簽等。

    • PDFBox支持處理各種PDF特性,如文本、字體、圖像、表單字段、注釋、書簽、頁(yè)面布局等。它還提供了對(duì)加密和數(shù)字簽名PDF文檔的支持,以及對(duì)PDF文檔的高級(jí)操作,如提取文本位置信息、提取圖像和字體等。

3. maven加載包

      pdfbox有三個(gè)大的版本,每個(gè)版本差異較大,這個(gè)時(shí)候如果要引入的時(shí)候,要注意對(duì)應(yīng)的版本了,否則demo就有可能跑不起來。
      Java實(shí)戰(zhàn):高效提取PDF文件指定坐標(biāo)的文本內(nèi)容,web開發(fā),編程藝術(shù),并發(fā)編程,java,pdf,批量PDF文本提取,pdfbox
      pdfbox最新的大版本是3.0。作為新時(shí)代的青年,肯定要與時(shí)俱進(jìn)。3.0肯定是要用上的。

3. 先驗(yàn)證下第三方庫(kù)是否可行

下載jar包后,直接用java代碼跑下demo。 demo讀取pdf文檔內(nèi)容并輸出文本數(shù)據(jù)到控制臺(tái)

    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;

    import java.io.File;
    import java.io.IOException;
    public class PDFBoxDemo {
        public static void main(String[] args) throws IOException {
            PDDocument document = PDDocument.load(new File("D:\\pdf\\test.pdf"));
            PDFTextStripper stripper = new PDFTextStripper();
            String text = stripper.getText(document);
            System.out.println(text);
            document.close();
        }
    }

發(fā)現(xiàn)demo跑起來后,報(bào)錯(cuò)。
原因是因?yàn)閐emo是2.0的版本,而當(dāng)前的jar包是3.0的版本。PDDocument.load這個(gè)修改為L(zhǎng)oader.load就OK了。

接下來,就是如何獲取到指定坐標(biāo)位置的文本內(nèi)容。

4. 確認(rèn)文本在PDF文檔中的坐標(biāo)位置。

確認(rèn)PDF文本坐標(biāo)一般有兩種方案。

1. 代碼校驗(yàn)(最精準(zhǔn))

先用demo跑下,看下是否可以讀取到指定坐標(biāo)位置的文本內(nèi)容。

 /**
    * 獲取文檔坐標(biāo)
    * @param  file PDF文件對(duì)象
    * @param sourceTex 匹配的字符
    * @return 坐標(biāo)
    */
   public static Point getPoint(File file,String sourceTex) {
       Point point = new Point();
       //獲取文檔坐標(biāo)
      try {
        PDDocument document =  Loader.loadPDF(file);
        PDFTextStripper textStripper = new PDFTextStripper() {
            @Override
            protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
                if (text.contains(targetText)) {
                    TextPosition textPositionStart = textPositions.get(0);
                    TextPosition textPositionEnd = textPositions.get(textPositions.size()-1);
                    point.setX(textPositionStart.getX());
                    point.setY(textPositionStart.getY()); 
                }
            }
        };

        textStripper.setSortByPosition(true);
        textStripper.setStartPage(1);
        textStripper.setEndPage(document.getNumberOfPages());

        textStripper.getText(document);

        document.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return point;
    }

跑完demo后,發(fā)現(xiàn)可以讀取到指定坐標(biāo)位置的文本內(nèi)容。
這里會(huì)有個(gè)小問題,就是返回的坐標(biāo)點(diǎn)有的會(huì)有小數(shù)。因?yàn)楫?dāng)前返回類型float,所以需要轉(zhuǎn)換成int。

2. 最直接粗暴的方法。

  1. 福昕PDF文檔工具。
  2. 直接用福昕PDF文檔定位工具定位坐標(biāo)。
  說實(shí)話,開發(fā)比較少用這種方式,因?yàn)楦杏X有點(diǎn)lower(其實(shí)是自己不太會(huì)用)

5. 整個(gè)demo先驗(yàn)證第三方庫(kù)是否可行。

拿1個(gè)文件試試水

 public static void main(String[] args) {
        String filePath = "D:\\test\\test.pdf";
         try {
            PDDocument document = Loader.loadPDF(file);
            PDFTextStripperByArea  textStripper = new PDFTextStripperByArea ();
            Rectangle rectangle = new Rectangle(80,120, 250,10);
            String regionName = "regionName";
            textStripper.addRegion(regionName, rectangle);
            PDPage page = document.getPage(0);
            textStripper.extractRegions(page);
            String text = textStripper.getTextForRegion(regionName);
  
            System.out.println(text);
          
            textStripper.setSortByPosition(true);
            textStripper.setStartPage(1);
            textStripper.setEndPage(document.getNumberOfPages());
            textStripper.getText(document);
            document.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
      
    }

結(jié)果能夠正常輸出對(duì)應(yīng)的文本內(nèi)容。

6. 整活上代碼。

奉上全部demo代碼

package com.example.demo;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.alibaba.fastjson2.JSON;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;
import org.apache.pdfbox.text.TextPosition;
import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest;


import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Desc: 驗(yàn)證pdfbox的可行性
 *
 * @author admin
 * @date since 2023/8/8 18:44
 */

public class PdfDemo {
	//要匹配的位置內(nèi)容點(diǎn)
    private  static final String[] target= {"name", "address"};
    public static void main(String[] args) {
       ExcelWriter excelWriter= ExcelUtil.getWriter("D:\\test\\pdf\\test.xls");
       String folderPath = "D:\\test\\pdf";
       File folder = new File(folderPath);
       if (folder.exists() && folder.isDirectory()) {
           List<Map<String,Object>>  mps =  listPdfFiles(folder);
           excelWriter.write(mps, true);
       } else {
           System.out.println("Invalid folder path.");
       }
       excelWriter.close();
    }
	/**
     * 獲取pdf文件列表
     *
     * @param folder 文件夾
     * @return {@code List<Map<String,Object>>}
     */
    private static  List<Map<String,Object>>  listPdfFiles(File folder) {
        List<Map<String,Object>> mps = new ArrayList<>();
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    listPdfFiles(file); // 遞歸調(diào)用,處理子文件夾
                } else {
                    String fileName = file.getName();
                    if (fileName.toLowerCase().endsWith(".pdf")) {
                        mps.add(getLineData(file));
                    }
                }
            }
        }
        return mps;
    }
    /**
     * 行數(shù)據(jù)
     *
     * @param file 文件
     * @return {@code Map<String,Object>}
     */
    public static Map<String,Object> getLineData(File file){
        Map<String,Object> lineData = new HashMap<>(target.length+2);
        List<Point> pointList =  getPoint(file);
        String[]  arr=  getPointValue(file, pointList.stream().map(s -> new Rectangle(s.getX(), s.getY(), 260, 10)).toArray(Rectangle[]::new));
        if(arr.length>=target.length) {
        for(int i=0;i<target.length;i++)
        {
            lineData.put(target[i], arr[i]);
        }
            lineData.put("fileName", file.getName().toLowerCase().replace(".pdf", ""));
        }
      return lineData;
    }
 	/**
     * 獲得PDF指定坐標(biāo)點(diǎn)文本值
     *
     * @param file       文件
     * @param rectangles 矩形坐標(biāo)
     * @return {@code String[]}
     */
    public  static String[] getPointValue( File file,Rectangle... rectangles){
        String[] textArr = new String[rectangles.length];
       // String text="";
        try {
            PDDocument document = Loader.loadPDF(file);
            PDFTextStripperByArea  textStripper = new PDFTextStripperByArea ();

            for(int i = 0; i < rectangles.length;i++   ) {
                Rectangle rectangle =rectangles[i];
                String regionName = "regionName"+rectangle.getX()+rectangle.getY();
                textStripper.addRegion(regionName, rectangle);
                PDPage page = document.getPage(0);
                textStripper.extractRegions(page);
                // 獲取區(qū)域的text
                String text = textStripper.getTextForRegion(regionName);
                text = text.replace("\u0000","-").replace(" ","");
                System.out.println(">>text"+text);
                textArr[i]=text;
            }

            textStripper.setSortByPosition(true);
            textStripper.setStartPage(1);
            textStripper.setEndPage(document.getNumberOfPages());

            textStripper.getText(document);

            document.close();
        }catch (IOException e) {
            e.printStackTrace();
        }

        return  textArr;
    }

    public  static List<Point> getPoint( File file){
        List<Point> pointList=new ArrayList<>();
        try {
        PDDocument document =  Loader.loadPDF(file);
        PDFTextStripper textStripper = new PDFTextStripper() {
            @Override
            protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
                for(String target:target){
                    if (text.contains(target)) {
                        Point point = new Point();
                        TextPosition textPositionEnd = textPositions.get(textPositions.size() - 1);
                        point.setX((int) textPositionEnd.getEndX());
                        point.setY((int) textPositionEnd.getY());
                        pointList.add(point);
                    }
                }
            }
        };

        textStripper.setSortByPosition(true);
        textStripper.setStartPage(1);
        textStripper.setEndPage(document.getNumberOfPages());
        textStripper.getText(document);
        document.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(">>>>>pointList" + JSON.toJSONString(pointList));
        return pointList;
    }
} 

7. 驗(yàn)證代碼可行性

整理出來的excel,檢查里面有些空格沒有處理,就讓業(yè)務(wù)自己批量替換一下。
因?yàn)榇a只是一次性用的,就沒有怎么進(jìn)行封裝了??傮w來講業(yè)務(wù)同事比較滿意。文章來源地址http://www.zghlxwxcb.cn/news/detail-641369.html

結(jié)論

  1. 第三方庫(kù)pdfbox可以操作PDF文檔。3.0版本之后和歷史版本相差比較大,最好先閱讀下源碼。
  2. 坐標(biāo)定位的話,可以用第三方也可以代碼定位
  3. 如果代碼后續(xù)想復(fù)用的話,最好抽離出公共方法
  4. 文件比較多的情況下,建議增加多線程處理。

到了這里,關(guān)于Java實(shí)戰(zhàn):高效提取PDF文件指定坐標(biāo)的文本內(nèi)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python3,9行批量提取PDF文件的指定內(nèi)容,這種操作,保證人見人愛....

    Python3,9行批量提取PDF文件的指定內(nèi)容,這種操作,保證人見人愛....

    小屌絲 :魚哥, 你有沒有什么辦法,提取PDF文檔的內(nèi)容。 小魚 :這個(gè)還問我?? 小屌絲 :哎呀,這個(gè)不是被難住了嘛 。 小魚 :有啥難得?提示你一下, 小屌絲 :嗯,可以可以。 小魚 :去我的博文找,沒記錯(cuò)的話,有兩種方法提取pdf的文字。 小屌絲 :好嘞, 我這就去

    2024年02月04日
    瀏覽(31)
  • opencv C++ 讀取視頻中的光斑是否在移動(dòng)(圖片存儲(chǔ)在指定文件見下,光斑坐標(biāo)存在TXT文本中)

    讀取視頻中的光斑是否在移動(dòng)(圖片存儲(chǔ)在指定文件見下,光斑坐標(biāo)存在TXT文本中)

    2024年02月12日
    瀏覽(40)
  • Python從圖像中提取文本及其坐標(biāo)

    Python從圖像中提取文本及其坐標(biāo) 在數(shù)字化時(shí)代,文本數(shù)據(jù)已經(jīng)成為人們生活和工作中重要的數(shù)據(jù)形式。有時(shí)候我們需要從圖片中提取文字信息,這就要用到Python編程語(yǔ)言中OCR技術(shù)的應(yīng)用了。本文將介紹如何使用Python從圖片中提取文字,同時(shí)提供完整的源代碼。 首先,我們需

    2024年02月14日
    瀏覽(86)
  • 第八篇【傳奇開心果系列】Python自動(dòng)化辦公庫(kù)技術(shù)點(diǎn)案例示例:深度解讀使用Python庫(kù)清洗處理從PDF文件提取的文本

    第八篇【傳奇開心果系列】Python自動(dòng)化辦公庫(kù)技術(shù)點(diǎn)案例示例:深度解讀使用Python庫(kù)清洗處理從PDF文件提取的文本

    在使用pyPDF4或任何其他Python的PDF解析庫(kù)提取PDF文件的文本后,進(jìn)行清洗處理是非常重要的。這是因?yàn)镻DF文件通常包含了各種格式化元素,如頁(yè)眉、頁(yè)腳、頁(yè)碼、圖表、圖片等,這些元素可能會(huì)干擾到你提取的文本內(nèi)容。清洗處理的目標(biāo)是去除這些干擾元素,僅提取出你真正需

    2024年03月22日
    瀏覽(28)
  • Python 提取PDF文本和圖片

    Python 提取PDF文本和圖片

    從PDF中提取內(nèi)容能幫助我們獲取文件中的信息,以便進(jìn)行進(jìn)一步的分析和處理。此外,在遇到類似項(xiàng)目時(shí),提取出來的文本或圖片也能再次利用。要在Python中通過代碼 提取PDF文件中的文本和圖片 ,可以使用 Spire.PDF for Python 這個(gè)第三方庫(kù)。具體操作方法查閱下文。 Python 提取

    2024年02月08日
    瀏覽(28)
  • Excel:通過Lookup函數(shù)提取指定文本關(guān)鍵詞

    Excel:通過Lookup函數(shù)提取指定文本關(guān)鍵詞

    函數(shù)公式 :=LOOKUP(9^9,FIND($G 2 : 2: 2 : G 6 , C 2 ) , 6,C2), 6 , C 2 ) , G 2 : 2: 2 : G$6) 公式解釋 : lookup第一參數(shù)為9^9:代表的是一個(gè)極大值的數(shù)據(jù),查詢位置里面最接近這一個(gè)值的數(shù)據(jù); lookup第二參數(shù)用find函數(shù)代替,目的就是查詢我們的在對(duì)應(yīng)文本找那個(gè)的位置; lookup第三參數(shù)

    2024年02月11日
    瀏覽(23)
  • 用python提取PDF中各類文本內(nèi)容的方法

    用python提取PDF中各類文本內(nèi)容的方法

    從PDF文檔中提取信息,是很多類似RAG這樣的應(yīng)用第一步要處理的事情,這里需要做好三件事: 提取出來的文本要保持信息完整性,也就是準(zhǔn)確性 提出的結(jié)果需要有附加信息,也就是要保存元數(shù)據(jù) 提取過程要完成自動(dòng)化,也就是流程化 然而,在我們開始之前,我們需要指定目

    2024年02月01日
    瀏覽(20)
  • Java將獲取的參數(shù),圖片以及pdf文件放入到word文檔指定位置

    Java將獲取的參數(shù),圖片以及pdf文件放入到word文檔指定位置

    首先引入的依賴 接下面的是template.docx文檔,參數(shù)是以{{paramName}}格式的,為什么要以這種格式,是因?yàn)橄旅娴姆椒?在替換參數(shù)的時(shí)候需要 但是從數(shù)據(jù)庫(kù)獲取的參數(shù)跟模板中的參數(shù)一一對(duì)應(yīng)上即可,格式如下(我是json形式展示的): { ?? ?\\\"countQuota\\\": \\\"1\\\", ?? ?\\\"noEmission\\\": \\\"1\\\", ?

    2024年02月15日
    瀏覽(34)
  • 一步步指南:從指定時(shí)長(zhǎng)中提取需求的幀圖片,高效剪輯視頻

    一步步指南:從指定時(shí)長(zhǎng)中提取需求的幀圖片,高效剪輯視頻

    在現(xiàn)代多媒體時(shí)代,視頻已經(jīng)成生活中不可或缺的一部分。從視頻中提取某一幀圖片,或者對(duì)視頻進(jìn)行剪輯,都是常見的需求。下面一起來看云炫AI智剪如何從指定時(shí)長(zhǎng)中提取需求的幀圖片,如何高效地剪輯視頻。 按指定時(shí)長(zhǎng)提取視頻某幀圖片的縮略圖。 批量提取視頻圖片的

    2024年01月22日
    瀏覽(20)
  • JAVA讀取(DOC、DOCX、PDF、PPT、PPTX)文件文本內(nèi)容及圖片

    JAVA讀?。―OC、DOCX、PDF、PPT、PPTX)文件文本內(nèi)容及圖片

    溫馨提示:有很多方法均可以解析這些常見的文件,以下內(nèi)容使用的是apache-poi + apache-pdfbox實(shí)現(xiàn)的。 ????????關(guān)于文檔解析,在網(wǎng)上搜索了很久,無奈內(nèi)容太過繁雜,找不到合適的代碼,一大半都是只支持文本。沒辦法,只能自己在網(wǎng)上一點(diǎn)一點(diǎn)CV了,最終提取了這些代碼

    2024年02月03日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包