public override void OnLayoutFinished(PrintDocumentInfo info, bool changed) { //using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments)) using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads)) { if (!_dir.Exists()) { _dir.Mkdir(); } // var path = _dir.Path + "/" + FileName + ".pdf"; var path = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads, FileName + ".pdf"); var file = new Java.IO.File(path); int iter = 0; while (file.Exists()) { file.Dispose(); iter++; //path = _dir.Path + "/" + FileName + "_" + iter.ToString("D3") + ".pdf"; path = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads, FileName + "_" + iter.ToString("D3") + ".pdf"); file = new Java.IO.File(path); } file.CreateNewFile(); var fileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadWrite); file.Dispose(); var writeResultCallback = new PdfWriteResultCallback(TaskCompletionSource, path); Adapter.OnWrite(new Android.Print.PageRange[] { PageRange.AllPages }, fileDescriptor, new CancellationSignal(), writeResultCallback); } base.OnLayoutFinished(info, changed); }
/// <summary> /// The open asset file. /// </summary> /// <param name="uri"> /// The uri. /// </param> /// <param name="mode"> /// The mode. /// </param> /// <returns> /// The Android.Content.Res.AssetFileDescriptor. /// </returns> public override AssetFileDescriptor OpenAssetFile(Uri uri, string mode) { this.InitIfNecessary(); string path = uri.Path; if (path.StartsWith("/")) { path = path.Substring(1); } ZipFileEntry entry = this.apkExtensionFile.GetEntry(path); if (entry != null && entry.Method == Compression.Store) { try { ParcelFileDescriptor pfd = ParcelFileDescriptor.Open( new File(entry.ZipFileName), ParcelFileMode.ReadOnly); return(new AssetFileDescriptor(pfd, entry.FileOffset, entry.FileSize)); } catch (FileNotFoundException e) { System.Console.WriteLine(e.Message); System.Console.Write(e.StackTrace); } } return(null); }
/// <summary> /// Method to retrieve PDF file from the location. Gets the seekable file descriptor. /// </summary> /// <param name="argCurrentDataFolder"> /// The argument current data folder. /// </param> /// <param name="argFile"> /// The argument file. /// </param> /// <returns> /// ParcelFileDescriptor /// </returns> private ParcelFileDescriptor GetSeekableFileDescriptor(DirectoryInfo argCurrentDataFolder, MediaModel argFile) { ParcelFileDescriptor fileDescriptor = null; try { fileDescriptor = ParcelFileDescriptor.Open(new Java.IO.File(argFile.MediaStorageFilePath), ParcelFileMode.ReadOnly); } catch (FileNotFoundException ex) { ErrorInfo t = new ErrorInfo("File not found exception when trying to create ParcelFileDescriptor") { { "Original ID", argFile.Id }, { "Original File", argFile.OriginalFilePath }, { "Storage Folder", argCurrentDataFolder.FullName }, { "Root", System.IO.Path.Combine(argCurrentDataFolder.FullName, argFile.OriginalFilePath) } }; App.Current.Services.GetService <IErrorNotifications>().NotifyException("GetSeekableFileDescriptor", ex, t); } catch (Exception ex) { ErrorInfo t = new ErrorInfo("Exception when trying to create ParcelFileDescriptor") { { "Original ID", argFile.Id }, { "Original File", argFile.OriginalFilePath }, { "Storage Folder", argCurrentDataFolder.FullName }, { "Root", System.IO.Path.Combine(argCurrentDataFolder.FullName, argFile.OriginalFilePath) } }; App.Current.Services.GetService <IErrorNotifications>().NotifyException("GetSeekableFileDescriptor", ex, t); } return(fileDescriptor); }
public override ParcelFileDescriptor OpenFile(Android.Net.Uri uri, String mode) { const string logTag = ClassName + " - openFile"; Log.Verbose(logTag, "Called with uri: '" + uri + "'." + uri.LastPathSegment); if (uri.ToString().StartsWith("content://" + Authority)) { // The desired file name is specified by the last segment of the // path // E.g. // 'content://keepass2android.provider/Test.txt' // Take this and build the path to the file //Protect against path traversal with an uri like content://keepass2android.keepass2android.provider/..%2F..%2Fshared_prefs%2FKP2A.Plugin.keepass2android.plugin.qr.xml if (uri.LastPathSegment.Contains("/")) { throw new Exception("invalid path "); } String fileLocation = Context.CacheDir + File.Separator + AttachmentCacheSubDir + File.Separator + uri.LastPathSegment; // Create & return a ParcelFileDescriptor pointing to the file // Note: I don't care what mode they ask for - they're only getting // read only ParcelFileDescriptor pfd = ParcelFileDescriptor.Open(new File( fileLocation), ParcelFileMode.ReadOnly); return(pfd); } Log.Verbose(logTag, "Unsupported uri: '" + uri + "'."); throw new FileNotFoundException("Unsupported uri: " + uri.ToString()); }
public override ParcelFileDescriptor OpenDocument(string documentId, string mode, CancellationSignal signal) { Log.Verbose(TAG, "openDocument, mode: " + mode); // It's OK to do network operations in this method to download the document, as long as you // periodically check the CancellationSignal. If you have an extremely large file to // transfer from the network, a better solution may be pipes or sockets // (see ParcelFileDescriptor for helper methods). File file = GetFileForDocId(documentId); var accessMode = ParcelFileDescriptor.ParseMode(mode); bool isWrite = (mode.IndexOf('w') != -1); if (isWrite) { // Attach a close listener if the document is opened in write mode. try { var handler = new Handler(Context.MainLooper); return(ParcelFileDescriptor.Open(file, accessMode, handler, new MyOnCloseListener(documentId))); } catch (IOException) { throw new FileNotFoundException("Failed to open document with id " + documentId + " and mode " + mode); } } else { return(ParcelFileDescriptor.Open(file, accessMode)); } }
public ParcelFileDescriptor GetOutputFile(File path, string fileName) { bool success = true; if (!path.Exists()) { success = path.Mkdir(); } if (success) { File file = new File(path, fileName); try { success = file.CreateNewFile(); if (success) { return(ParcelFileDescriptor.Open(file, ParcelFileMode.ReadWrite)); } } catch (System.Exception e) { //AnalyticsHandlerAdapter.getInstance().sendException(e); } } return(null); }
public void Generate(string path) { try { var file = new Java.IO.File(path); var fileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); var docRenderer = new PdfRenderer(fileDescriptor); if (docRenderer.PageCount == 0) { Image = null; PageCount = 0; return; } var docPage = docRenderer.OpenPage(0); Bitmap renderedPage = Bitmap.CreateBitmap(docPage.Width, docPage.Height, Bitmap.Config.Argb8888); docPage.Render(renderedPage, null, null, PdfRenderMode.ForDisplay); Image = renderedPage; PageCount = docRenderer.PageCount; } catch (Exception) { Image = null; PageCount = 0; } }
public override ParcelFileDescriptor OpenFile(Android.Net.Uri uri, string mode) { string fileName = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), uri.LastPathSegment); return(ParcelFileDescriptor.Open(new Java.IO.File(fileName), ParcelFileMode.ReadOnly)); }
private void openRenderer(Context context) { // In this sample, we read a PDF from the assets directory. File file = new File(context.CacheDir, FILENAME); if (!file.Exists()) { // Since PdfRenderer cannot handle the compressed asset file directly, we copy it into // the cache directory. System.IO.Stream input = context.Assets.Open(FILENAME); Java.IO.FileOutputStream output = new Java.IO.FileOutputStream(file); byte[] buffer = new byte[1024]; int size; while ((size = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, size); } input.Close(); output.Close(); } parcelFileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); // This is the PdfRenderer we use to render the PDF. if (parcelFileDescriptor != null) { pdfRenderer = new PdfRenderer(parcelFileDescriptor); } }
private async void Render(int page, bool isFirstTime = false) { if (pdfFile.Exists()) { try { rendering = true; pdfRenderer = new PdfRenderer(ParcelFileDescriptor.Open(pdfFile, ParcelFileMode.ReadOnly)); totalPages = pdfRenderer.PageCount; var previousPage = currentPage; currentPage = page; if (currentPage < 0) { currentPage = 0; } else if (currentPage >= pdfRenderer.PageCount) { currentPage = pdfRenderer.PageCount - 1; } if (currentPage == previousPage && !isFirstTime) { return; } pageCount.Text = $"{currentPage + 1} of {pdfRenderer.PageCount}"; var pdfPage = pdfRenderer.OpenPage(currentPage); setVisibilities(false); await Task.Run( () => pdfPage.Render(GetBitmap(pdfPage.Width, pdfPage.Height), rect, pdfView.Matrix, PdfRenderMode.ForDisplay)); pdfView.SetImageBitmap(bitmapPdf); pdfView.Invalidate(); pdfRenderer.Dispose(); pdfRenderer = null; bitmapPdf = null; GC.Collect(); setVisibilities(true); rendering = false; } catch (Exception ex) { // ignored } } else { if (page < 0) { currentPage = 0; } else if (page < totalPages) { currentPage = page; } DownloadPdfDocument(); } }
private void LoadPdf(String FileName) { Java.IO.File file = new Java.IO.File(FileName); renderer = new PdfRenderer(ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly)); Count = renderer.PageCount; }
public override AssetFileDescriptor OpenDocumentThumbnail(string documentId, Android.Graphics.Point sizeHint, CancellationSignal signal) { Log.Verbose(TAG, "openDocumentThumbnail"); File file = GetFileForDocId(documentId); var pfd = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); return(new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UnknownLength)); }
public override ParcelFileDescriptor OpenFile(Android.Net.Uri uri, string mode) { string fileName = uri.ToString().Substring(CONTENT_URI.ToString().Length); System.Console.WriteLine(fileName + " - File to open in external app"); if (System.IO.File.Exists(fileName)) { return(ParcelFileDescriptor.Open(new Java.IO.File(fileName), ParcelFileMode.ReadOnly)); } return(null); }
public void RenderPDFPagesIntoImages(Java.IO.File file) { // create a new renderer try { renderer = new PdfRenderer(ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly)); numPages = renderer.PageCount; } catch (Exception) { // handle any exceptions } }
public bool StartRtcEventLog(string file, int fileSizeLimitBytes) { try { ParcelFileDescriptor rtcEventLog = ParcelFileDescriptor.Open(new File(file), ParcelFileMode.Create | ParcelFileMode.Truncate | ParcelFileMode.ReadWrite); return(_peerConnection.StartRtcEventLog(rtcEventLog.DetachFd(), fileSizeLimitBytes)); } catch (IOException ex) { return(false); } }
private async void CreatePDF2(Android.Webkit.WebView webview) { try { // 计算webview打印需要的页数 int numberOfPages = await GetPDFPageCount(webview); File pdfFile = new File(fileNameWithPath); if (pdfFile.Exists()) { pdfFile.Delete(); } pdfFile.CreateNewFile(); descriptor = ParcelFileDescriptor.Open(pdfFile, ParcelFileMode.ReadWrite); // 设置打印参数 var dm = webview.Context.Resources.DisplayMetrics; var d = dm.Density; var dpi = dm.DensityDpi; var height = dm.HeightPixels; var width = dm.WidthPixels; var xdpi = dm.Xdpi; var ydpi = dm.Ydpi; PrintAttributes attributes = new PrintAttributes.Builder() .SetMediaSize(MediaSize) .SetResolution(new PrintAttributes.Resolution("id", Context.PrintService, Convert.ToInt16(xdpi), Convert.ToInt16(ydpi))) .SetColorMode(PrintColorMode.Color) .SetMinMargins(PrintAttributes.Margins.NoMargins) .Build(); ranges = new PageRange[] { new PageRange(0, numberOfPages - 1) }; // 创建pdf文件缓存目录 // 获取需要打印的webview适配器 printAdapter = webview.CreatePrintDocumentAdapter("CreatePDF"); // 开始打印 printAdapter.OnStart(); printAdapter.OnLayout(attributes, attributes, new CancellationSignal(), GetLayoutResultCallback(this), new Bundle()); } catch (Java.IO.FileNotFoundException e) { System.Console.WriteLine(e.Message); } catch (Java.IO.IOException e) { System.Console.WriteLine(e.Message); } catch (Java.Lang.Exception e) { System.Console.WriteLine(e.Message); } }
public bool StartAecDump(string file, int fileSizeLimitBytes) { try { ParcelFileDescriptor aecDumpFileDescriptor = ParcelFileDescriptor.Open(new File(file), ParcelFileMode.Create | ParcelFileMode.Truncate | ParcelFileMode.ReadWrite); return(_factory.StartAecDump(aecDumpFileDescriptor.DetachFd(), fileSizeLimitBytes)); } catch (IOException ex) { return(false); } }
public bool StartAecDumpWithFilePath(string filePath, long maxSizeInBytes) { try { ParcelFileDescriptor aecDumpFileDescriptor = ParcelFileDescriptor.Open(new File(filePath), ParcelFileMode.Create | ParcelFileMode.Truncate | ParcelFileMode.ReadWrite); return(_peerConnectionfactory.StartAecDump(aecDumpFileDescriptor.DetachFd(), (int)maxSizeInBytes)); } catch (Exception exception) { Log.Error(TAG, $"An Exception has occured : {exception.Message}"); return(false); } }
public bool StartRtcEventLogWithFilePath(string filePath, long maxSizeInBytes) { try { ParcelFileDescriptor rtcEventLog = ParcelFileDescriptor.Open(new File(filePath), ParcelFileMode.Create | ParcelFileMode.Truncate | ParcelFileMode.ReadWrite); return(_peerConnection.StartRtcEventLog(rtcEventLog.DetachFd(), (int)maxSizeInBytes)); } catch (System.Exception exception) { Log.Error("PlatformPeerConnection", $"Could not Start RTCEvent logging {exception.Message}"); return(false); } }
public override void OnLayoutFinished(PrintDocumentInfo info, bool changed) { try { var file = new Java.IO.File(PDFToHtml.FilePath); var fileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadWrite); var writeResultCallback = new PdfWriteResultCallback(PDFToHtml); Adapter.OnWrite(new PageRange[] { PageRange.AllPages }, fileDescriptor, new CancellationSignal(), writeResultCallback); } catch { PDFToHtml.Status = PDFEnum.Failed; } base.OnLayoutFinished(info, changed); }
public override void OnLayoutFinished(PrintDocumentInfo info, bool changed) { //using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments)) //using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads)) //using (var _dir = Forms9Patch.Droid.Settings.Context.FilesDir) using (var _dir = Forms9Patch.Droid.Settings.Context.CacheDir) { if (!_dir.Exists()) { _dir.Mkdir(); } // var path = _dir.Path + "/" + FileName + ".pdf"; //var path = System.IO.Path.Combine(_dir.AbsolutePath, Android.OS.Environment.DirectoryDownloads, FileName + ".pdf"); //var file = new Java.IO.File(path); /* * var file = new Java.IO.File(_dir, FileName + ".pdf"); * int iter = 0; * while (file.Exists()) * { * file.Dispose(); * iter++; * //path = _dir.Path + "/" + FileName + "_" + iter.ToString("D3") + ".pdf"; * //path = System.IO.Path.Combine(_dir.AbsolutePath, Android.OS.Environment.DirectoryDownloads, FileName + "_" + iter.ToString("D4") + ".pdf"); * //file = new Java.IO.File(path); * file = new Java.IO.File(_dir, FileName + "_" + iter.ToString("D3") + ".pdf"); * } * * * //file.CreateNewFile(); */ var file = Java.IO.File.CreateTempFile(FileName + ".", ".pdf", _dir); var fileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadWrite); var writeResultCallback = new PdfWriteResultCallback(TaskCompletionSource, file.AbsolutePath); Adapter.OnWrite(new Android.Print.PageRange[] { PageRange.AllPages }, fileDescriptor, new CancellationSignal(), writeResultCallback); file.Dispose(); //Android.Media.MediaScannerConnection.ScanFile(Forms9Patch.Droid.Settings.Context, new string[] { file.AbsolutePath }, new string[] { "application/pdf" }, null); //Android.Media.MediaScannerConnection.ScanFile(file.AbsolutePath, "application/pdf"); } base.OnLayoutFinished(info, changed); }
public override ParcelFileDescriptor OpenFile(Uri uri, string mode) { string path = uri.GetPath(); if (mode.Equals("r") && (path.Equals("/foo.txt") || path.Equals("/bar.txt"))) { try { return(ParcelFileDescriptor.Open( new Java.Io.File(GetContext().GetFilesDir() + path), ParcelFileDescriptor.MODE_READ_ONLY)); } catch (FileNotFoundException) { Log.E(TAG, "Bad file " + uri); } } return(null); }
protected override Android.Graphics.Bitmap RunInBackground(params string[] @params) { if (IsCancelled) { RecycleBitmap(_pdfPageBitmap); return(null); } string url = (string)@params[0]; int position = int.Parse(@params[1]); double zoom = double.Parse(@params[2]); _pdfPageBitmap = null; if (File.Exists(url)) { var file = new Java.IO.File(url); var mFileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); // This is the PdfRenderer we use to render the PDF. if (mFileDescriptor != null) { // create a new renderer using (PdfRenderer renderer = new PdfRenderer(mFileDescriptor)) { using (PdfRenderer.Page page = renderer.OpenPage(position)) { try { _pdfPageBitmap = Android.Graphics.Bitmap.CreateBitmap((int)(page.Width.Px() * zoom), (int)(page.Height.Px() * zoom), Android.Graphics.Bitmap.Config.Argb4444); page.Render(_pdfPageBitmap, null, null, PdfRenderMode.ForDisplay); } catch (Exception e) { _listener.RenderingErrorCaught(string.Format("PdfPageGenerationTask failed for index {0} :{1}", TaskIndex.ToString(), e.Message)); Console.WriteLine(e); } page.Close(); } renderer.Close(); } } } return(_pdfPageBitmap); }
void SetSource(string url) { if (File.Exists(_url)) { var file = new Java.IO.File(_url); var mFileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); // This is the PdfRenderer we use to render the PDF. if (mFileDescriptor != null) { // create a new renderer using (PdfRenderer renderer = new PdfRenderer(mFileDescriptor)) { _count = renderer.PageCount; } } } }
public bool Email(string mailTo, string subject, List <string> filePaths) { try { Context context = Android.App.Application.Context; var email = new Intent(Intent.ActionSendMultiple); email.SetType("message/rfc822"); email.PutExtra(Intent.ExtraEmail, new string[] { mailTo }); email.PutExtra(Intent.ExtraSubject, subject); List <IParcelable> uris = new List <IParcelable>(); filePaths.ForEach(file => { var fileIn = new File(file); if (!fileIn.Exists() || !fileIn.CanRead()) { Toast.MakeText(context, "Attachment Error", ToastLength.Short); return; } fileIn.SetReadable(true, false); ParcelFileDescriptor.Open(fileIn, ParcelFileMode.ReadOnly); var uri = FileProvider.GetUriForFile(Forms.Context.ApplicationContext, "triotech.hubo.droid.fileprovider", fileIn); uris.Add(uri); }); email.PutParcelableArrayListExtra(Intent.ExtraStream, uris); email.AddFlags(ActivityFlags.NewTask); email.AddFlags(ActivityFlags.GrantReadUriPermission); email.AddFlags(ActivityFlags.GrantWriteUriPermission); email.SetFlags(ActivityFlags.GrantReadUriPermission); email.SetFlags(ActivityFlags.GrantWriteUriPermission); context.StartActivity(Intent.CreateChooser(email, "Send Email...").AddFlags(ActivityFlags.NewTask)); return(true); } catch { return(false); } }
public async Task Open(string filePath) { var client = new HttpClient(); var rawPdf = await client.GetByteArrayAsync(filePath); var f = new Java.IO.File(MainActivity.CurrentActivity.CacheDir, "sample.pdf"); FileOutputStream output = new FileOutputStream(f); await output.WriteAsync(rawPdf); output.Close(); var pdfFileDescriptor = ParcelFileDescriptor.Open(f, ParcelFileMode.ReadOnly); var renderer = new PdfRenderer(pdfFileDescriptor); PdfActivity.PdfRenderer = renderer; PdfActivity.File = filePath; MainActivity.CurrentActivity.StartActivity(new Intent(MainActivity.CurrentActivity, typeof(PdfActivity))); }
private List <Bitmap> ConverPdfToBitmap(string filePath) { List <Bitmap> bitmaps = new List <Bitmap>(); Java.IO.File file = new Java.IO.File(filePath); var fileDescriptor = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly); var pdfRenderer = new PdfRenderer(fileDescriptor); for (int i = 0; i < pdfRenderer.PageCount; i++) { // Use the rendered bitmap. var page = pdfRenderer.OpenPage(i); var bitmap = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888); // Render the page to the bitmap. page.Render(bitmap, null, null, PdfRenderMode.ForDisplay); page.Close(); bitmaps.Add(bitmap); } // Open the page to be rendered. // Close the page when you are done with it. pdfRenderer.Close(); return(bitmaps); }
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); if (e.PropertyName == nameof(ExtendedPDFViewer.FileName)) { if (PdfRenderer != null) { PdfRenderer.Dispose(); PdfRenderer = null; this.Element.Dispose(); } var fileStreamPath = this.Context.GetFileStreamPath(this.Element.FileName); ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.Open(fileStreamPath, ParcelFileMode.ReadOnly); PdfRenderer = new PdfRenderer(fileDescriptor); this.Element.PageCount = PdfRenderer.PageCount; this.Element.GenerateItems(); //For better performance, if page count is lesser than 10, create entire items to avoid loading time. if (this.Element.PageCount > 10) { this.ConvertPagetoBitMap(this.Element.CurrentPage); } else { for (int i = 0; i < this.Element.PageCount; i++) { this.ConvertPagetoBitMap(i); } } } else if (e.PropertyName == nameof(ExtendedPDFViewer.CurrentPage)) { this.ConvertPagetoBitMap(this.Element.CurrentPage); } }
public override PdfDocument CreateDocument(Context context, PdfiumCore core, string password) { return(core.NewDocument(ParcelFileDescriptor.Open(FileUtils.FileFromAssetAsync(context, assetName), ParcelFileMode.ReadOnly))); }
void RenderPages(bool next = true) { Stream inputStream = Assets.Open(fileName); using (var outputStream = this.OpenFileOutput("_sample.pdf", Android.Content.FileCreationMode.Private)) { inputStream.CopyTo(outputStream); } var fileStreamPath = this.GetFileStreamPath("_sample.pdf"); MemoryStream m_memoryStream = new MemoryStream(); File.OpenRead(fileStreamPath.AbsolutePath).CopyTo(m_memoryStream); var renderer = new PdfRenderer(ParcelFileDescriptor.Open(fileStreamPath, ParcelFileMode.ReadOnly)); ClearPages(); pages = new List <Bitmap>(); if (pageCount == 0) { pageCount = renderer.PageCount; } bool goingBackFromEnd = (pageCount == pageCurrent && pageGroupCount < pageMax && !next); // set starting page number int pageGroupStart; if (next) { pageGroupStart = pageCurrent; } else if (goingBackFromEnd) { // if we're at the end and going back we need to adjust the page group start by the previous group count instead of the maximum pageGroupStart = pageCurrent - pageGroupCount; // we also need to update the current page here instead of in the loop so it stays on track pageCurrent = pageGroupStart; } else { pageGroupStart = pageCurrent - pageMax; } // get next paging group count int pagesLeft = pageCount - pageCurrent; if (pagesLeft < pageMax && next) { // use pages left if that's below the maximum pageGroupCount = pagesLeft; } else { pageGroupCount = pageMax; } // render pages for (int i = 0; i < pageGroupCount; i++) { if (next) { page = renderer.OpenPage(pageGroupStart + i); pageCurrent++; } else { page = renderer.OpenPage(pageGroupStart - (i + 1)); if (!goingBackFromEnd) { pageCurrent--; } } // create bitmap of page var ratio = (float)page.Height / page.Width; var newHeight = screenWidth * ratio; bitmap = Bitmap.CreateBitmap(screenWidth, (int)newHeight, Bitmap.Config.Argb8888); // render for showing on the screen page.Render(bitmap, null, null, PdfRenderMode.ForDisplay); // add bitmaps to list for recycler pages.Add(bitmap); // close the page page.Close(); if (pageCurrent >= pageCount) { break; } } // close the renderer renderer.Close(); // if going back to previous pages we need to reverse the page list to keep the correct order if (!next) { pages.Reverse(); } textPageCurrent.Text = "Viewing pages " + (pageCurrent - (pageGroupCount - 1)) + "-" + pageCurrent + " of " + pageCount; // set up recycler using bitmap list mAdapter.Pages = pages; mAdapter.NotifyDataSetChanged(); }