Мобильное сканирование непосредственно в PDF может революционизировать ваши рабочие процессы с документами. Благодаря таким функциям, как автоматическое определение страниц, встроенная вспышка для лучшего освещения, точное управление цветом и настройки камеры, адаптированные для создания PDF-файлов профессионального уровня, вы сможете добиться замечательных результатов всего несколькими нажатиями на смартфоне благодаря передовому технологии.
В следующем руководстве описывается, как можно использовать возможности Foxit Android PDF SDK для быстрой разработки приложения с надежными возможностями сканирования. Независимо от того, снимаете ли вы несколько фотографий или выбираете изображения из галереи, создание PDF-файла выполняется одним щелчком мыши. Этот проект позволит вам легко интегрировать сканирование в существующие рабочие процессы, что сделает его ценным дополнением к вашему мобильному приложению.
У вас есть свобода легко внедрить брендинг своего бизнеса или приложения без необходимости переключать элементы или перепроектировать пользовательский интерфейс. Он предоставляет пустую программу просмотра PDF-файлов со специальной кнопкой мобильного сканирования, которая служит основой для создания вашего уникального приложения.
Требования к Android-устройствам:
Android 4.4 (API 19) или выше
32/64-битный процессор ARM (armeabi-v7a/arm64-v8a) или 32/64-битный процессор Intel x86.
Android Studio 3.2 или новее (поддерживает AndroidX)
Среда выполнения для наших демонстраций:
• Android-студия 3.2.
• JDK 1.8
• Gradle версии 4.6.
• Инструмент сборки Gradle 3.2.
Примечание. Начиная с версии 8.2, Foxit PDF SDK для Android будет поддерживать только AndroidX и больше не будет обслуживать библиотеку поддержки Android.
Запустите Android Studio и откройте проект androidrdk/samples/viewer_ctrl_demo.
Добавьте библиотеку зависимостей сканирования в файл градиента (view_ctrl_demo/app/build.gradle), как показано ниже:
implementation(name:'FoxitPDFScan-UI', ext:'aar') implementation(name:'FoxitMobileScanningRDK', ext:'aar') implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
Перед вызовом функции «Сканирование» необходимо получить разрешение на хранение и разрешение на съемку. Если до вызова функции сканирования не получено разрешение на использование камеры и фотоальбома, приложение не будет работать корректно. Выполните следующие действия, чтобы установить разрешения.
Добавьте объявления, связанные с разрешениями, в файл AndroidManifest, используя приведенный ниже код:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RUN_INSTRUMENTATION"/> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" />
Затем добавьте следующий код запроса разрешения в MainActivity.java:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int permission = ContextCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_EXTERNAL_STORAGE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //Application permission is successful } else { UIToast.getInstance(getApplicationContext()).show(getString(R.string.fx_permission_denied)); finish(); } }
Теперь давайте добавим код, связанный с функцией сканирования:
Добавьте в пользовательский интерфейс кнопку для вызова функции сканирования.
Сначала напишите код, чтобы добавить значок кнопки камеры. Вы определите макет, расположение и ресурс изображения для кнопки. Этот код добавляется в метод onCreate файла MainActivity, чтобы гарантировать, что кнопка отображается сразу после загрузки проекта. Обязательно добавьте это после:
protected void onCreate(Bundle savedInstanceState) { (...) // Make sure to add this block of code after all the already existing // view_ctrl_demo onCreate code is loaded mRootView=uiExtensionsManager.getContentView(); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); mIvScan = new ImageView(this); mIvScan.setImageResource(R.drawable.fx_floatbutton_scan); layoutParams.bottomMargin = 80; layoutParams.rightMargin = 50; layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); mIvScan.setLayoutParams(layoutParams); mRootView.addView(mIvScan); setContentView(mRootView); initScan(); }
Теперь давайте заложим основу для функции сканирования приложения. Последняя строка кода в приведенном выше методе onCreate — это вызов initScan(), метода, который мы будем использовать для инициализации соответствующих классов для проекта.
В приведенном ниже коде показано, как создать экземпляр объекта из основного класса сканирования PDF-файлов Foxit (PDFScanManager), а затем использовать этот класс для инициализации сканера и функций сжатия. Последний метод отображает функцию сканирования после нажатия кнопки камеры.
PDFScanManager pdfScanManager = PDFScanManager.instance() if (!PDFScanManager.isInitializeScanner()) { long framework1 = 0; long framework2 = 0; PDFScanManager.initializeScanner(App.inst().getAppActivity().getApplication(), framework1, framework2); } if (!PDFScanManager.isInitializeCompression()) { long compression1 = 0; long compression2 = 0; PDFScanManager.initializeCompression(App.inst().getAppActivity().getApplication(), compression1, compression2); } if (PDFScanManager.isInitializeScanner() && PDFScanManager.isInitializeCompression()) { //Loaded Successfully pdfScanManager.showUI(activity.this); }
Затем код инициализации добавляется в метод initScan следующим образом. Этот метод также будет добавлен в класс MainActivity и вызван сразу после загрузки проекта. Это гарантирует, что в вашем проекте будут все доступные библиотеки сканирования и функции.
Для проекта необходимы следующие импорты и переменные:
import com.foxit.pdfscan.PDFScanManager; private ImageView mIvScan; private ViewGroup mRootView; private void initScan(){ final PDFScanManager pdfScanManager = PDFScanManager.instance(); mIvScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!PDFScanManager.isInitializeScanner()) { long framework1 = 0; long framework2 = 0; PDFScanManager.initializeScanner(getApplication(), framework1, framework2); } if (!PDFScanManager.isInitializeCompression()) { long compression1 = 0; long compression2 = 0; PDFScanManager.initializeCompression(getApplication(), compression1, compression2); } if (PDFScanManager.isInitializeScanner() && PDFScanManager.isInitializeCompression()) { pdfScanManager.showUI((Activity) mContext); } else { UIToast.getInstance(getApplicationContext()) .show(AppResource.getString(getApplicationContext(), R.string.rv_invalid_license)); } } }); }
Теперь, когда мы инициализировали библиотеку и заложили основу, мы напишем два основных интерфейса обратного вызова, которые будут использоваться для сохранения документа после его сканирования: первый — ScanPDFDoneCallBack, полностью настраиваемый, а второй — IPDFScanManagerListener, который доступен «из коробки» в SDK. См. оба ниже:
public interface ScanPDFDoneCallBack { /** Success, and no error occurs */ int e_ErrSuccess = 0; /** Failed, any unknown error occurs. */ int e_ErrUnknown = 1; /** * After saving PDF successfully, return to the saving path * * @param errorCode if the scanned file is successfully saved as a pdf document, the errorCode is {@link #e_ErrSuccess}, otherwise is {@link #e_ErrUnknown} * @param savePath the document file path. */ void doneCallBack(int errorCode, String savePath); } public interface IPDFScanManagerListener { /** * Success, and no error occurs */ int e_ErrSuccess = 0; /** * Failed, any unknown error occurs. */ int e_ErrUnknown = 1; /** * Called when if the scanned file is successfully saved as a pdf document. * * @param errorCode if the scanned file is successfully saved as a pdf document, the errorCode is {@link #e_ErrSuccess}, otherwise is {@link #e_ErrUnknown} * @param path the document file path. */ void onDocumentAdded(int errorCode, String path); }
Разница между двумя интерфейсами заключается в том, что если установлен мониторинг ScanPDFDoneCallBack, то при нажатии кнопки «Готово» в правом нижнем углу рисунка ниже документ будет напрямую сохранен по пути по умолчанию и выйдет из интерфейса сканирования, а также вернитесь к пути сохранения по умолчанию через параметр savePath.
Если ScanPDFDoneCallBack не установлен, при нажатии кнопки «Готово» в правом нижнем углу рисунка ниже появится всплывающий интерфейс для выбора каталога сохранения. Пользователь выбирает указанный каталог, и документ будет сохранен в каталоге, выбранном пользователем.
https://developers.foxit.com/dk_utwp/2021/10/android-mobile-scanning-tool-pdf-sdk-app.mp4
Теперь вам необходимо реализовать интерфейсы, добавив их в MainActivity.java.
pdfScanManager.setDoneCallBack(new ScanPDFDoneCallBack() { @Override public void doneCallBack(int errorCode, final String savePath) { if (errorCode == e_ErrSuccess) { //The document was saved successfully } } }); PDFScanManager.registerManagerListener(new IPDFScanManagerListener() { @Override public void onDocumentAdded(int errorCode, String path) { if (errorCode == e_ErrSuccess) { //The document was saved successfully } } });
Если вы хотите реализовать дополнительные интерфейсы класса pdfscan, обратитесь к справочным документам по API в foxitpdfsdk_8_1_android/docs.
Сделанный! Функция сканирования была успешно добавлена в ваше приложение. Запустите приложение, нажмите кнопку «Сканировать», которую вы создали ранее, и начните сканирование.
Мы работаем вместе с вами, чтобы добавить в ваш проект полную функциональность библиотеки PDF и разрабатывать его для всех платформ и сред с использованием одного основного API. Воспользуйтесь 30-дневной бесплатной пробной версией сегодня, нажав здесь.
Также опубликовано здесь .