Ejemplo n.º 1
0
                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;
		}
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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();
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
                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);
                }
Ejemplo n.º 8
0
        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();
        }
Ejemplo n.º 9
0
        // 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);
            }
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
                }
            }
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 14
0
        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);
                }
            }
        }