Quét di động trực tiếp sang PDF có thể cách mạng hóa quy trình làm việc tài liệu của bạn. Được trang bị các tính năng như tự động phát hiện trang, đèn flash tích hợp để chiếu sáng tốt hơn, quản lý màu chính xác và cài đặt máy ảnh được thiết kế riêng để tạo tệp PDF cấp chuyên nghiệp, bạn có thể đạt được kết quả đáng chú ý chỉ với một vài thao tác trên điện thoại thông minh của mình, nhờ công nghệ tiên tiến công nghệ.
Hướng dẫn sau đây phác thảo cách bạn có thể khai thác sức mạnh của Android PDF SDK của Foxit để phát triển nhanh chóng một ứng dụng có khả năng quét mạnh mẽ. Cho dù bạn đang chụp nhiều ảnh hay chọn ảnh từ thư viện của mình, việc tạo tệp PDF chỉ đơn giản bằng một cú nhấp chuột. Dự án này cho phép bạn tích hợp liền mạch chức năng quét vào quy trình làm việc hiện tại của mình, biến nó thành một bổ sung có giá trị cho ứng dụng di động của bạn.
Bạn có quyền tự do kết hợp thương hiệu ứng dụng hoặc doanh nghiệp của riêng mình một cách dễ dàng mà không cần phải chuyển đổi các yếu tố hoặc thiết kế lại giao diện người dùng. Nó cung cấp một trình xem PDF trống với nút quét dành riêng cho thiết bị di động, đóng vai trò là nền tảng để xây dựng ứng dụng độc đáo của bạn.
Yêu cầu của thiết bị Android:
Android 4.4 (API 19) trở lên
ARM 32/64-bit (armeabi-v7a/arm64-v8a) hoặc CPU Intel x86 32/64-bit
Android Studio 3.2 trở lên (hỗ trợ AndroidX)
Môi trường thời gian chạy cho các bản demo của chúng tôi:
• Android Studio 3.2
• JDK 1.8
• Phiên bản lớp 4.6
• Công cụ xây dựng Gradle 3.2
Lưu ý: Bắt đầu từ phiên bản 8.2, Foxit PDF SDK dành cho Android sẽ chỉ hỗ trợ AndroidX và không còn phục vụ thư viện hỗ trợ Android nữa.
Khởi động Android Studio và mở dự án androidrdk/samples/viewer_ctrl_demo.
Thêm thư viện phụ thuộc quét vào tệp gradle (view_ctrl_demo/app/build.gradle) như bên dưới:
implementation(name:'FoxitPDFScan-UI', ext:'aar') implementation(name:'FoxitMobileScanningRDK', ext:'aar') implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
Trước khi gọi chức năng Quét, bạn cần phải có quyền lưu trữ và quyền chụp ảnh. Nếu không có quyền sử dụng máy ảnh và album ảnh trước khi gọi chức năng Quét, ứng dụng sẽ không chạy chính xác. Thực hiện theo các bước bên dưới để đặt quyền.
Thêm các khai báo liên quan đến quyền trong tệp AndroidManifest bằng mã bên dưới:
<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" />
Sau đó thêm mã yêu cầu quyền sau vào 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(); } }
Bây giờ, hãy thêm mã liên quan đến chức năng Quét:
Thêm nút vào giao diện người dùng để gọi chức năng Quét.
Đầu tiên, viết một số mã để thêm biểu tượng nút camera. Bạn sẽ xác định bố cục, vị trí và tài nguyên hình ảnh cho nút. Mã này được thêm vào phương thức onCreate của tệp MainActivity để đảm bảo rằng nút được hiển thị ngay khi tải dự án. Đảm bảo thêm phần này sau:
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(); }
Bây giờ, hãy đặt nền tảng cho tính năng quét của ứng dụng. Dòng mã cuối cùng trong phương thức onCreate ở trên là lệnh gọi initScan(), đây là phương thức chúng ta sẽ sử dụng để khởi tạo các lớp liên quan cho dự án.
Mã bên dưới cho thấy cách bạn khởi tạo một đối tượng từ lớp Quét PDF chính của Foxit (PDFScanManager), sau đó sử dụng lớp đó để khởi tạo trình quét và các tính năng nén. Phương pháp cuối cùng sẽ hiển thị chức năng quét khi bạn nhấp vào nút camera.
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); }
Mã khởi tạo sau đó được thêm vào phương thức initScan như sau. Phương thức này cũng sẽ được thêm vào lớp MainActivity và được gọi ngay khi dự án tải. Điều này đảm bảo dự án của bạn sẽ có sẵn tất cả các thư viện và chức năng quét.
Các mục nhập và biến sau đây là cần thiết cho dự án:
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)); } } }); }
Bây giờ chúng ta đã khởi tạo thư viện và thiết lập nền tảng, chúng ta sẽ viết hai giao diện gọi lại cơ bản sẽ được sử dụng để lưu tài liệu sau khi được quét: giao diện đầu tiên, ScanPDFDoneCallBack, hoàn toàn tùy chỉnh và giao diện thứ hai là IPDFScanManagerListener, giao diện này có sẵn ngay trong SDK. Xem cả hai bên dưới:
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); }
Sự khác biệt giữa hai giao diện là nếu cài đặt giám sát ScanPDFDoneCallBack, khi bạn nhấp vào nút 'Xong' ở góc dưới bên phải của hình bên dưới, nó sẽ trực tiếp lưu tài liệu vào đường dẫn mặc định và thoát khỏi giao diện quét, đồng thời quay lại đường dẫn lưu mặc định thông qua tham số savePath.
Nếu ScanPDFDoneCallBack chưa được thiết lập, khi bạn nhấp vào nút 'Xong' ở góc dưới bên phải của hình bên dưới, giao diện chọn thư mục lưu sẽ bật lên. Người dùng chọn thư mục được chỉ định và tài liệu sẽ được lưu trong thư mục do người dùng chọn.
https://developers.foxit.com/dk_utwp/2021/10/android-mobile-scanning-tool-pdf-sdk-app.mp4
Bây giờ, bạn phải triển khai các giao diện bằng cách thêm chúng vào 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 } } });
Nếu bạn muốn triển khai thêm các giao diện của lớp pdfscan, vui lòng tham khảo tài liệu Tham khảo API trong foxitpdfsdk_8_1_android/docs.
Xong! Chức năng quét đã được thêm thành công vào ứng dụng của bạn. Chạy ứng dụng, nhấp vào nút Quét bạn đã tạo trước đó và bắt đầu trải nghiệm quét của mình.
Chúng tôi làm việc với bạn để thêm chức năng thư viện PDF hoàn chỉnh vào dự án của bạn và phát triển trên tất cả các nền tảng và môi trường trên một API cốt lõi. Hãy dùng thử miễn phí 30 ngày ngay hôm nay bằng cách nhấp vào đây.
Cũng được xuất bản ở đây .