Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
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);
                }
Exemplo n.º 3
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();
        }
Exemplo n.º 4
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);
            }
        }
        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;
        }
Exemplo n.º 6
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);
                }
            }
        }
Exemplo n.º 7
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);
        }
Exemplo n.º 9
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);
                }
            }
        }