Android delphi открыть pdf

Работа с PDF. Чтение PDF-файлов

Android не всегда умел работать с PDF-файлами. Вплоть до версии Android 4.4 KitKat (API 19) у нас не было возможности просматривать PDF-файлы, кроме как используя сторонние приложения, такие как Google Drive PDF Viewer или другой нативный ридер на устройстве.

Начиная с Android 5.0 Lolipop (API 21) появилось API под названием PDFRenderer, с помощью которого можно выводить содержимое PDF-файлов. В этой статье мы создадим приложение, которое открывает PDF-файлы на устройстве для чтения.

Создадим новый проект, указав для него минимальную версию SDK Android 5.0 Lolipop. Для навигации приложения и дальнейшей работы с ним выберем Navigation Drawer Activity.

Шаг 1. Создание списка PDF-файлов

Перед тем, как начать работу, нужно предоставить приложению разрешения. Для этого в AndoridManifest.xml добавим следующие разрешения на чтение и запись.

На MainActivity мы будем получать список PDF-файлов, которые находятся в хранилище устройства. Для этого на файле разметки content_main.xml добавим компонент ListView.

Также нужно создать разметку для элемента в списке. Создадим в res/layout файл разметки list_item.xml и добавим в него следующий код.

Найденные файлы нужно сохранять в модель, чтобы затем передать в список. Для этого создадим класс PdfFile, в котором будут определены 2 поля (имя файла и путь), а также сеттеры и геттеры для изменения полей.

После этого в коде активности перед началом работы нужно проверить версию Android. Если версия ниже Android 6.0 M — инициализируем создание списка, в противном случае нужно проверить разрешения.

Метод checkPermission() проверяет наличие разрешения на чтение внешнего хранилища. Если разрешения имеются, то инициализируем создание списка, иначе запрашиваем разрешения. Пользователю будет показан диалог, предлагающий предоставить приложению разрешение, результат этого вернётся в метод onRequestPermissionsResult() активности.

В методе initViews() нам нужно инициализировать список. Для этого вызываем внутри метод initList(), который будет рекурсивно вызываться до тех пор, пока не будет проверен каждый каталог. В результате выполнения initList() будет заполнен список найденными PDF-файлами, который затем будет передан в адаптер. В адаптере переопределяются методы в соответствии с тем, что нам нужно, в частности в методе getView() мы получаем созданную для элемента разметку и устанавливаем в поле имя файла.

Шаг 2. Создание активности для просмотра

Здесь мы создадим активность, в которой будет просматриваться выбранный PDF-файл. Отрендеренная страница PDF будет загружаться в компонент ImageView. Также здесь будут располагаться кнопки переключения страниц и увеличения/уменьшения масштаба страницы.

Добавим Empty Activity, назвав PdfActivity, и в коде разметки активности добавим следующий код.

При запуске активности в методе onCreate() получаем имя и путь файла из интента, а также определяем компоненты и устанавливает слушатели на кнопки.

Затем в методе onStart() вызывается метод openPdfRenderer(), в котором происходит получение дескриптора файла для поиска PDF и создание объекта PdfRenderer. После этого вызывается метод displayPage(), который рендерит выбранную страницу.

Читайте также:  Голос костылева для андроид

Что касается метода displayPage(), в нём для каждой страницы, которую нужно отрендерить, открываем эту страницу, рендерим её и закрываем страницу. В результате рендера страница сохраняется в Bitmap с заданными размерами и зумом, после чего загружается в ImageView.

Обработчики кнопок вынесены в onClick(), здесь ничего особенного нет: кнопки «Назад» и «Вперёд» изменяют текущий индекс страницы в нужную сторону и вызывают метод displayPage(), аналогично кнопки зума изменяют уровень зума и вызывают метод displayPage() с текущим индексом.

Для того, чтобы при перевороте экрана запомнить текущий индекс страницы, переопределён метод onSaveInstanceBundle(), в котором в бандл помещается индекс страницы. Затем этот индекс забирается в onCreate() активности, что было показано выше.

При завершении работы и закрытии активности нужно закрыть PdfRenderer, для этого в переопределённом методе onStop() вызывается метод closePdfRenderer(), в котором удаляются все данные рендера.

В результате получилось простое приложение, способное открывать и показывать PDF-файлы.

Заключение

В этой статье мы рассмотрели, как можно использовать PdfRenderer API для отображения PDF-файлов в приложении. В следующей статье мы рассмотрим, как создать свой PDF-файл.

Работа с PDF. Чтение PDF-файлов : 2 комментария

