Вопрос или проблема
Как искать и выделять текст в 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 может быть сложной без использования сторонних библиотек, но есть способы.
Вот пример решения:
-
Чтение PDF: Вы можете использовать класс
PdfRenderer
, который позволяет рендерить страницы PDF-файла. Однако для поиска текста на страницах вам понадобится другой подход, так как стандартная библиотека не предоставляет прямого API для выполнения поиска текста. -
Поиск текста: Для поиска текста вы можете использовать класс
PdfiumCore
из библиотекиPDFiumAndroid
. Он позволит вам извлекать текст из PDF-документа и выполнять поиск. -
Выделение текста: К сожалению, выделение текста в оригинальном 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.