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; } }
private string[] Render (PdfRenderer pdf, string outputDirectory) { var result = new string[pdf.PageCount]; for (int i = 0; i < pdf.PageCount; i++) { var pagePath = string.Format ("{0}/{1}.png", outputDirectory.TrimEnd (new char[] { '/', '\\' }), i); var page = pdf.OpenPage (i); var image = RenderImage (page); using (var fs = new FileStream (pagePath, FileMode.CreateNew)) { image.Compress (Bitmap.CompressFormat.Png, 95, fs); } result [i] = pagePath; page.Close (); } pdf.Close (); var metaPath = string.Format ("{0}/{1}", outputDirectory.TrimEnd (new char[] { '/', '\\' }), MetaFile); File.Create (metaPath); return result; }
private string[] Render(PdfRenderer pdf, string outputDirectory) { var result = new string[pdf.PageCount]; for (int i = 0; i < pdf.PageCount; i++) { var pagePath = string.Format("{0}/{1}.png", outputDirectory.TrimEnd(new char[] { '/', '\\' }), i); var page = pdf.OpenPage(i); var image = RenderImage(page); using (var fs = new FileStream(pagePath, FileMode.CreateNew)) { image.Compress(Bitmap.CompressFormat.Png, 95, fs); } result [i] = pagePath; page.Close(); } pdf.Close(); var metaPath = string.Format("{0}/{1}", outputDirectory.TrimEnd(new char[] { '/', '\\' }), MetaFile); File.Create(metaPath); return(result); }
public Bitmap[] GetPages(int pageFrom, int pageTo) { if (pageFrom == pageTo) { return(null); } if (pageFrom > pageTo) { return(GetPages(pageTo, pageFrom)); } if (pageFrom < 0 || pageFrom >= PageCount || pageTo > PageCount) { return(null); } Bitmap[] bitmaps = new Bitmap[pageTo - pageFrom]; float quality = 2.0F; ParcelFileDescriptor parcelFileDescriptor = null; PdfRenderer pdfRenderer = null; try { parcelFileDescriptor = GetSeekableFileDescriptor(); pdfRenderer = GetPdfRenderer(parcelFileDescriptor); for (int i = 0; i < bitmaps.Length; ++i) { string cacheKey = GetCacheKey(i + pageFrom); Bitmap bitmap = _pageCache.GetBitmapFromMemCache(new Java.Lang.String(cacheKey)); if (bitmap == null) { Page page = pdfRenderer.OpenPage(i + pageFrom); int width = Java.Lang.Math.Round(page.Width * quality); int height = Java.Lang.Math.Round(page.Height * quality); bitmap = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888); page.Render(bitmap, null, null, PdfRenderMode.ForDisplay); page.Close(); _pageCache.AddBitmapToMemoryCache(new Java.Lang.String(cacheKey), bitmap); } bitmaps[i] = bitmap; } } catch (IOException ex) { //log } finally { parcelFileDescriptor.Close(); pdfRenderer.Close(); } return(bitmaps); }
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(); } }
public static Bitmap GetBitmapFromRender(this PdfRenderer renderer, int index = 0) { var page = renderer.OpenPage(index); var b = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888); page.Render(b, null, null, PdfRenderMode.ForDisplay); page.Close(); return(b); }
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); } }
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); }
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); } } }