Как визуализировать PDF-файл на Android

Android не поддерживает PDF в своих библиотеках. Есть ли способ визуализировать файлы PDF в приложениях Android?


Начиная с уровня API 21 (Lollipop) Android предоставляет класс PdfRenderer:

 //создаем новое средство визуализации PdfRenderer renderer = new PdfRenderer (getSeekableFileDescriptor ()); //давайте просто отрендерим все страницы окончательно int pageCount = renderer.getPageCount ();  для (int я = 0; я  

Для получения дополнительной информации см. пример приложения.

Для более старых API я рекомендую библиотеку Android PdfViewer , он очень быстрый и простой в использовании, под лицензией Apache License 2.0:

  pdfView.fromAsset (String) .pages (0, 2, 1, 3, 3, 3  )//все страницы отображаются по умолчанию .enableSwipe (true) .swipeHorizontal (false) .enableDoubletap (true) .defaultPage (0) .onDraw (onDrawListener) .onLoad (onLoadCompleteListener) .onPageChange (onPageChangePowerProll).  onError (onErrorListener) .enableAnnotationRendering (false) .password (null) .scrollHandle (null) .load ();  


Начиная с уровня API 21 (Lollipop) Android предоставляет класс PdfRenderer:

 //создаем новое средство визуализации PdfRenderer renderer = new PdfRenderer (getSeekableFileDescriptor ()  ); //давайте просто отрендерим все страницы окончательно int pageCount = renderer.getPageCount ();  для (int я = 0; я  

Для получения дополнительной информации см. пример приложения.

Для более старых API я рекомендую библиотеку Android PdfViewer , он очень быстрый и простой в использовании, под лицензией Apache License 2.0:

  pdfView.fromAsset (String) .pages (0, 2, 1, 3, 3, 3  )//все страницы отображаются по умолчанию .enableSwipe (true) .swipeHorizontal (false) .enableDoubletap (true) .defaultPage (0) .onDraw (onDrawListener) .onLoad (onLoadCompleteListener) .onPageChange (onPageChangePowerProll).  onError (onErrorListener) .enableAnnotationRendering (false) .password (null) .scrollHandle (null) .load ();  

  открытый класс MyPdfViewActivity расширяет Activity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState);  WebView mWebView = новый WebView (MyPdfViewActivity.this);  mWebView.getSettings (). setJavaScriptEnabled (true);  mWebView.getSettings (). setPluginsEnabled (true);  mWebView.loadUrl ("https://docs. google.com/gview?embedded=true&url="+LinkTo); setContentView (mWebView);}}  


  публичный класс MyPdfViewActivity расширяет Activity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); WebView mWebView = new WebView (MyPdfViewActivity.this); mWebView.getSettings ()  .setJavaScriptEnabled (true); mWebView.getSettings (). setPluginsEnabled (true); mWebView.loadUrl ("https://docs.google.com/gview?embedded=true&url=" + LinkTo); setContentView (mWebView);}}   

Я использовал гибридный подход из некоторых ответов, данных на этот и другие подобные сообщений:

Это решение проверяет, установлено ли приложение для чтения PDF-файлов, и выполняет следующие действия: — Если программа для чтения установлена, загрузите файл PDF на устройство и запустите приложение для чтения PDF-файлов. установлен, спросите пользователя, хочет ли он просматривать файл PDF в Интернете через Google Диск

ПРИМЕЧАНИЕ! В этом решении используется класс Android DownloadManager , который был представлен в API9 (Android 2.3 или Gingerbread). Это означает, что он не работает на Android 2.2 или более ранней версии.

