모바일에서 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 CPU
Android Studio 3.2 이상(AndroidX 지원)
데모용 런타임 환경:
• 안드로이드 스튜디오 3.2
• JDK 1.8
• Gradle 버전 4.6
• Gradle 빌드 도구 3.2
참고: 버전 8.2부터 Android용 Foxit PDF SDK는 AndroidX만 지원하며 더 이상 Android 지원 라이브러리를 서비스하지 않습니다.
Android Studio를 시작하고 androidrdk/samples/viewer_ctrl_demo 프로젝트를 엽니다.
아래와 같이 gradle 파일(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(); } }
이제 Scan 기능과 관련된 코드를 추가해 보겠습니다.
스캔 기능을 호출하려면 UI에 버튼을 추가하세요.
먼저 카메라 버튼 아이콘을 추가하는 코드를 작성합니다. 버튼의 레이아웃, 위치 지정 및 이미지 리소스를 정의합니다. 이 코드는 프로젝트가 로드되는 즉시 버튼이 표시되도록 MainActivity 파일의 onCreate 메서드에 추가됩니다. 다음 뒤에 이를 추가하세요.
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()에 대한 호출입니다.
아래 코드는 Foxit의 주요 PDF Scan 클래스(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 클래스의 추가 인터페이스를 구현하려면 foxitpdfsdk_8_1_android/docs의 API 참조 문서를 참조하세요.
완료! 스캔 기능이 애플리케이션에 성공적으로 추가되었습니다. 앱을 실행하고 이전에 생성한 스캔 버튼을 클릭하고 스캔 경험을 시작하세요.
우리는 귀하의 프로젝트에 완전한 PDF 라이브러리 기능을 추가하고 하나의 핵심 API에서 모든 플랫폼과 환경에 걸쳐 개발하기 위해 귀하와 협력합니다. 지금 여기를 클릭하여 30일 무료 평가판을 사용해 보세요.
여기에도 게시되었습니다.