Доброго времени суток.
Всё круто, но)
Для рендеринга нужно что бы страница умещалась во вьюху
// определяем размеры Bitmap
int newWidth = (int) (getResources().getDisplayMetrics().widthPixels * curPage.getWidth() / 72
* currentZoomLevel / 40);//45

int newHeight = (int) (getResources().getDisplayMetrics().heightPixels * curPage.getHeight() / 72
* currentZoomLevel / 65);//90

Bitmap bitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Matrix matrix = new Matrix();
float dpiAdjustedZoomLevel = currentZoomLevel * DisplayMetrics.DENSITY_MEDIUM
/ getResources().getDisplayMetrics().densityDpi;
matrix.setScale(dpiAdjustedZoomLevel, dpiAdjustedZoomLevel);
curPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
Далее, вместо скролов и ImageView, я сделал так:

Отлично маштабируется и намного приятнее)
Но всё равно спасибо, статья неплохая.

Источник

Opening a PDF on Android with Delphi

Intents on Android using API 26 to open PDF documents.

Recently, the Google Play store updated its requirements so the target API level of 26 was used to get new apps submitted. While this was reasonably easy to achieve through updating the AndroidManifest.Template, the change to the newer API changed the behaviour of my application.

Before the update, I would download a file to the CachePath and then share to a public folder. I would then get a URI for the public folder path file and share via Intents. Following the update, this no longer worked. After a little research, I discovered this was due to the changes in the Android security system, that actually, make a lot of sense. Rather than sharing the file outside the application, you now provide tempory access to it via the Intent. To achieve this, you need to setup a Provider, (this is done via XML) and then programmatically provide the path as a ‘content://’ URI, set flags for allowing read / write access via the intent and share it.

The video shows how to achieve this and demo’s the working code. To help, below are some of the XML blocks you will need upon the way.

Adding Provider

Add this to the AndroidManifest.template in the source code root folder, before the tag. This is then used to build all Android apps.

Provider file

Create a fileprovider.xml (or whatever file name you set in android:resource when declaring the provider).

More flags and details for Provider Files can be found on the Android documentation

Читайте также:  Полезные проги для андроид авто

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today

Источник

Delphi — открыть PDF с параметрами без пути по умолчанию для приложения для чтения

У меня проблема с открытием pdf-файла из Delphi. Мне нужно открыть pdf с параметрами, потому что я хочу создать справочное руководство для своей программы. Я пытаюсь использовать shellExecute, но этой функции нужен путь для читателя pdf.

Программа работает, но для меня это не решение. Некоторые пользователи могут использовать другую программу для чтения PDF-файлов. Вы знаете, как не добавлять путь для чтения?

Я думаю, что мне нужен какой-то метод, который вытаскивает путь из читателя pdf. Это лучшее решение этой проблемы?

4 ответа

Это лучший ответ на мой вопрос

Pdf-файлы могут быть связаны с другой программой, поэтому «FindExecutable» не является надежным способом найти установленную программу Acrobat Reader. Я использую ключ реестра: HKEY_CLASSES_ROOT \ Software \ Adobe \ Acrobat \ Exe

Откройте PDF-файл с помощью системного приложения по умолчанию

ShellExecute(Handle, nil, ‘pathToMyFile.pdf’, nil, nil, SW_SHOW);

Если lpOperation равно nil , используется глагол по умолчанию.

Откройте файл PDF с параметрами

Способ открыть файл PDF с параметрами из командной строки в Windows:

Вышеупомянутый открывает файл PDF с увеличением x1000 (на самом деле не очень полезно).

Чтобы добиться того же результата с ShellExecute , сделайте следующее:

Наконец (без try ) обратите внимание, что Параметры открытия PDF зависят от приложения, поэтому другой читатель может проигнорировать их в лучшем случае; в худшем случае приложение просто откажется запускаться.
Я бы рекомендовал использовать параметры открытия только после того, как убедился, что нужное приложение доступно на клиенте; в противном случае используйте первый метод.

Если вы хотите передать параметры исполняемому файлу, вы проигнорируете любые ассоциации и потребуете наличия определенного исполняемого файла. Потому что определенные параметры будут действительны только для одного конкретного исполняемого файла. То есть Foxit не распознает параметры Acrobat, и наоборот.

В этом случае вы должны вызвать его с помощью CreateProcess . Чтобы найти исполняемый файл для Acrobat Reader, обратитесь к этому вопросу: Как получить полный путь к Adobe Reader (включая имя исполняемого файла)? Аналогичные подходы будут применяться и для других программ PDF.

