• C# pdf 转成图片 方法之一


    在开发过程中遇到的:pdf文件中包含文字、表格、图片等,需要将图片取出来存入本地,如何操作呢?

    在面向百度编程的过程中,发现大部分东西要么要钱,要么就存在各种bug等,所以.....推荐使用iTextSharp 操作pdf

    以下就是整个操作过程:

    /// <summary>
            /// 编写提取图片的方法,代码如下:
            /// </summary>
            /// <param name="pdfFile"></param>
            public static void ExtractImage(string pdfFile)
            {
                PdfReader pdfReader = new PdfReader(pdfFile);
                for (int pageNumber = 1; pageNumber <= pdfReader.NumberOfPages; pageNumber++)
                {
                    PdfReader pdf = new PdfReader(pdfFile);
                    PdfDictionary pg = pdf.GetPageN(pageNumber);
                    PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
                    PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
                    try
                    {
                        foreach (PdfName name in xobj.Keys)
                        {
                            PdfObject obj = xobj.Get(name);
                            if (obj.IsIndirect())
                            {
                                PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
                                string width = tg.Get(PdfName.WIDTH).ToString();
                                string height = tg.Get(PdfName.HEIGHT).ToString();
                                //bug 出现位置:未将对象引用....
                                ImageRenderInfo imgRI = ImageRenderInfo.CreateForXObject(new GraphicsState(), (PRIndirectReference)obj, tg);
                                RenderImage(imgRI);
    
                            }
    
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                        continue;
                    }
                }
            }

    调用过程:

      public ActionResult Index()
            {
    
                string path = @"C:UsersAdministratorDesktop20190415164629.pdf";
    
                Pdftoimg.ExtractImage(path);
    
                return View();
            }

    特别注意:

      1.必须确保path 的路径指定的地方有pdf文件

      2.在NuGet中拉取的最新的包可能用不了:建议使用稳定版本中的稳定版本

      

     

    如果是在控制台应用程序中:则可以使用PdfiumViewer

     public class PdfiumViewerTool
        {
    
            /// <summary>
            /// 将PDF转换为图片
            /// </summary>
            /// <param name="pdfPath">pdf文件位置</param>
            /// <param name="pageNumber">pdf文件张数</param>
            /// <param name="size">pdf文件尺寸</param>
            /// <param name="outputPath">输出图片位置与名称</param>
            public void RenderPage(string pdfPath, int pageNumber, System.Drawing.Size size, string outputPath, int dpi = 300)
            {
                using (var document = PdfiumViewer.PdfDocument.Load(pdfPath))
                using (var stream = new FileStream(outputPath, FileMode.Create))
                using (var image = GetPageImage(pageNumber, size, document, dpi))
                {
                    image.Save(stream, ImageFormat.Jpeg);
                }
            }
            private static Image GetPageImage(int pageNumber, Size size, PdfiumViewer.PdfDocument document, int dpi)
            {
                return document.Render(pageNumber - 1, size.Width, size.Height, dpi, dpi, PdfRenderFlags.Annotations);
            }
    
    
    
        }

    调用:

    class Program
        {
            static void Main(string[] args)
            {
                string path = @"C:/Users/Administrator/Desktop/20190415164629.pdf";
    
                var pdf = PdfiumViewer.PdfDocument.Load(path);
                var pdfpage = pdf.PageCount;
                var pagesizes = pdf.PageSizes;
    
                PdfiumViewerTool p2p = new PdfiumViewerTool();
                for (int i = 1; i <= pdfpage; i++)
                {
                    Size size = new Size();
                    size.Height = (int)pagesizes[(i - 1)].Height;
                    size.Width = (int)pagesizes[(i - 1)].Width;
                    p2p.RenderPage(path, i, size, @"C:UsersAdministratorDesktop" + i + @".jpg");
                }
            }
        }

    一般会出现这个问题:

    解决办法:找到程序属性,更改平台目标即可

     以上内容如有侵权:请联系作者删除

  • 相关阅读:
    CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)
    CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划)
    CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)
    POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
    Luogu 1111 修复公路(最小生成树)
    POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)
    POJ 3207 Ikki's Story IV
    洛谷 P1456Monkey King
    洛谷 P1231教辅的组成
  • 原文地址:https://www.cnblogs.com/lau-4/p/10717881.html
Copyright © 2020-2023  润新知