Mobiles Scannen direkt in PDF kann Ihre Dokumenten-Workflows revolutionieren. Ausgestattet mit Funktionen wie automatischer Seitenerkennung, integriertem Blitz für bessere Beleuchtung, präzisem Farbmanagement und Kameraeinstellungen, die auf die Erstellung professioneller PDFs zugeschnitten sind, können Sie dank modernster Technologie mit nur wenigen Fingertipps auf Ihrem Smartphone bemerkenswerte Ergebnisse erzielen Technologie.
Der folgende Leitfaden beschreibt, wie Sie die Leistungsfähigkeit des Android PDF SDK von Foxit nutzen können, um schnell eine App mit robusten Scanfunktionen zu entwickeln. Unabhängig davon, ob Sie mehrere Fotos aufnehmen oder Bilder aus Ihrer Galerie auswählen, ist das Erstellen einer PDF-Datei so einfach wie ein einziger Klick. Dieses Projekt ermöglicht Ihnen die nahtlose Integration des Scannens in Ihre bestehenden Arbeitsabläufe und macht es zu einer wertvollen Ergänzung Ihrer mobilen Anwendung.
Sie haben die Freiheit, Ihr eigenes Unternehmens- oder Anwendungs-Branding mühelos zu integrieren, ohne Elemente umschalten oder die Benutzeroberfläche neu gestalten zu müssen. Es bietet einen leeren PDF-Viewer mit einer speziellen Schaltfläche zum mobilen Scannen, der als Grundlage für die Erstellung Ihrer einzigartigen App dient.
Anforderungen an Android-Geräte:
Android 4.4 (API 19) oder höher
32/64-Bit-ARM (armeabi-v7a/arm64-v8a) oder 32/64-Bit-Intel x86-CPU
Android Studio 3.2 oder neuer (unterstützt AndroidX)
Die Laufzeitumgebung für unsere Demos:
• Android Studio 3.2
• JDK 1.8
• Gradle-Version 4.6
• Gradle Build Tool 3.2
Hinweis: Ab Version 8.2 unterstützt Foxit PDF SDK für Android nur noch AndroidX und bedient die Android-Unterstützungsbibliothek nicht mehr.
Starten Sie Android Studio und öffnen Sie das Projekt androidrdk/samples/viewer_ctrl_demo.
Fügen Sie die Scan-Abhängigkeitsbibliothek wie folgt in die Gradle-Datei (view_ctrl_demo/app/build.gradle) ein:
implementation(name:'FoxitPDFScan-UI', ext:'aar') implementation(name:'FoxitMobileScanningRDK', ext:'aar') implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
Bevor Sie die Scan-Funktion aufrufen, müssen Sie die Speichererlaubnis und die Erlaubnis zum Aufnehmen von Bildern einholen. Wenn vor dem Aufruf der Scan-Funktion nicht die Erlaubnis zur Nutzung der Kamera und des Fotoalbums eingeholt wird, wird die App nicht korrekt ausgeführt. Führen Sie die folgenden Schritte aus, um Berechtigungen festzulegen.
Fügen Sie berechtigungsbezogene Deklarationen in der AndroidManifest-Datei hinzu, indem Sie den folgenden Code verwenden:
<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" />
Fügen Sie dann den folgenden Berechtigungsanforderungscode in MainActivity.java hinzu:
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(); } }
Fügen wir nun den Code für die Scan-Funktion hinzu:
Fügen Sie der Benutzeroberfläche eine Schaltfläche hinzu, um die Scan-Funktion aufzurufen.
Schreiben Sie zunächst Code, um das Kameratastensymbol hinzuzufügen. Sie definieren das Layout, die Positionierung und die Bildressource für die Schaltfläche. Dieser Code wird zur onCreate-Methode der MainActivity-Datei hinzugefügt, um sicherzustellen, dass die Schaltfläche angezeigt wird, sobald das Projekt geladen wird. Stellen Sie sicher, dass Sie dies hinzufügen, nachdem:
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(); }
Lassen Sie uns nun den Grundstein für die Scanfunktion der App legen. Die letzte Codezeile in der oben genannten onCreate-Methode ist ein Aufruf von initScan(), der Methode, die wir zum Initialisieren der relevanten Klassen für das Projekt verwenden.
Der folgende Code zeigt, wie Sie ein Objekt aus der Haupt-PDF-Scan-Klasse (PDFScanManager) von Foxit instanziieren und diese Klasse dann verwenden, um den Scanner und die Komprimierungsfunktionen zu initialisieren. Die letzte Methode zeigt die Scanfunktion an, sobald Sie auf die Kameraschaltfläche klicken.
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); }
Der Initialisierungscode wird dann wie folgt zur initScan-Methode hinzugefügt. Diese Methode wird auch zur MainActivity-Klasse hinzugefügt und aufgerufen, sobald das Projekt geladen wird. Dadurch wird sichergestellt, dass für Ihr Projekt alle Scan-Bibliotheken und Funktionen verfügbar sind.
Für das Projekt sind folgende Importe und Variablen notwendig:
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)); } } }); }
Nachdem wir nun die Bibliothek initialisiert und die Grundlage geschaffen haben, werden wir zwei grundlegende Rückrufschnittstellen schreiben, die zum Speichern des Dokuments nach dem Scannen verwendet werden: die erste, ScanPDFDoneCallBack, die vollständig benutzerdefiniert ist, und die zweite, IPDFScanManagerListener, die ist standardmäßig im SDK verfügbar. Siehe beide unten:
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); }
Der Unterschied zwischen den beiden Schnittstellen besteht darin, dass, wenn die Überwachung von ScanPDFDoneCallBack eingestellt ist, wenn Sie auf die Schaltfläche „Fertig“ in der unteren rechten Ecke der Abbildung unten klicken, das Dokument direkt im Standardpfad gespeichert und die Scanschnittstelle verlassen wird Kehren Sie über den Parameter savePath zum Standardspeicherpfad zurück.
Wenn ScanPDFDoneCallBack nicht eingestellt ist und Sie auf die Schaltfläche „Fertig“ in der unteren rechten Ecke der Abbildung unten klicken, wird eine Schnittstelle zur Auswahl des Speicherverzeichnisses angezeigt. Der Benutzer wählt das angegebene Verzeichnis aus und das Dokument wird in dem vom Benutzer ausgewählten Verzeichnis gespeichert.
https://developers.foxit.com/dk_utwp/2021/10/android-mobile-scanning-tool-pdf-sdk-app.mp4
Jetzt müssen Sie die Schnittstellen implementieren, indem Sie sie zu MainActivity.java hinzufügen.
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 } } });
Wenn Sie weitere Schnittstellen der pdfscan-Klasse implementieren möchten, lesen Sie bitte die API-Referenzdokumente in foxitpdfsdk_8_1_android/docs.
Erledigt! Die Scanfunktion wurde Ihrer Anwendung erfolgreich hinzugefügt. Führen Sie die App aus, klicken Sie auf die Schaltfläche „Scannen“, die Sie zuvor erstellt haben, und starten Sie Ihr Scan-Erlebnis.
Wir arbeiten mit Ihnen zusammen, um Ihrem Projekt vollständige PDF-Bibliotheksfunktionen hinzuzufügen und über alle Plattformen und Umgebungen hinweg auf einer zentralen API zu entwickeln. Machen Sie noch heute eine kostenlose 30-Tage-Testversion, indem Sie hier klicken.
Auch hier veröffentlicht.