コード例 #1
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;
		}
コード例 #2
0
ファイル: XForm.cs プロジェクト: mapilab/PDFsharp
        /// <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);
            }
        }
コード例 #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);
        }
コード例 #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);
        }
コード例 #5
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);
                }
コード例 #6
0
        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();
            }
        }
コード例 #7
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);
        }
コード例 #8
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();
        }
コード例 #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);
                }
            }
        }