Поиск и выделение текста в PDF-файле

Вопрос или проблема

Как искать и выделять текст в PDF-файле на Java Android простым способом и не использовать стороннюю библиотеку, за которую нужно платить за эту функцию. Я нашел способ сделать это, но не смог его применить, чтобы найти слово в PDF и затем выделить его, не затрагивая оригинальный файл, а сохранить информацию о аннотации отдельно.

У меня есть этот метод на Java, над которым я начал работать:

    public void searchAndHighlight(String text, String fileName) {

    //Создать экземпляр PdfDocument
    PdfDocument pdf = new PdfDocument();

    //Загрузить образец PDF-документа
    pdf.loadFromFile(fileName);

    PdfTextFind[] result = null;
    for (Object pageObj : pdf.getPages()) {
        PdfPageBase page =(PdfPageBase)pageObj;
        //Найти текст
        result = page.findText(text, false).getFinds();
        for (PdfTextFind find : result) {
            //Выделить найденный текст
            find.highLight();
        }
    }

    //Сохранить результат в файл
    pdf.saveToFile(editedFileName);
    pdfRendererView.initWithFile(new File(getFilesDir(), editedFileName));

}

используя эту библиотеку

    implementation group:'e-iceblue',name:'spire.doc',version:'11.5.5'

но при запуске приложения возникает эта ошибка

cannot access Printable
class file for java.awt.print.Printable not found


AGPBI: {"kind":"error","text":"com.android.tools.r8.internal.Ge: Method name 'spr—' in class 'com.spire.doc.packages.sprgaa' cannot be represented in dex format.","sources":[{"file":".gradle/caches/modules-2/files-2.1/e-iceblue/spire.doc/11.5.5/c2797a752513880b16cf97c14603dc6c0d9d3d69/spire.doc-11.5.5.jar"}],"tool":"D8"}


    error: cannot access Printable
        pdf.loadFromFile(fileName);
           ^
  class file for java.awt.print.Printable not found
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error

Ответ или решение

Чтобы выполнить поиск и выделение текста в PDF-файле на Android без использования платных сторонних библиотек, вы можете воспользоваться встроенными средствами Android, такими как PdfRenderer для отображения PDF-файлов, и самим реализовать логику поиска и выделения текста. К сожалению, работа с PDF в Android может быть сложной без использования сторонних библиотек, но есть способы.

Вот пример решения:

  1. Чтение PDF: Вы можете использовать класс PdfRenderer, который позволяет рендерить страницы PDF-файла. Однако для поиска текста на страницах вам понадобится другой подход, так как стандартная библиотека не предоставляет прямого API для выполнения поиска текста.

  2. Поиск текста: Для поиска текста вы можете использовать класс PdfiumCore из библиотеки PDFiumAndroid. Он позволит вам извлекать текст из PDF-документа и выполнять поиск.

  3. Выделение текста: К сожалению, выделение текста в оригинальном PDF-файле без внесения изменений в сам файл невозможно без использования сторонних библиотек. Однако вы можете создать вспомогательный механизм для отображения выделений, например с использованием Canvas.

Вот простой пример вашего метода с использованием PDFiumAndroid и Canvas для выделения текста:

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;

import java.io.File;

public class PdfActivity extends AppCompatActivity implements OnLoadCompleteListener {

    private PDFView pdfView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdf);

        pdfView = findViewById(R.id.pdfView);
        File pdfFile = new File(getFilesDir(), "yourfile.pdf");
        pdfView.fromFile(pdfFile)
                .defaultPage(0)
                .onLoad(this)
                .load();
    }

    @Override
    public void loadCompleted(int nbPages) {
        // Здесь вы можете вызвать метод, чтобы осуществить поиск и выделение текста
        searchAndHighlight("искомый текст");
    }

    private void searchAndHighlight(String text) {
        // Реализуйте поиск текста и выделение. 
        // Для demo purposes, мы просто показываем выделение как пример.

        Canvas canvas = new Canvas();
        Paint paint = new Paint();
        paint.setColor(0x66FFFF00); // Цвет выделения
        paint.setStyle(Paint.Style.FILL);

        // Предположим, что мы нашли текст и знаем его координаты
        RectF rect = new RectF(100, 100, 300, 150); // Координаты текста
        canvas.drawRect(rect, paint);

        // Здесь нужно перерисовать PDF с выделениями
        pdfView.setDrawingCacheEnabled(true);
    }
}

Примечания:

  • PDFiumAndroid: Вам нужно будет добавить зависимость для PDFiumAndroid в ваш build.gradle:
implementation 'com.github.barteksc:pdfiumandroid:1.9.0'
  • Извлечение текста: В этом кодовом примере я не включил метод для извлечения текста из PDF и его поиска; вам нужно будет написать функцию, которая использует PDFium для извлечения текста и поиска в Bitmap или Canvas.

  • Но имейте в виду: То, что я предложил, является упрощенным примером. Если вам нужно полностью функционирующее решение, которое поддерживает выделение текста и сохранение результатов, то взаимодействие с PDF-файлом может потребовать применения более сложных подходов или библиотек.

Если вы столкнулись с ошибками при использовании Spire.Doc, возможно, это связано с тем, что библиотека предназначена для использования с Java SE, а не с Android. Я рекомендую попробовать вышеприведенное решение с PDFium.

Оцените материал
Добавить комментарий

Капча загружается...