当前位置: 首页 > 知识库问答 >
问题:

如何从不可搜索的pdf中检测可搜索的pdf?

澹台承载
2023-03-14

我有一堆pdf文件,有些是可搜索的常规pdf文件,有些是不可搜索的文件的扫描版本。我想提取每个pdf的内容。为了提取常规PDF的内容,我使用Apache Tika,为了从不可搜索的PDF中提取内容,我使用tesseract ocr。然而,我需要区分哪个pdf是nornal pdf,哪个不是。有办法吗?

共有2个答案

吕皓
2023-03-14

你能不能不使用Tika来提取文本和图像,一旦你知道文本很少,你就把图像输入到tesseract?根据这个答案,使用Apache Tika从PDF中提取图像至少在理论上是可能的。

如果Tika不起作用,你应该能够使用PDFbox采取同样的方法。查看如何使用Java读取PDF文件?对于常规文本提取部分,请使用pdfbox从pdf中提取图像,以获取有关图像提取的提示。

万乐逸
2023-03-14

这对你有帮助,

public static boolean isSearchablePdf(String filePath) throws Exception {

    String parsedText;
    PDFTextStripper pdfStripper = null;
    PDDocument document = null;
    COSDocument cosDoc = null;
    File file = new File(filePath);
    boolean isSearchable = true;

    PDFParser parser = new PDFParser(new RandomAccessFile(file, "r"));
    parser.parse();
    cosDoc = parser.getDocument();
    pdfStripper = new PDFTextStripper();
    document = new PDDocument(cosDoc);
    int noOfPages = document.getNumberOfPages();

    for (int page = 1; page <= noOfPages; page++) {

        pdfStripper.setStartPage(page);
        pdfStripper.setEndPage(page);

        parsedText = pdfStripper.getText(document);
        isSearchable = isSearchable & isSearchablePDFContent(parsedText, page);

        if (!isSearchable) {
            break;
        }
        if (page >= 5) {
            break;
        }

    }
    if (isSearchable && noOfPages > 10) {
        int min = 5;
        int max = noOfPages;
        for (int i = 0; i < 4; i++) {
            int randomNo = min + (int) (Math.random() * ((max - min) + 1));
            pdfStripper.setStartPage(randomNo);
            pdfStripper.setEndPage(randomNo);
            parsedText = pdfStripper.getText(document);
            isSearchable = isSearchable & isSearchablePDFContent(parsedText, randomNo);
            if (!isSearchable)
                break;
        }
    }
    if (isSearchable && noOfPages >= 10) {
        for (int page = noOfPages - 5; page < noOfPages; page++) {
            pdfStripper.setStartPage(page);
            pdfStripper.setEndPage(page);
            parsedText = pdfStripper.getText(document);
            isSearchable = isSearchable & isSearchablePDFContent(parsedText, page);
            if (!isSearchable)
                break;

        }
    }

    if (document != null){
        document.close();
    }

    return isSearchable;
}

public static boolean isSearchablePDFContent(String contentOfPdf, int pageNo) throws IOException {
    int count = 0;
    boolean isSearchable = false;
    if (!contentOfPdf.isEmpty()) {
        StringTokenizer st = new StringTokenizer(contentOfPdf);
        while (st.hasMoreTokens()) {
            st.nextToken();
            if (count >= 3) {
                isSearchable = true;
                break;
            }
            count++;
        }

    } else {
        isSearchable = false;
    }

    return isSearchable;
} 
 类似资料:
  • 需要一个解决方案来转换PDF文件,其中每个页面都是图像,页面可以包含文本,表格或两者的组合到可搜索的pdf。 我使用了ABBY FineReader Online,这项工作做得非常好,但我正在寻找一个可以通过Windows Python实现的解决方案 我已经做了详细的分析,下面的链接接近我想要的,但并不准确: 扫描图像/PDF到可搜索图像/PDF 它告诉我们首先要使用Ghost脚本将其转换为图像,

  • 我正在用python开发一个二叉查找树。但是我的检索方法并不像我希望的那样工作。只有当我想检索根节点时,它才返回正确的值,对于所有其他节点,它都不返回任何值。 下面是我的节点类的代码: 我的二叉树代码: 所以Bintree中的最后一个方法为除Root之外的所有值返回Not,但它应该返回节点的值。 填充树:

  • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

  • 大家好,根据搜索框中的conatiner图像在这里!我只是想问当用户在搜索框中键入一个名称时,应该显示特定的字段。我把我的视图。JSP代码也在这里吗?? vuew.jsp<%@page import=“com.privery.servicebuilder.service.blobdesolocalserviceutil”%><%@taglib uri=“http://java.sun.com/po

  • 我有一个Product类,其中包含名为(String)代码、(String)名称、(Double)价格和(Date)到期的字段,每个都有自己的getter和setter方法。我有另一个类ListProduct,它包含一个名为productList的字段List。下面是一个ListProduct类,我创建了一个方法来返回仅通过产品名称搜索的所有产品。 我需要知道的是如何使上述方法成为可重用的方法,不

  • 我想皈依*。可搜索的PDF文件*。使用alfresco和tesseract OCR的PDF文件。 tesseract版本3.03需要编译,我需要使用源代码生成设置。有没有其他解决办法。有人能帮忙吗?