java获取pdf文字坐标_Java 获取PDF关键字坐标

一、使用 itextpdf  推荐使用

com.itextpdf

itextpdf

5.5.13.1

PdfKeyWordPosition.java

package com.util;

import com.itextpdf.awt.geom.Rectangle2D;

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 org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* 获取pdf关键字坐标

*/

public class PdfKeyWordPosition {

private static final Logger log = LoggerFactory.getLogger(PdfKeyWordPosition.class);

/**

* 获取关键字坐标

* @param pdfData

* @param keyWord

* @return

*/

public static List> getWordsPcoordinate(byte[] pdfData, String keyWord){

List> result = new ArrayList<>();

PdfReader reader = null;

try {

// pdfData :可以是二进制,也可以是文件路径,两种方式选择一种

reader = new PdfReader(pdfData);

//获取pdf页数

int pages = reader.getNumberOfPages();

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

//每页的宽度

Float width = reader.getPageSize(pageNum).getWidth();

//每页的高度

Float height = reader.getPageSize(pageNum).getHeight();

RenderListenerHelper renderListenerHelper = new RenderListenerHelper(pageNum, width, height);

//解析pdf,定位位置

PdfContentStreamProcessor processor = new PdfContentStreamProcessor(renderListenerHelper);

PdfDictionary pageDic = reader.getPageN(pageNum);

PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);

processor.processContent(ContentByteUtils.getContentBytesForPage(reader, pageNum), resourcesDic);

//文本内容

String content = renderListenerHelper.getContent();

//文本每个字对应的坐标

List> charPositions = renderListenerHelper.getCharPositions();

for (int i = 0; i < content.length(); i++){

//获取关键字所在位置

int keyIndex = content.indexOf(keyWord, i);

if (keyIndex == -1){

break;

}

result.add(charPositions.get(keyIndex));

i = key

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取 PDF 关键字坐标,可以使用 Apache PDFBox 库。以下是获取 PDF 关键字坐标的示例代码: ```java import java.io.File; import java.io.IOException; import java.util.List; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup.MarkupTypeEnum; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup.QuadPoints; public class PDFKeywordCoordinates { public static void main(String[] args) throws IOException { String filePath = "example.pdf"; String keyword = "example"; PDDocument document = PDDocument.load(new File(filePath)); List<PDPage> pages = document.getDocumentCatalog().getAllPages(); for (PDPage page : pages) { List<PDAnnotation> annotations = page.getAnnotations(); for (PDAnnotation annotation : annotations) { if (annotation instanceof PDAnnotationTextMarkup) { PDAnnotationTextMarkup markup = (PDAnnotationTextMarkup) annotation; if (markup.getMarkupType() == MarkupTypeEnum.HIGHLIGHT) { COSDictionary dict = markup.getCOSObject(); COSArray quadPointsArray = (COSArray) dict.getDictionaryObject(COSName.getPDFName("QuadPoints")); for (int i = 0; i < quadPointsArray.size(); i += 8) { float x1 = quadPointsArray.getFloat(i); float y1 = quadPointsArray.getFloat(i + 1); float x2 = quadPointsArray.getFloat(i + 2); float y2 = quadPointsArray.getFloat(i + 3); float x3 = quadPointsArray.getFloat(i + 4); float y3 = quadPointsArray.getFloat(i + 5); float x4 = quadPointsArray.getFloat(i + 6); float y4 = quadPointsArray.getFloat(i + 7); if (containsKeyword(page, keyword, x1, y1, x2, y2, x3, y3, x4, y4)) { System.out.println("Keyword '" + keyword + "' found on page " + (pages.indexOf(page) + 1) + " at (" + x1 + "," + y1 + ") (" + x2 + "," + y2 + ") (" + x3 + "," + y3 + ") (" + x4 + "," + y4 + ")"); } } } } } } document.close(); } private static boolean containsKeyword(PDPage page, String keyword, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) throws IOException { StringBuilder sb = new StringBuilder(); sb.append("q\n"); sb.append(x1).append(' ').append(y1).append(" m\n"); sb.append(x2).append(' ').append(y2).append(" l\n"); sb.append(x3).append(' ').append(y3).append(" l\n"); sb.append(x4).append(' ').append(y4).append(" l\n"); sb.append("h\n"); sb.append("W* n\n"); sb.append("BT\n"); sb.append("/Helv 12 Tf\n"); sb.append("0 g\n"); sb.append("1 0 0 1 ").append(x1).append(' ').append(y1).append(" Tm\n"); sb.append("(").append(keyword).append(") Tj\n"); sb.append("ET\n"); sb.append("Q\n"); return page.getContents().stream().anyMatch(content -> content.getString().contains(sb.toString())); } } ``` 在此示例代码中,我们首先加载 PDF 文件并获取所有页面。然后,我们遍历每个页面的所有注释,并查找类型为“高亮”的注释。对于每个高亮注释,我们获取该注释的四个顶点坐标,并检查关键字是否包含在其中。如果找到匹配项,则打印关键字坐标

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值