示例#1
0
        public static List <System.Drawing.Image> ExtractImagesFromPDF(String PDFSourcePath)
        {
            List <System.Drawing.Image> ImgList = new List <System.Drawing.Image>();

            iTextSharp.text.pdf.RandomAccessFileOrArray RAFObj = null;
            iTextSharp.text.pdf.PdfReader PDFReaderObj         = null;
            iTextSharp.text.pdf.PdfObject PDFObj      = null;
            iTextSharp.text.pdf.PdfStream PDFStremObj = null;

            try
            {
                RAFObj       = new iTextSharp.text.pdf.RandomAccessFileOrArray(PDFSourcePath);
                PDFReaderObj = new iTextSharp.text.pdf.PdfReader(RAFObj, null);

                for (int i = 0; i <= PDFReaderObj.XrefSize - 1; i++)
                {
                    PDFObj = PDFReaderObj.GetPdfObject(i);

                    if ((PDFObj != null) && PDFObj.IsStream())
                    {
                        PDFStremObj = (iTextSharp.text.pdf.PdfStream)PDFObj;
                        iTextSharp.text.pdf.PdfObject subtype = PDFStremObj.Get(iTextSharp.text.pdf.PdfName.SUBTYPE);

                        if ((subtype != null) && subtype.ToString() == iTextSharp.text.pdf.PdfName.IMAGE.ToString())
                        {
                            try
                            {
                                iTextSharp.text.pdf.parser.PdfImageObject PdfImageObj =
                                    new iTextSharp.text.pdf.parser.PdfImageObject((iTextSharp.text.pdf.PRStream)PDFStremObj);

                                System.Drawing.Image ImgPDF = PdfImageObj.GetDrawingImage();
                                ImgList.Add(ImgPDF);
                            }
                            catch (Exception)
                            {
                            }
                        }
                    }
                }
                PDFReaderObj.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return(ImgList);
        }
        private static IEnumerable <byte[]> GetImagesFromPdfPage(PdfReader pdf, int pageNumber)
        {
            var imagesBytes = new List <byte[]>();
            var page        = pdf.GetPageN(pageNumber);
            var res         = (PdfDictionary)PdfReader.GetPdfObject(page.Get(PdfName.RESOURCES));
            var xobj        = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));

            if (xobj == null)
            {
                return(null);
            }
            foreach (var name in xobj.Keys)
            {
                var obj = xobj.Get(name);
                if (!obj.IsIndirect())
                {
                    continue;
                }
                var tg   = (PdfDictionary)PdfReader.GetPdfObject(obj);
                var type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
                if (!type.Equals(PdfName.IMAGE))
                {
                    continue;
                }

                var xrefIndex = ((PRIndirectReference)obj).Number;

                var pdfImage = new iTextSharp.text.pdf.parser.PdfImageObject((PRStream)pdf.GetPdfObject(xrefIndex));
                var img      = pdfImage.GetDrawingImage();

                var ms = new MemoryStream();

                var myImageCodecInfo    = GetEncoderInfo("image/jpeg");
                var myEncoder           = Encoder.Quality;
                var myEncoderParameters = new EncoderParameters(1);
                var myEncoderParameter  = new EncoderParameter(myEncoder, 75L);
                myEncoderParameters.Param[0] = myEncoderParameter;

                img.Save(ms, myImageCodecInfo, myEncoderParameters);
                // img.Save(ms, ImageFormat.Jpeg);
                ms.Position = 0;
                imagesBytes.Add(ms.ToArray());
            }
            return(imagesBytes);
        }
示例#3
0
        public IList <System.Drawing.Image> GetImagesFromPdf(PdfDictionary dict, PdfReader doc)
        {
            List <System.Drawing.Image> images = new List <System.Drawing.Image>();
            PdfDictionary res  = (PdfDictionary)(PdfReader.GetPdfObject(dict.Get(PdfName.RESOURCES)));
            PdfDictionary xobj = (PdfDictionary)(PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)));

            if (xobj != null)
            {
                foreach (PdfName name in xobj.Keys)
                {
                    PdfObject obj = xobj.Get(name);
                    if (obj.IsIndirect())
                    {
                        PdfDictionary tg      = (PdfDictionary)(PdfReader.GetPdfObject(obj));
                        PdfName       subtype = (PdfName)(PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)));
                        if (PdfName.IMAGE.Equals(subtype))
                        {
                            int       xrefIdx = ((PRIndirectReference)obj).Number;
                            PdfObject pdfObj  = doc.GetPdfObject(xrefIdx);
                            PdfStream str     = (PdfStream)(pdfObj);

                            iTextSharp.text.pdf.parser.PdfImageObject pdfImage =
                                new iTextSharp.text.pdf.parser.PdfImageObject((PRStream)str);
                            System.Drawing.Image img = pdfImage.GetDrawingImage();

                            images.Add(img);
                        }
                        else if (PdfName.FORM.Equals(subtype) || PdfName.GROUP.Equals(subtype))
                        {
                            images.AddRange(GetImagesFromPdf(tg, doc));
                        }
                    }
                }
            }

            return(images);
        }
