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; }
/// <summary> /// Sets the form in the state FormState.Finished. /// </summary> internal virtual void Finish() { if (_formState == FormState.NotATemplate || _formState == FormState.Finished) { return; } #if GDI if (Gfx.Metafile != null) { _gdiImage = Gfx.Metafile; } #endif Debug.Assert(_formState == FormState.Created || _formState == FormState.UnderConstruction); _formState = FormState.Finished; Gfx.Dispose(); Gfx = null; if (PdfRenderer != null) { //pdfForm.CreateStream(PdfEncoders.RawEncoding.GetBytes(PdfRenderer.GetContent())); PdfRenderer.Close(); Debug.Assert(PdfRenderer == null); if (_document.Options.CompressContentStreams) { _pdfForm.Stream.Value = Filtering.FlateDecode.Encode(_pdfForm.Stream.Value, _document.Options.FlateEncodeMode); _pdfForm.Elements["/Filter"] = new PdfName("/FlateDecode"); } int length = _pdfForm.Stream.Length; _pdfForm.Elements.SetInteger("/Length", length); } }
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); }
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 InitPageCount() { ParcelFileDescriptor parcelFileDescriptor = null; PdfRenderer pdfRenderer = null; try { parcelFileDescriptor = GetSeekableFileDescriptor(); pdfRenderer = GetPdfRenderer(parcelFileDescriptor); PageCount = pdfRenderer.PageCount; } catch (IOException e) { PageCount = 0; } finally { parcelFileDescriptor.Close(); pdfRenderer.Close(); } }
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); }
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(); }
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); } } }