• 利用C#实现Pdf转图片


            这周碰到一个需求,由于公司系统框架的原因,不能直接显示第三方回传回来的pdf(说明一下,第三方回传的pdf是带上了签章信息(即在pdf中加入了签名图片)),需要把pdf转成图片进行显示,但在做的过程中踩了不少雷。最后使用第三方插件PDFRender4NET

    1   第三方的插件PdfiumViewer(缺点,丢失签章信息)

              首先试了第三方的插件PdfiumViewer,代码很简单,网上也有很多demo,把代码拷贝过来修改一下,三两下就搞定了,试了一下,确实是可以实现pdf传图片,但当我把业务代码写完了,在业务系统上运行时,发现,妈的,大意了,转换完毕的图片丢失了签章信息。下面是我略作修改后的部分代码:

    1. public class PdfToImageHelper
    2. {
    3. /// <summary>
    4. /// pdf转图片(base64格式的字符串)
    5. /// </summary>
    6. /// <param name="pdfBase64String">pdf对应的base64字符串</param>
    7. /// <returns>Pdf如果有多页,就返回多张图片(base64字符串集合)</returns>
    8. public static List<string> GetBase64StringArray(string pdfBase64String)
    9. {
    10. if (pdfBase64String==null|| pdfBase64String.Length==0) return null;
    11. List<string> base64StringList = new List<string>();
    12. byte[] buffer=Convert.FromBase64String(pdfBase64String);
    13. if (buffer == null || buffer.Length == 0) return base64StringList;
    14. MemoryStream ms = new MemoryStream(buffer);
    15. var pdfDocument = PdfiumViewer.PdfDocument.Load(ms);
    16. for (int index = 0; index <pdfDocument.PageCount; index++)
    17. {
    18. Image image = pdfDocument.Render(index, (int)pdfDocument.PageSizes[index].Width, (int)pdfDocument.PageSizes[index].Height, 300, 300, false);
    19. string base64Str=ImageToBase64String(image);
    20. if (base64Str != null && base64Str.Length > 0)
    21. {
    22. base64StringList.Add(base64Str);
    23. }
    24. }
    25. //释放流资源
    26. return base64StringList;
    27. }
    28. /// <summary>
    29. /// Image对象转base64字符串
    30. /// </summary>
    31. /// <param name="Picture"></param>
    32. /// <returns></returns>
    33. private static string ImageToBase64String(Image Picture)
    34. {
    35. MemoryStream ms = new MemoryStream();
    36. if (Picture == null)
    37. return null;
    38. Picture.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    39. byte[] BPicture = new byte[ms.Length];
    40. BPicture = ms.GetBuffer();
    41. //释放流资源
    42. return Convert.ToBase64String(BPicture);
    43. }
    44. }

    调用:List<string>  imageBase64StringList=PdfToImageHelper.GetBase64StringArray("pdf对应的base64字符串");

    2  第三方插件Spire.pdf (缺点:收费,有免费版的,但是pdf转换为图片有页数限制(最多3页) ,且转换后的图片很模糊)

    使用PdfiumViewer不行后,开始使用Spire.pdf,通过vistual studio的nuget就可以拿到dll,如下图:

    第一个Spire.PDF是收费的,转换后的图片左上角会带上如下图的水印信息

     第二个FreeSpire.PDF是免费的,但是pdf如果超过3页,只能转前3页,后面的转换的都是空白页

    代码就不贴了,网上有很多demo

    3   第三方插件PDFRender4NET(O2S.Components.PDFRender4NET.dll,版本信息如下图)

     下面贴出我略做修改后的代码:

    1. using O2S.Components.PDFRender4NET;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Drawing;
    5. using System.Drawing.Imaging;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. namespace iih.gdrmh.ca.PatientSign.bp
    10. {
    11. public class PdfToImageHelper
    12. {
    13. public static List<string> GetBase64StringArrayByPdfPath(string pdfPath)
    14. {
    15. if (pdfPath == null || pdfPath.Length == 0) return null;
    16. List<string> base64StringList = new List<string>();
    17. PDFFile pdfFile = PDFFile.Open(pdfPath);
    18. for (int index =0; index <pdfFile.PageCount; index++)
    19. {
    20. Bitmap pageImage = pdfFile.GetPageImage(index, 56 * 10);
    21. string base64Str = BitmapToBase64String(pageImage);
    22. if (base64Str != null && base64Str.Length > 0)
    23. {
    24. base64StringList.Add(base64Str);
    25. }
    26. }
    27. pdfFile.Dispose();
    28. return base64StringList;
    29. }
    30. private static string ImageToBase64String(Image Picture)
    31. {
    32. MemoryStream ms = new MemoryStream();
    33. if (Picture == null)
    34. return null;
    35. Picture.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    36. byte[] BPicture = new byte[ms.Length];
    37. BPicture = ms.GetBuffer();
    38. return Convert.ToBase64String(BPicture);
    39. }
    40. private static string BitmapToBase64String(Bitmap bitmap)
    41. {
    42. // 1.先将BitMap转成内存流
    43. MemoryStream ms = new MemoryStream();
    44. bitmap.Save(ms, ImageFormat.Png);
    45. ms.Seek(0, SeekOrigin.Begin);
    46. // 2.再将内存流转成byte[]并返回
    47. byte[] bytes = new byte[ms.Length];
    48. ms.Read(bytes, 0, bytes.Length);
    49. ms.Flush();
    50. ms.Close();
    51. ms.Dispose();
    52. return Convert.ToBase64String(bytes);
    53. }
    54. }
    55. }

    调用:List<string>  imageBase64StringList=PdfToImageHelper.GetBase64StringArrayByPdfPath("pdf对应的文件路径");

    最后发现,转换后的图片,签章信息还在,转换后的图片清晰度比FreeSpire.PDF还高

    拓展:

    去stack overflow搜索发现,pdf转换图片的方案有很多,但推荐最多的是Ghostscript.NET. github地址为:https://github.com/jhabjan/Ghostscript.NET   demo代码:https://github.com/jhabjan/Ghostscript.NET/blob/master/Ghostscript.NET.Samples/Samples/RasterizerSample1.cs

    stack overflow参考链接:

    1  Convert Pdf to Image C# .NET - Stack Overflow

    2  Converting pdf to image using c# and Ghostscript - Stack Overflow

    3  asp.net - Convert PDF file to images using C# - Stack Overflow

  • 相关阅读:
    数据可视化ECharts:静态页面制作--主体
    Access2007中如何运行SQL执行SQl语句
    算法进阶-2sat-cf-1400C
    【自然语言处理】BitNet b1.58:1bit LLM时代
    Python数据分析步骤(入门学习)
    devops完整搭建教程(gitlab、jenkins、harbor、docker)
    sklearn机器学习——day04
    一篇文章让你熟悉unordered_set及其模拟实现
    [附源码]计算机毕业设计天狗电子商城系统Springboot程序
    起重机笔记 - 进阶篇(编辑中...)
  • 原文地址:https://blog.csdn.net/zxy13826134783/article/details/125455921