隐藏

C#如何让PDF转图片(JPG,Png)

发布:2023/7/14 14:59:04作者:管理员 来源:本站 浏览次数:1002

背景:最近需要做一个任务:C# PDF文件需要传输为JPG图片。一开始没有头绪,最后去github找到了现在我用的PdfiumViewer组件(免费)实现了功能。


现在分享一下:

【项目框架是:.NET FrameWork 4.6.1 版本】

第一步:用nuget安装两个包:


PdfiumViewer


PdfiumViewer.Native.x86.v8-xfa(注意不是64位版的)


注:该2个包没有版本要求,本次测试使用包版本如下图供参考:

注:编译代码后需检测项目bin目录必须包含pdfium.dll,入下图:


第二步:附上如下代码:

方法一:


/// <summary>

       /// 根据传入参数直接转换

       /// </summary>

       /// <param name="inFilePath">入参示例:E:\\download\\1111.pdf</param>

       /// <param name="outFilePath">入参示例:E:\\download</param>

       /// <param name="format">入参示例:Jpeg  (转换后文件格式,如:Jpeg,Png等)</param>

       public static void PDFConvertTo(string inFilePath, string outFilePath, ImageFormat format)

       {

           outFilePath = $"{outFilePath}\\{DateTime.Now.ToString("yyyyMMdd-HHmmss")}";

           using (var document = PdfDocument.Load(inFilePath))

           {

               var pageCount = document.PageCount;

               for (int i = 0; i < pageCount; i++)

               {

                   string outFile = $"{outFilePath}({i+1}).{format}";

                   var dpi = 300;

                   using (var image = document.Render(i, dpi, dpi, PdfRenderFlags.CorrectFromDpi))

                   {

                       var encoder = ImageCodecInfo.GetImageEncoders()

                           .First(c => c.FormatID == format.Guid);

                       var encParams = new EncoderParameters(1);

                       encParams.Param[0] = new EncoderParameter(

                           System.Drawing.Imaging.Encoder.Quality, 10L);


                       image.Save(outFile, encoder, encParams);

                   }

               }

           }


       }


调用方法入参示例:


{

"inFilePath":"E:\\download\\search.pdf",

"outFilePath":"E:\\download",

"OutFileFormat":"Png"

}


转换pdf有11页,转换后文件如下图:

方法二:


/// <summary>

       /// <param name="filePath">pdf文件路径</param>

       /// <param name="outFilePath">picture输出文件路径</param>

       /// <param name="image">文件格式:Jpeg  (转换后文件格式,如:Jpeg,Png等)</param>

       /// </summary>

       public void PdfToPic(string filePath, string outFilePath, ImageFormat image)

       {

           var pdf = PdfDocument.Load(filePath);

           var pdfpage = pdf.PageCount;

           var pagesizes = pdf.PageSizes;

           outFilePath = $"{outFilePath}\\{DateTime.Now.ToString("yyyyMMdd-HHmmss")}";

           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;

               //可以把".jpg"写成其他形式 RenderPage(filePath, i, size, picPath);

               string outFile = $"{outFilePath}({i}).{image}";

               RenderPage(filePath, i, size, outFile, image);

           }


       }

       private void RenderPage(string pdfPath, int pageNumber, System.Drawing.Size size, string outputPath, ImageFormat mat, int dpi = 300)

       {

           using (var document = PdfDocument.Load(pdfPath))

           using (var stream = new FileStream(outputPath, FileMode.Create))

           using (var image = GetPageImage(pageNumber, size, document, dpi))

               image.Save(stream, mat);

       }

       private static System.Drawing.Image GetPageImage(int pageNumber, Size size, PdfDocument document, int dpi)

       {

           return document.Render(pageNumber - 1, size.Width, size.Height, dpi, dpi, PdfRenderFlags.Annotations);

       }


方法二和方法一区别:转换后文件像素大小不同。这个就影响了图片的质量。

在这里插入图片描述

原因分析:对比两个方法,dpi(分辨率值)都是设置为300,为啥转换后picture 像素不同呢。

原因:参数设置不同。

注释:


PdfRenderFlags.Annotations:设置是否要渲染注释


PdfRenderFlags.CorrectFromDpi:DPI的正确高度/宽度。


更正DPI=8192


参数都设置为:PdfRenderFlags.CorrectFromDpi

转换picture文件像素就是最合适的了。


PS:需要转其他格式的或者调整图片质量的  稍微改造一下就好了。