Настоящая суть ShellExecute в том, что он понимает системные и пользовательские настройки для ассоциаций файлов. Оболочка знает, какое приложение следует использовать для открытия файлов разных типов и где найти это приложение.

Как правило, если вы знаете расположение исполняемого файла, используйте CreateProcess . Если вы знаете местоположение документа и хотите, чтобы система нашла исполняемый файл, используйте ShellExecute(Ex) .

Итак, передайте полный путь к файлу PDF ShellExecute и позвольте системе найти и открыть связанное приложение.

Если вы хотите правильно обрабатывать ошибки, используйте ShellExecuteEx . Вы также можете заменить ‘open’ на nil и позволить системе выбрать действие по умолчанию.

Источник

Delphi открыть PDF из ios/Android локального хранилища

Я попытался открыть файл PDF на мобильном устройстве из локального хранилища.

Я положил файл на:

StartUp\Documents\ для iOS

assets\internal\ для Android

с помощью этого кода:

на iOS работает нормально . откройте pdf правильно

на Android . ничего .. нет ошибки .. нет pdf . если я попытаюсь открыть файл html .. работает нормально.

Читайте также:  Андроид отображение тока зарядки

2 ответа

Я загружаю изображение и храню его в локальном хранилище. Я загружаю это изображение из файла html из локального хранилища. Я загружаю файл html из WebView . webView.loadUrl(file:///android_asset/show_download_image.html); но.

Я использую mozilla pdf.js для чтения и отображения содержимого файла pdf в браузере. Позже я решил перевести эту функцию в автономный режим и использовать локальное хранилище. До сих пор я могу создать автономное приложение, которое использует манифест, чтобы сделать мое приложение автономным, но.

Можно использовать компонент Android PDFView с помощью JNI birdge в XE7. https://github.com/JoanZapata/android-pdfview Инструмент Java2op может генерировать необходимый файл интерфейса pas, а IDE может управлять изменениями в файле classes.dx, что является простой частью. Чтобы заставить его жить в Delphi, требуется немного работы, но это выполнимо. Для этого вы можете почти взять код 1:1 из реализации delphi «webview», который можно найти в следующих двух классах TCustomWebBrowser в файле FMX.Webbrowser.pas и TAndroidWebBrowserService в файле FMX.WebBrowser.Android.pas. Для моего доказательства концепции я написал класс TPDFViewAndroid, который является производным от TControl, используя коды из обоих упомянутых классов. Таким образом, я нахожусь в процессе получения необходимого разрешения от Embarcaderro для публичного выпуска, но даже до этого я должен найти время, чтобы очистить, сделать реальный компонент, примеры .

Похожие вопросы:

Я внедряю планшетное приложение, которое с левой стороны показывает список моих файлов pdf, а с правой стороны я хочу показать данные файла pdf. Как я могу это сделать? и я хочу открыть Pdf во.

Я работаю в мобильном приложении на базе Cordova. Я планирую хранить данные в локальном хранилище. Я читал в сети, что есть некоторые проблемы с сохранением локального хранилища в iOS. Сохраняется.

У меня есть один pdf url. Когда я пытаюсь открыть его, он работает в браузере. Но когда я пытаюсь открыть как в android, так и в ios устройстве. Мой файл pdf не открывается, чтобы посмотреть. Вот.

Я загружаю изображение и храню его в локальном хранилище. Я загружаю это изображение из файла html из локального хранилища. Я.

Я использую mozilla pdf.js для чтения и отображения содержимого файла pdf в браузере. Позже я решил перевести эту функцию в автономный режим и использовать локальное хранилище. До сих пор я могу.

Я работаю с Android и хочу открыть файл PDF: от URL из внутреннего хранилища.(куда делось мое досье, чтобы Android его прочитал?) Кто-нибудь может мне помочь?

Я разрабатываю приложение iOS с использованием Delphi XE5 . Мне удалось загрузить и сохранить файл PDF на локальном устройстве (используя элемент управления Indy HTTP), но я не могу открыть файл для.

Я сгенерировал pdf с помощью библиотеки itext, и она хранится на SD-карте. Я должен открыть pdf в webview, но когда я искал решение, я узнал ,что могу открыть его с помощью онлайн-сервиса google.

Можно ли загрузить изображение в WebView из локального хранилища телефона android ? В основном то, что я пытаюсь сделать, это сделать снимок, затем отобразить этот снимок внутри WebView (например.

Я работаю в приложении xmarin android в c#. я хочу открыть файл pdf, который находится в пользовательской папке внутреннего хранилища TESTFOLDER. код приведен ниже, каждый раз, когда он переходит в.

Источник

Оцените статью