Я написал об этом в блоге здесь, но я предоставил полный код ниже для полноты:

  открытый класс PDFTools {private static final String GOOGLE_DRIVE_PDF_READER_PREFIX = "http://drive.google.com/viewer?url=";  приватная статическая финальная строка PDF_MIME_TYPE = "application/pdf";  закрытая статическая конечная строка HTML_MIME_TYPE = "text/html"; /** * Если установлен PDF-ридер, загрузите PDF-файл и откройте его в ридере.  * В противном случае спросите пользователя, хочет ли он просмотреть его в онлайн-программе чтения PDF-файлов на Google Диске. 
*
* ОСТОРОЖНО: этот метод * @param context * @param pdfUrl * @return */public static void showPDFUrl (конечный контекст контекста, конечная строка pdfUrl) {if (isPDFSupported (context)) {downloadAndOpenPDF (context, pdfUrl); } еще {askToOpenPDFThroughGoogleDrive (контекст, pdfUrl); }}/** * Загружает PDF-файл с помощью Android DownloadManager и открывает его с помощью установленного приложения для чтения PDF-файлов. * @param context * @param pdfUrl */@TargetApi (Build.VERSION_CODES.GINGERBREAD) public static void downloadAndOpenPDF (final Context context, final String pdfUrl) {//Получить имя файла final String filename = pdfUrl.substring (pdfUrl.lastIndexOf (" /") + 1); //Место, куда будет помещен загруженный PDF-файл final File tempFile = new File (context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS), filename); if (tempFile.exists ()) {//Если мы уже загружали файл раньше, просто покажите его. openPDF (контекст, Uri.fromFile (tempFile)); вернуть; }//Показываем диалог выполнения при загрузке финальной версии ProgressDialog progress = ProgressDialog.show (context, context.getString (R. string.pdf_show_local_progress_title), context.getString (R.string.pdf_show_local_progress_content), true); //Создаем запрос загрузки DownloadManager.Request r = new DownloadManager.Request (Uri.parse (pdfUrl)); r.setDestinationInExternalFilesDir (контекст, Environment.DIRECTORY_DOWNLOADS, имя файла); финальный DownloadManager dm = (DownloadManager) context.getSystemService (Context.DOWNLOAD_SERVICE); BroadcastReceiver onComplete = new BroadcastReceiver () {@Override public void onReceive (Контекст контекста, намерение намерения) {if (! Progress.isShowing ()) {return; } context.unregisterReceiver (это); progress.dismiss (); long downloadId = intent.getLongExtra (DownloadManager.EXTRA_DOWNLOAD_ID, -1); Курсор c = dm.query (новый DownloadManager.Query (). SetFilterById (downloadId)); если (c.moveToFirst ()) {int status = c.getInt (c.getColumnIndex (DownloadManager.COLUMN_STATUS)); если (статус == DownloadManager.STATUS_SUCCESSFUL) {openPDF (контекст, Uri.fromFile (tempFile)); }} c.close (); }}; context.registerReceiver (onComplete, новый IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE)); //Поставить запрос в очередь dm.enqueue (r); }/** * Показать диалоговое окно, в котором пользователь спрашивает, хочет ли он открыть PDF-файл через Google Диск * @param context * @param pdfUrl */public static void askToOpenPDFThroughGoogleDrive (final Context context, final String pdfUrl) {new AlertDialog.Builder ( context) .setTitle (R.string.pdf_show_online_dialog_title) .setMessage (R.string.pdf_show_online_dialog_question) .setNegativeButton (R.string.pdf_show_online_dialog_button_no, online_dialog_button_no, null_public_dialog_button_no, null). (DialogInterface dialog, int который) {openPDFThroughGoogleDrive (context, pdfUrl);}}) .show (); }/** * Запускает браузер для просмотра PDF-файла через Google Диск * @param context * @param pdfUrl */public static void openPDFThroughGoogleDrive (final Context context, final String pdfUrl) {Intent i = new Intent (Intent.ACTION_VIEW); i.setDataAndType (Uri.parse (GOOGLE_DRIVE_PDF_READER_PREFIX + pdfUrl), HTML_MIME_TYPE); context.startActivity (я); }/** * Открытие локального PDF-файла с помощью установленной программы чтения * @param context * @param localUri */public static final void openPDF (Context context, Uri localUri) {Intent i = new Intent (Intent.ACTION_VIEW); i.setDataAndType (localUri, PDF_MIME_TYPE); context.startActivity (я); }/** * Проверяет, установлены ли какие-либо приложения, поддерживающие чтение файлов PDF. * @param context * @return */public static boolean isPDFSupported (Контекст контекста) {Intent i = new Intent (Intent.ACTION_VIEW); конечный файл tempFile = новый файл (context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS), "test.pdf"); i.setDataAndType (Uri.fromFile (tempFile), PDF_MIME_TYPE); вернуть context.getPackageManager (). queryIntentActivities (i, PackageManager.MATCH_DEFAULT_ONLY). размер ()> 0; }}


Я сделал гибридный подход из некоторых ответов, данных на этот и другие подобные сообщения:

Это решение проверяет, установлено ли приложение для чтения PDF-файлов, и выполняет следующие действия: — Если программа для чтения установлена, загрузите файл PDF на устройство и запустите приложение для чтения PDF- Если программа чтения не установлена, спросите пользователя, хочет ли он просмотреть файл PDF в Интернете через Google Диск.

ПРИМЕЧАНИЕ! Это решение использует код Android DownloadManager , который был представлен в API9 (Android 2.3 или Gingerbread). Это означает, что он не работает на Android 2.2 или более ранней версии.

Я написал об этом в блоге здесь, но я предоставил полный код ниже для полноты:

  открытый класс PDFTools {private static final String GOOGLE_DRIVE_PDF_READER_PREFIX = "http://drive.google.com/viewer?url=";  приватная статическая финальная строка PDF_MIME_TYPE = "application/pdf";  закрытая статическая конечная строка HTML_MIME_TYPE = "text/html"; /** * Если установлен PDF-ридер, загрузите PDF-файл и откройте его в ридере.  * В противном случае спросите пользователя, хочет ли он просмотреть его в онлайн-программе чтения PDF-файлов на Google Диске. 
*
* ОСТОРОЖНО: этот метод * @param context * @param pdfUrl * @return */public static void showPDFUrl (конечный контекст контекста, конечная строка pdfUrl) {if (isPDFSupported (context)) {downloadAndOpenPDF (context, pdfUrl); } еще {askToOpenPDFThroughGoogleDrive (контекст, pdfUrl); }}/** * Загружает PDF-файл с помощью Android DownloadManager и открывает его с помощью установленного приложения для чтения PDF-файлов. * @param context * @param pdfUrl */@TargetApi (Build.VERSION_CODES.GINGERBREAD) public static void downloadAndOpenPDF (final Context context, final String pdfUrl) {//Получить имя файла final String filename = pdfUrl.substring (pdfUrl.lastIndexOf (" /") + 1); //Место, куда будет помещен загруженный PDF-файл final File tempFile = new File (context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS), filename); if (tempFile.exists ()) {//Если мы уже загружали файл раньше, просто покажите его. openPDF (контекст, Uri.fromFile (tempFile)); вернуть; }//Показывать диалог выполнения при загрузке финальной версии ProgressDialog progress = ProgressDialog.show (context, context.getString (R.string.pdf_show_local_progress_title), context.getString (R.string.pdf_show_local_progress_content), true); //Создаем запрос загрузки DownloadManager.Request r = new DownloadManager.Request (Uri.parse (pdfUrl)); r.setDestinationInExternalFilesDir (контекст, Environment.DIRECTORY_DOWNLOADS, имя файла); final DownloadManager dm = (DownloadManager) context.getSystemService (Контекст. DOWNLOAD_SERVICE); BroadcastReceiver onComplete = new BroadcastReceiver () {@Override public void onReceive (Контекст контекста, намерение намерения) {if (! Progress.isShowing ()) {return; } context.unregisterReceiver (это); progress.dismiss (); long downloadId = intent.getLongExtra (DownloadManager.EXTRA_DOWNLOAD_ID, -1); Курсор c = dm.query (новый DownloadManager.Query (). SetFilterById (downloadId)); если (c.moveToFirst ()) {int status = c.getInt (c.getColumnIndex (DownloadManager.COLUMN_STATUS)); если (статус == DownloadManager.STATUS_SUCCESSFUL) {openPDF (контекст, Uri.fromFile (tempFile)); }} c.close (); }}; context.registerReceiver (onComplete, новый IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE)); //Поставить запрос в очередь dm.enqueue (r); }/** * Показать диалоговое окно, в котором пользователь спрашивает, хочет ли он открыть PDF-файл через Google Диск * @param context * @param pdfUrl */public static void askToOpenPDFThroughGoogleDrive (final Context context, final String pdfUrl) {new AlertDialog.Builder ( context) .setTitle (R.string.pdf_show_online_dialog_title) .setMessage (R.string.pdf_show_online_dialog_question) .setNegativeButton (R.string.pdf_show_online_dialog_button_no, online_dialog_button_no, null_public_dialog_button_no, null). (DialogInterface dialog, int который) {openPDFThroughGoogleDrive (context, pdfUrl);}}) .show (); }/** * Запускает браузер для просмотра PDF-файла через Google Диск * @param context * @param pdfUrl */public static void openPDFThroughGoogleDrive (final Context context, final String pdfUrl) {Intent i = new Intent (Intent.ACTION_VIEW); i.setDataAndType (Uri.parse (GOOGLE_DRIVE_PDF_READER_PREFIX + pdfUrl), HTML_MIME_TYPE); context.startActivity (я); }/** * Открытие локального PDF-файла с помощью установленной программы чтения * @param context * @param localUri */public static final void openPDF (Context context, Uri localUri) {Intent i = new Intent (Intent.ACTION_VIEW); i.setDataAndType (localUri, PDF_MIME_TYPE); context.startActivity (я); }/** * Проверяет, установлены ли какие-либо приложения, поддерживающие чтение файлов PDF. * @param context * @return */public static boolean isPDFSupported (Контекст контекста) {Intent i = new Intent (Intent.ACTION_VIEW); конечный файл tempFile = новый файл (context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS), "test.pdf"); i.setDataAndType (Uri.fromFile (tempFile), PDF_MIME_TYPE); вернуть context.getPackageManager (). queryIntentActivities (я, PackageManager.MATCH_DEFAULT_ONLY) .size ()> 0; }}

вы можете использовать простой метод импорта

  implementation 'com.github.barteksc: android-pdf-viewer: 2.8.2'  

, а код XML —

   .pdfviewer. PDFView>  

и просто объявите и добавьте файл в папку ресурсов и просто назначьте имя

  PDFView pdfView = findViewById (  R.id.pdfv);  pdfView.fromAsset ("agl.pdf"). load ();  


вы можно использовать простой метод импорта

  implementation 'com.github.barteksc: android-pdf-viewer: 2.8.2'  

, а код XML —

    

и просто объявите и добавьте файл в папку ресурсов и просто назначьте имя

  PDFView pdfView = findViewById (R.id.pdfv);  pdfView.fromAsset ("agl.pdf"). load ();  

Загрузить исходный код здесь (отображать PDF-файл в моем приложении для Android)

Добавьте эту зависимость в свой Grade: compile com.github.barteksc: android-pdf-viewer: 2.0.3

     

MainActivity.java

  import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.provider.OpenableColumns; import  android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import com.github.  barteksc.pdfviewer.PDFView; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; импортировать com.github.barteksc.pdfviewer.listener.OnPageChangeListener; импортировать com.github.barteksc.pdfviewer.scroll.Defview.scroll.  pdfium.PdfDocument; import java.util.List; открытый класс MainActivity расширяет Activity, реализует OnPageChangeListener, OnLoadCompleteListener {частный статический конечный String TAG = MainActivity.class.getSimpleName ();  общедоступная статическая конечная строка SAMPLE_FILE = "android_tutorial. pdf "; PDFView pdfView; Целое число pageNumber = 0; String pdfFileName; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); pdfView = (PDFView) findViewById (R.  .pdfView); displayFromAsset (SAMPLE_FILE);} private void displayFromAsset (String assetFileName) {pdfFileName = assetFileName; pdfView.fromAsset (SAMPLE_FILE) .defaultPage (pageNumber) .enableSwipe (true) .swipeHorizontal (false).  (true) .onLoad (this) .scrollHandle (new DefaultScrollHandle (this)) .load ();} @Override public void onPageChanged (int page, int pageCount) {pageNumber = page; setTitle (String.format ("% s%  s/% s ", pdfFileName, page + 1, pageCount));} @Override public void loadComplete (int nbPages) {PdfDocument.Meta meta = pdfView.getDocumentMeta (); printBookmarksTree (pdfView.getTableOfContents ()," - ")  ;} public void printBookmarksTree (дерево List , String sep) {для (PdfDocument.  Закладка b: дерево) {Log.e (TAG, String.format ("% s% s, p% d", sep, b.getTitle (), b.getPageIdx ()));  если (b.hasChildren ()) {printBookmarksTree (b.getChildren (), sep + "-");  }}}}  


Загрузите исходный код здесь (Показать PDF-файл внутри моего android application)

Добавьте эту зависимость в свой Grade: compile com.github.barteksc:android-pdf-viewer:2.0.3

activity_main.xml

      

  импортировать android.  app.Activity; import android.database.Cursor; import android.net.Uri; import android.provider.OpenableColumns; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log;  import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import com.github.barteksc.pdfviewer.PDFView; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; import com.github.  barteksc.pdfviewer.listener.OnPageChangeListener; импорт com.github.barteksc.pdfviewer. scroll.DefaultScrollHandle; import com.shockwave.pdfium.PdfDocument; import java.util.List; открытый класс MainActivity расширяет Activity, реализует OnPageChangeListener, OnLoadCompleteListener {частный статический финальный String TAG = MainActivity.class.getSimpleName ();  общедоступная статическая конечная строка SAMPLE_FILE = "android_tutorial.pdf";  PDFView pdfView;  Целое число pageNumber = 0;  String pdfFileName;  @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (saveInstanceState);  setContentView (R.layout.activity_main);  pdfView = (PDFView) findViewById (R.id.pdfView);  displayFromAsset (SAMPLE_FILE);  } private void displayFromAsset (String assetFileName) {pdfFileName = assetFileName;  pdfView.fromAsset (SAMPLE_FILE) .defaultPage (pageNumber) .enableSwipe (true) .swipeHorizontal (false) .onPageChange (this) .enableAnnotationRendering (true) .onLoad (this) .scrollHandle (новый DefaultScrollHandle (this);).  } @Override public void onPageChanged (int page, int pageCount) {pageNumber = page;  setTitle (String.format ("% s% s/% s", pdfFileName, page + 1, pageCount));  } @Override public void loadComplete (int nbPages) {PdfDocument.Meta meta = pdfView.getDocumentMeta ();  printBookmarksTree (pdfView.getTableOfContents (), «-»);  } public void printBookmarksTree (List  tree, String sep) {for (PdfDocument.Bookmark b: tree) {Log.e (TAG, String.format ("% s% s, p% d", sep,  b.getTitle (), b.getPageIdx ()));  если (b.hasChildren ()) {printBookmarksTree (b.getChildren (), sep + "-");  }}}}  

Наконец-то я смог изменить код butelo, чтобы открыть любой файл PDF в файловой системе Android с помощью pdf.js . Код можно найти на моем GitHub

То, что я сделал, было изменено pdffile.js , чтобы читать аргумент HTML файл , например это:

  var url = getURLParameter ('file'); function getURLParameter (name) {return decodeURIComponent ((new RegExp ('[? | &]' + name + '  = '+' ([^ &;] +?) (& | # |; | $) '). exec (location.search) || [, ""]) [1] .replace (/ +/g  , '% 20')) || null}  

Итак, вам нужно просто добавить путь к файлу после index.html вот так:

  Uri path = Uri.parse (Environment.getExternalStorageDirectory (). toString () + "/data/test.pdf");webView.loadUrl("file  :///android_asset/pdfviewer/index.html? file = "+ path);  

Обновите переменную path , чтобы указать на действительный PDF в файловой системе Adroid.


Я наконец смог изменить код butelo, чтобы открыть любой PDF-файл в файл Android система с использованием pdf.js . Код можно найти на моем GitHub

То, что я сделал, было изменено в pdffile. js , чтобы прочитать аргумент HTML file следующим образом:

  var url = getURLParameter ('file'); function getURLParameter (name  ) {return decodeURIComponent ((new RegExp ('[? | &]' + name + '=' + '([^ &;] +?) (& | # |; | $)'). exec (location.search  ) || [, ""]) [1] .replace (/ +/g, '% 20')) || null}  

Итак, что вам нужно сделать просто добавьте путь к файлу после index.html следующим образом:

  Uri path = Uri.parse (Environment.getExternalStorageDirectory ().  toString () + "/data/test.pdf");webView.loadUrl("file:///android_asset/pdfviewer/index.html?file=" + path);  

Обновите переменную path , чтобы она указывала на действительный PDF-файл в файловой системе Adroid.


Чтобы добавить к этому немного света, мне пришлось бы воспользоваться решением pdf.js от Mozilla. Вот ссылка на уже хорошо написанную реализацию этого: https://bitbucket.org/butelo/pdfviewer/.

Вот изменения, которые я добавил в свою деятельность Android:

  private String getInternalPDFURL (String interalPDFName) {return "file:///android_asset/pdfviewer/index.html? pdf =" + interalPDFName + ".pdf";}   

Вот изменения, которые я внес в pdffile.js :

  var url = '../ '+ getPDFURL (); функция getPDFURL () {var query = window.location.search.substring (1);  var vars = query.split ("=");  вар pdfPage = vars [1];  return pdfPage;}  


Чтобы добавить к этому немного света, мне пришлось бы воспользуйтесь решением pdf.js от Mozilla. Вот ссылка на уже хорошо написанную реализацию этого: https://bitbucket.org/butelo/pdfviewer/.

Вот правки, которые я добавил в свою деятельность Android:

  private String getInternalPDFURL (String interalPDFName) {return "file:///android_asset/pdfviewer/index.html? pdf =" + interalPDFName + ".pdf";}   

Вот изменения, которые я внес в pdffile.js :

  var url = '../ '+ getPDFURL (); функция getPDFURL () {var query = window.location.search.substring (1);  var vars = query.split ("=");  вар pdfPage = vars [1];  return pdfPage;}  

Я использовал приведенный ниже код, чтобы открыть и распечатать PDF с помощью Wi -Fi. Я отправляю весь свой код и надеюсь, что он будет полезен.

  открытый класс MainActivity расширяет Activity {int Result_code = 1;  @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (saveInstanceState);  setContentView (R.layout.activity_main);  Кнопка mButton = (Кнопка) findViewById (R.id.button1);  mButton.setOnClickListener (новый вид. OnClickListener () {@Override public void onClick (View v) {//TODO Заглушка автоматически сгенерированного метода PrintManager printManager = (PrintManager) getSystemService (Context.PRINT_SERVICE);  Строка jobName = "Документ";  printManager.print (jobName, pda, null);  }});  } public void openDocument (String name) {Intent intent = new Intent (android.content.Intent.ACTION_VIEW);  Файл файл = новый файл (имя);  Расширение строки = android.webkit.MimeTypeMap.getFileExtensionFromUrl (Uri.fromFile (file) .toString ());  String mimetype = android.webkit.MimeTypeMap.getSingleton (). GetMimeTypeFromExtension (extension);  intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);  if (extension.equalsIgnoreCase ("") || mimetype == null) {//если нет расширения или нет определенного типа mime, все равно пытаемся открыть файл intent.setDataAndType (Uri.fromFile (file), "text /* ");  } else {intent.setDataAndType (Uri.fromFile (файл), mimetype);  }//настраиваемое сообщение для намерения startActivityForResult ((Intent.createChooser (intent, «Выбрать приложение:»)), Result_code); //startActivityForResult (намерение, Result_code); //Toast.makeText(getApplicationContext()," Не установлены почтовые клиенты. ", Toast.LENGTH_SHORT) .show ();  } @SuppressLint ("NewApi") PrintDocumentAdapter pda = new PrintDocumentAdapter () {@Override public void onWrite (PageRange [] страницы, назначение ParcelFileDescriptor, CancellationSignal cancellationSignal, обратный вызов WriteResultCallback) {InputStream input = null;  OutputStream output = null;  попробуйте {String filename = Environment.getExternalStorageDirectory () + "/" + "Holiday.pdf";  Файл файл = новый файл (имя файла);  input = new FileInputStream (файл);  output = новый FileOutputStream (destination.getFileDescriptor ());  byte [] buf = новый байт [1024];  int bytesRead;  в то время как ((bytesRead = input.read (buf))> 0) {output.write (buf, 0, bytesRead);  } callback.onWriteFinished (новый PageRange [] {PageRange.ALL_PAGES});  } catch (FileNotFoundException ee) {//Перехватить исключение} catch (Exception e) {//Перехватить исключение} finally {try {input.close ();  output.close ();  } catch (IOException e) {e.printStackTrace ();  }}} @Override public void onLayout (PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {if (cancellationSignal.isCanceled ()) {callback.onLayoutCancelled (callback.onLayout);  вернуть;  }//int pages = computePageCount (newAttributes);  PrintDocumentInfo pdi = new PrintDocumentInfo.Builder («Имя файла»). SetContentType (PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .build ();  callback.onLayoutFinished (pdi, истина);  }};}  


Я использовал приведенный ниже код, чтобы открыть и распечатать PDF с помощью Wi-Fi. Я отправляю свой код целиком и надеюсь, что это будет полезно.

  открытый класс MainActivity расширяет Activity {int Result_code = 1;  @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (saveInstanceState);  setContentView (R.layout.activity_main);  Кнопка mButton = (Кнопка) findViewById (R.id.button1);  mButton.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View v) {//TODO Автоматически сгенерированный заглушка метода PrintManager printManager = (PrintManager) getSystemService (Context.PRINT_SERVICE); String jobName = "Document"; printManager  .print (jobName, pda, null);}});  } public void openDocument (String name) {Intent intent = new Intent (android.content.Intent.ACTION_VIEW);  Файл файл = новый файл (имя);  Расширение строки = android.webkit.MimeTypeMap.getFileExtensionFromUrl (Uri.fromFile (file) .toString ());  String mimetype = android.webkit.MimeTypeMap.getSingleton (). GetMimeTypeFromExtension (extension);  intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);  if (extension.equalsIgnoreCase ("") || mimetype == null) {//если нет расширения или нет определенного типа mime, все равно пытаемся открыть файл intent.setDataAndType (Uri.fromFile (file), "text /* ");  } else {intent.setDataAndType (Uri.fromFile (файл), mimetype);  }//настраиваемое сообщение для намерения startActivityForResult ((Intent.createChooser (intent, «Выбрать приложение:»)), Result_code); //startActivityForResult (намерение, Result_code); //Toast.makeText(getApplicationContext()," Не установлены почтовые клиенты. ", Toast.LENGTH_SHORT) .show ();  } @SuppressLint ("NewApi") PrintDocumentAdapter pda = new PrintDocumentAdapter () {@Override public void onWrite (PageRange [] страницы, назначение ParcelFileDescriptor, CancellationSignal cancellationSignal, обратный вызов WriteResultCallback) {InputStream input = null;  OutputStream output = null;  попробуйте {String filename = Environment.getExternalStorageDirectory () + "/" + "Holiday.pdf";  Файл файл = новый файл (имя файла);  input = new FileInputStream (файл);  output = новый FileOutputStream (destination.getFileDescriptor ());  byte [] buf = новый байт [1024];  int bytesRead;  в то время как ((bytesRead = input.read (buf))> 0) {output.write (buf, 0, bytesRead);  } callback.onWriteFinished (новый PageRange [] {PageRange.ALL_PAGES});  } catch (FileNotFoundException ee) {//Перехватить исключение} catch (Exception e) {//Перехватить исключение} finally {try {input.close ();  output.close ();  } catch (IOException e) {e.printStackTrace ();  }}} @Override public void onLayout (PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {if (cancellationSignal.isCanceled ()) {callback.onLayoutCancelled (callback.onLayout);  вернуть;  }//int pages = computePageCount (newAttributes);  PrintDocumentInfo pdi = new PrintDocumentInfo.Builder («Имя файла»). SetContentType (PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .build ();  Перезвони. onLayoutFinished (pdi, истина);  }};}  

Предварительный просмотр PDF-документа в Android webview в любом случае невозможен. вы хотите предварительно просмотреть base64 pdf. Для этого требуется сторонняя библиотека.

build.Gradle

  compile 'com.github.barteksc: android-pdf-viewer: 2.7.  0 ' 

dialog_pdf_viewer

   Xml version = "1.0" encoding = "utf-8"?>          

DailogPDFViewer.java

  открытый класс DialogPdfViewer расширяет Dialog {PDFView pdfView;  byte [] decodedString;  открытый интерфейс OnDialogPdfViewerListener {void onAgreeClick (DialogPdfViewer dialogFullEula);  void onCloseClick (DialogPdfViewer dialogFullEula);  } общедоступный DialogPdfViewer (контекст контекста, строка base64, окончательный DialogPdfViewer.OnDialogPdfViewerListener onDialogPdfViewerListener) {super (контекст);  setContentView (R.layout.dialog_pdf_viewer);  findViewById (R.id.dialog_pdf_viewer_close) .setOnClickListener (новый View.OnClickListener () {@Override public void onClick (View v) {onDialogPdfViewerListener.onCloseClick (DialogPdfViewer.this);}});  findViewById (R.id.dialog_pdf_viewer_button) .setOnClickListener (новый View.OnClickListener () {@Override public void onClick (View v) {onDialogPdfViewerListener.onAgreeClick (DialogPdfViewer.this);}});  decodedString = Base64.decode (base64.toString (), Base64.DEFAULT);  pdfView = ((PDFView) findViewById (R.id.pdfView));  pdfView.fromBytes (decodedString) .load ();  установить. этот);  } вернуть истину;  }});  }}  


Предварительный просмотр PDF-документа в Android webview в любом случае невозможен. хотите предварительно просмотреть base64 pdf. Для этого требуется сторонняя библиотека.

build.Gradle

  compile 'com.github.barteksc: android-pdf-viewer: 2.7.  0 ' 

dialog_pdf_viewer

   Xml version = "1.0" encoding = "utf-8"?>          

DailogPDFViewer.java

  открытый класс DialogPdfViewer расширяет Dialog {PDFView pdfView;  byte [] decodedString;  открытый интерфейс OnDialogPdfViewerListener {void onAgreeClick (DialogPdfViewer dialogFullEula);  void onCloseClick (DialogPdfViewer dialogFullEula);  } общедоступный DialogPdfViewer (контекст контекста, строка base64, окончательный DialogPdfViewer.OnDialogPdfViewerListener onDialogPdfViewerListener) {super (контекст);  setContentView (R.layout.dialog_pdf_viewer);  findViewById (R.id.dialog_pdf_viewer_close) .setOnClickListener (новый View.OnClickListener () {@Override public void onClick (View v) {onDialogPdfViewerListener.onCloseClick (DialogPdfViewer.this);}});  findViewById (R.id.dialog_pdf_viewer_button) .setOnClickListener (новый View.OnClickListener () {@Override public void onClick (View v) {onDialogPdfViewerListener.onAgreeClick (DialogPdfViewer.this);}});  decodedString = Base64.decode (base64.toString (), Base64.DEFAULT);  pdfView = ((PDFView) findViewById (R.id.pdfView));  pdfView.fromBytes (decodedString) .load ();  setOnKeyListener (new OnKeyListener () {@Override публичное логическое значение onKey (DialogInterface dialog, int keyCode, событие KeyEvent) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction () == KeyEvent.ACTION_DOWN) {onDialogerPdf. onCloseClick (DialogPdfViewer.this);  } вернуть истину;  }});  }}  

Оцените статью
techsly.ru
Добавить комментарий