private static Bitmap RenderImage(PdfRenderer.Page page) { var bitmap = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888); // Fill with default while color first var canvas = new Canvas(bitmap); var paint = new Paint() { Color = Color.White }; canvas.DrawRect(new Rect(0, 0, page.Width, page.Height), paint); // Render content page.Render(bitmap, null, null, PdfRenderMode.ForDisplay); return(bitmap); }
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); }
private void showPage(int index) { if (pdfRenderer.PageCount <= index) { return; } // Make sure to close the current page before opening another one. if (null != currentPage) { currentPage.Close(); } currentPage = pdfRenderer.OpenPage(index); Bitmap bitmap = Bitmap.CreateBitmap(currentPage.Width, currentPage.Height, Bitmap.Config.Argb8888); currentPage.Render(bitmap, null, null, PdfRenderMode.ForDisplay); _imageView.SetImageBitmap(bitmap); updateUi(); }
// Indexer (read only) for accessing a pdf: public Bitmap this[int i] { get { page = renderer.OpenPage(i); // 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); page.Close(); page.Dispose(); return(bitmap); } }
public void ConvertPagetoBitMap(int index) { if (this.Element.ImageStreams.ContainsKey(index)) { return; } int scaleFactor = 1; Stream stream = null; PdfRenderer.Page page = PdfRenderer.OpenPage(index); Bitmap bitmap = Bitmap.CreateBitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor), Bitmap.Config.Argb8888); bitmap.EraseColor(Android.Graphics.Color.White); page.Render(bitmap, new Rect(0, 0, (int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor)), null, PdfRenderMode.ForDisplay); page.Close(); stream = new MemoryStream(); bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream); this.Element.ImageStreams.Add(index, bitmap); this.Element.PDFViewModel.Items[index].PageData = bitmap; }
private Bitmap ConvertSinglePageToImages(int PageIndex) { using (currentPage = renderer.OpenPage(PageIndex)) { using (Bitmap bitmap = Bitmap.CreateBitmap(currentPage.Width, currentPage.Height, Bitmap.Config.Argb4444)) { currentPage.Render(bitmap, null, null, PdfRenderMode.ForDisplay); Double scale = 1f / 1f; Bitmap resizedBitmap = Bitmap.CreateScaledBitmap( bitmap, (Int32)(bitmap.Width * scale), (Int32)(bitmap.Height * scale), false ); currentPage.Close(); return(resizedBitmap); } } }
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(); }
public async Task <IMediaModel> GenerateThumbImageFromPDF(DirectoryInfo argCurrentDataFolder, MediaModel argExistingMediaModel, IMediaModel argNewMediaModel) { IMediaModel returnValue = new MediaModel(); try { await Task.Run(() => { string outFilePath = System.IO.Path.Combine(argCurrentDataFolder.FullName, argNewMediaModel.OriginalFilePath); // Initialize PDFRenderer by passing PDF file from location. PdfRenderer renderer = new PdfRenderer(GetSeekableFileDescriptor(argCurrentDataFolder, argExistingMediaModel)); int pageCount = renderer.PageCount; // Use `openPage` to open a specific page in PDF. PdfRenderer.Page page = renderer.OpenPage(0); //Creates bitmap Bitmap bmp = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888); //renderes page as bitmap, to use portion of the page use second and third parameter page.Render(bmp, null, null, PdfRenderMode.ForDisplay); //Save the bitmap var stream = new FileStream(outFilePath, FileMode.Create); bmp.Compress(Bitmap.CompressFormat.Png, 100, stream); stream.Close(); page.Close(); returnValue = argNewMediaModel; }); } catch (DirectoryNotFoundException ex) { ErrorInfo t = new ErrorInfo("Directory not found when trying to create image from PDF file") { { "Original ID", argExistingMediaModel.Id }, { "Original File", argExistingMediaModel.MediaStorageFilePath }, { "Clipped Id", argNewMediaModel.Id }, { "New path", "pdfimage" } }; App.Current.Services.GetService <IErrorNotifications>().NotifyException("PDF to Image", ex, t); return(returnValue); } catch (Exception ex) { ErrorInfo t = new ErrorInfo("Exception when trying to create image from PDF file") { { "Original ID", argExistingMediaModel.Id }, { "Original File", argExistingMediaModel.MediaStorageFilePath }, { "Clipped Id", argNewMediaModel.Id } }; App.Current.Services.GetService <IErrorNotifications>().NotifyException("PDF to Image", ex, t); return(returnValue); } return(returnValue); }
void RenderPages() { 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)); var screenWidth = Resources.DisplayMetrics.WidthPixels; // render all pages pageCount = renderer.PageCount; for (int i = 0; i < pageCount; i++) { page = renderer.OpenPage(i); // create bitmap at appropriate size var ratio = (float)page.Height / page.Width; var newHeight = screenWidth * ratio; bitmap = Bitmap.CreateBitmap(screenWidth, (int)newHeight, Bitmap.Config.Argb8888); // render PDF page to bitmap page.Render(bitmap, null, null, PdfRenderMode.ForDisplay); // add bitmap to list pages.Add(bitmap); // close the page page.Close(); // if free memory is less than the size of two page bitmaps and we still have pages left to load // we'll stop loading and then display a message about downloading the full doc // * this catch doesn't seem to work on Android O but it worked on a Nexus 5 running Android M, apparently Android O changes some memory handling Debug.WriteLine("\nMemory usage " + i + "\n" + "Bitmap Byte Count: " + bitmap.ByteCount + "\nMemory Available: " + MemoryAvailable()); if (bitmap.ByteCount * 2 > MemoryAvailable() && i < pageCount - 1) { lowMemory = true; break; } } // close the renderer renderer.Close(); // Create an adapter for the RecyclerView, and pass it the // data set (the bitmap list) to manage: mAdapter = new PdfBitmapAdapter(pages); // Register the item click handler (below) with the adapter: mAdapter.ItemClick += OnItemClick; // Plug the adapter into the RecyclerView: mRecyclerView.SetAdapter(mAdapter); if (lowMemory) { try { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle("Out Of Memory"); alert.SetMessage("You are only viewing " + pages.Count + " out of " + pageCount + " pages."); alert.SetPositiveButton("OK", (senderAlert, args) => { }); Dialog dialog = alert.Create(); dialog.Show(); } catch (Exception e) { Debug.WriteLine("Exception: " + e.Message); } } }