Случается такая фигня что бывает нужно создать читалку pdf файлов, на гитхабе есть в принципе читалки которые позволяют отображать pdf файлы в собственных вьюхах, но они очень медленные и как-то очень громоздкие, обычно все те функции что они имеют по сути и не нужны. Вот в моем случае и понадобилось просто отобразить страницы pdf файла, я решил это сделать в картинках что бы это можно было отображать в виде страниц в view pager.
В этом примере я буду отображать только одну картинку, первую страницу файла, для простоты понимания того как это работает, что бы не нагружать проект лишними элементами.
Как всегда начинаем мы работу с пустого проекта, в который нам нужно добавить библиотеки. Библиотеки мы будем использовать PdfView, немного кастомизированную для корректной работы конвертера, так же будем использовать Dexter для попрошайничества пермишенов на запись и чтение из файловой системы, ну и ButterKnife для удобного биндинга вьюх.
Я для того что бы пофиксить PdfView скачивал его отдельно и подключал как проект, так что у меня он есть уже подключенный, если хотите можете попробовать его подключить через имплементацию чисто либу, не проект, может у вас заработает без фиксов в либе. Что конкретно я фиксил не помню так как это было давно так что проще скачать проект с моего гитхаба :).
app/build.gradle
Дальше после того как мы подключили все библиотеки и все прошло нормально, нам нужно создать класс который будет отвечать за работу конвертации пути файлов из непонятного для нас в понятный, что бы проще было находить сохраненные файлы после того как мы будем их получать в onActivityResult().
ImageFilePathUtils.java
Особо останавливаться на этом классе не буду, он стырен из stackoverflow очень давно и как-то я его до сих пор использую так как он решает кучу проблем с рисованием ссылок на файлы после получения онных в onActivityResult(). В общем нас интересует только метод getPath(), он нам возвращает реальную ссылку на файл.
Дальше мы создадим AsyncTask который будет в фоне генерировать нам нашу картинку из pdf файла. Я не захотел нагружать проект Rx'ом как я это делал в прошлых статьях так-как хотелось попроще сделать все, но если прям сильно хочется то я думаю те кто его используют, смогут перевести этот AsyncTask в вид RxAndroid'а. Если что вот тут статья про RxAndroid который делает код очень эстетически красивым.
PDFToImageTask.java
В этом классе нас интересует метод doInBackground() который у нас принимает адрес файла который мы хотим конвертнуть и дальше делает какую-то магию непонятную которую нам нужно разобрать. После того как мы поменяем разрешение файла в его имени и создании пустого файла в папке кеша программы мы переходим в к самому интересному, к конвертации. У нас в try идет вызов DecodeServiceBase класса который является классом библиотеки PdfView, вот он то и производит разбитие файла на фреймы и дальше мы берем первую страницу файла с помощью метода getPage(0), и делаем ее битмап и дальше сохраняем в файл с форматом jpeg. Дальше возвращаем путь к сохраненной картинке в onPostExecute() в активити для отображения.
Вот собственно и вся магия. Все очень просто, когда ты делал такое и шаришь как это делать. :) Дальше нам нужно в активити вызвать этот класс для конвертации и отобразить картинку в ImageView.
Для начала нарисуем леяут с картинкой и прогрессбаром для визуализации работы конвертера.
activity_main.xml
Я это все поместил в RelativeLayout для красоты что бы оно лежало друг на друге, пока мы конвертируем, progressBar будет крутиться пока у нас происходит конвертация и исчезнет как только картинка будет готова к отображению.
Дальше напишем нашу activity что бы она делал все что я описывал выше. Получала pdf файл и конвертировала его в картинку и отображала в ImageView. А еще мы подписали ImageView на onClick событие что бы по нажатию на нее у нас открывался какой-то файловый менеджер для получения списка файлов.
MainActivity.java
Для начала нас интересует метод onCreate(), в котором мы подключили ButterKnife для удобного поиска вьюх в xml и Dexter для удобного запроса на пермишены для чтения и записи файлов. Далее в onImageClick() мы сделали Intent для открытия файлового менеджера, и в onActivityResult() получаем файл который был выбран, показываем ProgressBar и запускаем наш AsyncTask для конвертации. В конце всего этого действия мы отображаем нашу картинку в ImageView в методе onPDFToImageConverted() и прячем ProgressBar.
Ну и не забываем добавить пермишены в AndroidManifest для того что бы приложение знало какие пермишены нам нужны.
AndroidManifest.xml
Ну и вроде бы все, вроде ничего не забыл. Компилируем проект, выбираем картинку и пробуем конвертировать, должно все работать.
Исходники:
GitHub
В этом примере я буду отображать только одну картинку, первую страницу файла, для простоты понимания того как это работает, что бы не нагружать проект лишними элементами.
Как всегда начинаем мы работу с пустого проекта, в который нам нужно добавить библиотеки. Библиотеки мы будем использовать PdfView, немного кастомизированную для корректной работы конвертера, так же будем использовать Dexter для попрошайничества пермишенов на запись и чтение из файловой системы, ну и ButterKnife для удобного биндинга вьюх.
Я для того что бы пофиксить PdfView скачивал его отдельно и подключал как проект, так что у меня он есть уже подключенный, если хотите можете попробовать его подключить через имплементацию чисто либу, не проект, может у вас заработает без фиксов в либе. Что конкретно я фиксил не помню так как это было давно так что проще скачать проект с моего гитхаба :).
app/build.gradle
Дальше после того как мы подключили все библиотеки и все прошло нормально, нам нужно создать класс который будет отвечать за работу конвертации пути файлов из непонятного для нас в понятный, что бы проще было находить сохраненные файлы после того как мы будем их получать в onActivityResult().
ImageFilePathUtils.java
Особо останавливаться на этом классе не буду, он стырен из stackoverflow очень давно и как-то я его до сих пор использую так как он решает кучу проблем с рисованием ссылок на файлы после получения онных в onActivityResult(). В общем нас интересует только метод getPath(), он нам возвращает реальную ссылку на файл.
Дальше мы создадим AsyncTask который будет в фоне генерировать нам нашу картинку из pdf файла. Я не захотел нагружать проект Rx'ом как я это делал в прошлых статьях так-как хотелось попроще сделать все, но если прям сильно хочется то я думаю те кто его используют, смогут перевести этот AsyncTask в вид RxAndroid'а. Если что вот тут статья про RxAndroid который делает код очень эстетически красивым.
PDFToImageTask.java
В этом классе нас интересует метод doInBackground() который у нас принимает адрес файла который мы хотим конвертнуть и дальше делает какую-то магию непонятную которую нам нужно разобрать. После того как мы поменяем разрешение файла в его имени и создании пустого файла в папке кеша программы мы переходим в к самому интересному, к конвертации. У нас в try идет вызов DecodeServiceBase класса который является классом библиотеки PdfView, вот он то и производит разбитие файла на фреймы и дальше мы берем первую страницу файла с помощью метода getPage(0), и делаем ее битмап и дальше сохраняем в файл с форматом jpeg. Дальше возвращаем путь к сохраненной картинке в onPostExecute() в активити для отображения.
Вот собственно и вся магия. Все очень просто, когда ты делал такое и шаришь как это делать. :) Дальше нам нужно в активити вызвать этот класс для конвертации и отобразить картинку в ImageView.
Для начала нарисуем леяут с картинкой и прогрессбаром для визуализации работы конвертера.
activity_main.xml
Я это все поместил в RelativeLayout для красоты что бы оно лежало друг на друге, пока мы конвертируем, progressBar будет крутиться пока у нас происходит конвертация и исчезнет как только картинка будет готова к отображению.
Дальше напишем нашу activity что бы она делал все что я описывал выше. Получала pdf файл и конвертировала его в картинку и отображала в ImageView. А еще мы подписали ImageView на onClick событие что бы по нажатию на нее у нас открывался какой-то файловый менеджер для получения списка файлов.
MainActivity.java
Для начала нас интересует метод onCreate(), в котором мы подключили ButterKnife для удобного поиска вьюх в xml и Dexter для удобного запроса на пермишены для чтения и записи файлов. Далее в onImageClick() мы сделали Intent для открытия файлового менеджера, и в onActivityResult() получаем файл который был выбран, показываем ProgressBar и запускаем наш AsyncTask для конвертации. В конце всего этого действия мы отображаем нашу картинку в ImageView в методе onPDFToImageConverted() и прячем ProgressBar.
Ну и не забываем добавить пермишены в AndroidManifest для того что бы приложение знало какие пермишены нам нужны.
AndroidManifest.xml
Ну и вроде бы все, вроде ничего не забыл. Компилируем проект, выбираем картинку и пробуем конвертировать, должно все работать.
Исходники:
GitHub
Комментариев нет:
Отправить комментарий