示例#4
0
        public void SavePart(string srcFile, string dstFile, int startPage, int endPage)
        {
            PdfReader pdfReader = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                pdfReader = new PdfReader(srcFile);

                pdfReader.RemoveUnusedObjects();
                if (pdfReader.NumberOfPages == 0)
                {
                    throw new Exception("В документе отсутствуют страницы. Операция сохранения невозможна!");
                }

                startPage = (startPage <= 0 || startPage > pdfReader.NumberOfPages) ? 1 : startPage;
                endPage   = (endPage <= 0 || endPage <startPage || endPage> pdfReader.NumberOfPages) ? pdfReader.NumberOfPages : endPage;

                pdfReader.SelectPages(startPage.ToString() + "-" + endPage.ToString());

                using (var file_stream = new FileStream(dstFile, FileMode.Create, FileAccess.Write, FileShare.None))
                    using (var stamper = new PdfStamper(pdfReader, file_stream))
                    {
                        stamper.SetFullCompression();

                        for (int numberPage = startPage; numberPage <= endPage; numberPage++)
                        {
                            if (numberPage <= 0 || numberPage > pdfReader.NumberOfPages)
                            {
                                continue;
                            }
                            PdfDictionary page      = pdfReader.GetPageN(numberPage);
                            var           resources = (PdfDictionary)PdfReader.GetPdfObject(page.Get(PdfName.RESOURCES));
                            var           xobject   = (PdfDictionary)PdfReader.GetPdfObject(resources.Get(PdfName.XOBJECT));
                            if (xobject != null)
                            {
                                foreach (PdfName pdname in xobject.Keys)
                                {
                                    PdfObject obj = xobject.Get(pdname);
                                    if (obj.IsIndirect())
                                    {
                                        var tg      = (PdfDictionary)PdfReader.GetPdfObject(obj); //resolve indirect reference
                                        var subType = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
                                        if (PdfName.IMAGE.Equals(subType))
                                        {
                                            int       xrefIndex    = ((PRIndirectReference)obj).Number;
                                            PdfObject imgPdfObj    = pdfReader.GetPdfObject(xrefIndex);
                                            var       imgPdfStream = (PdfStream)imgPdfObj;
                                            var       imgPRStream  = (PRStream)imgPdfStream;
                                            byte[]    bytes        = PdfReader.GetStreamBytesRaw(imgPRStream);

                                            if (bytes != null && bytes.Length > 0)
                                            {
                                                try
                                                {
                                                    var pdfImage = new iTextSharp.text.pdf.parser.PdfImageObject(imgPRStream);

                                                    Image img = pdfImage.GetDrawingImage();
                                                    if (img != null)
                                                    {
                                                        var filter = (PdfName)pdfImage.Get(PdfName.FILTER);
                                                        if (filter != null)
                                                        {
                                                            continue;
                                                        }
                                                        System.Drawing.Imaging.ImageFormat format;
                                                        byte[] updatedImgBytes = Controls.PdfViewControl.PDFView.ConvertImageToBytes(img, 75, out format);

                                                        iTextSharp.text.Image compressedImage = iTextSharp.text.Image.GetInstance(updatedImgBytes);
                                                        if (format == System.Drawing.Imaging.ImageFormat.Png)
                                                        {
                                                            compressedImage.Deflated = true;
                                                        }

                                                        PdfReader.KillIndirect(obj);
                                                        stamper.Writer.AddDirectImageSimple(compressedImage, (PRIndirectReference)obj);
                                                    }
                                                }
                                                catch (Exception e)
                                                {
                                                    Console.WriteLine(e.ToString());
                                                    continue;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        stamper.Close();
                    }
            }
            finally
            {
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }

                Cursor.Current = Cursors.Default;
            }
        }