ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#PDF转图片,支持批量转,支持PDF文件,BASE64转换为图片文件,BASE64,支持合并PDF为一张图

2022-01-26 15:34:41  阅读:264  来源: 互联网

标签:stream image BASE64 支持 using images PDF 图片


大家好呀,我是一名Java开发工程师,最近公司项目遇到PDF转图片超时问题,经过排查,PDF文件大概在2-3M左右,使用pdfbox转换大概7-8秒(并且存在转换空白的问题),使用icepdf更长,经测试多天,最终放弃Java开发方式去做。使用C#做个个小的winform工具发现 速度还蛮快,打算用.NET WEBAPI写个接口进行PDF转图片,我把代码给大家,目前百度上没这么全的,给大家闭坑了。

项目引用包如下:

  1. PdfiumViewer
  2. ImageResizer.Plugins.PdfiumRenderer.Pdfium.Dll

大家直接在NuGet里面搜索安装即可!下面正式开始:

首先获取PDF文件转图片流:

//此处入参为PDF的base64编码,大家按照自己的需求来选择用哪段
byte[] data = Convert.FromBase64String(pdfToImageDTO.param);
Stream stream = new MemoryStream(data);
var pdf = PdfDocument.Load(stream);

//此处入参为PDF的文件路径,大家按照自己的需求来选择用哪段
//string strpdfPath = txtPDF.Text.ToString();
//var pdf = PdfDocument.Load(strpdfPath);

var pdfpage = pdf.PageCount;
var pagesizes = pdf.PageSizes;
//先转换获取所有图片List
List<Image> images = new List<Image>();
for (int i = 1; i <= pdfpage; i++)
{
    Size size = new Size((int)pagesizes[(i - 1)].Width, (int)pagesizes[(i - 1)].Height);
    //这里的100大家可以调高调低,越高越清晰,相应的转换时间和文件也会变大
    Image image = pdf.Render(i - 1, size.Width, size.Height, 100, 100, PdfRenderFlags.CorrectFromDpi);
    images.Add(image);
}
//再将图片列表合并并转换成base64(此处调用我封装的工具类,后面会提供代码)
return PdfToImageUtil.ImagesMerge(images);

我封装了个工具类PDFTOIMAGEAPI.cs(该工具类主要将图片流拼接成一个图片,并返回Base64编码):

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace PDFTOIMAGEAPI.Utils
{
    public class PdfToImageUtil
    {
        
        /// <summary>
        /// 图片合并并返回Base64编码
        /// </summary>
        /// <param name="images"></param>
        /// <returns></returns>
        public static string ImagesMerge(List<Image> images)
        {
            //把合并的图片进行保存为jpg格式
            MemoryStream stream = new MemoryStream();
            if (images.Count == 0)
            {
                return "图片列表为空,无法转换!";
            }
            else if (images.Count > 1)
            {
                //最大宽度和高度
                int maL = 0, totalH = 0;
                //循环遍历获取文件的最大宽度与总高度
                foreach (Image image in images)
                {
                    if (image.Width > maL) maL = image.Width;
                    totalH = totalH + image.Height;
                }
                if (totalH == 0 || maL == 0) return null; ;
                using (Bitmap map = new Bitmap(maL, totalH)) //定义画布
                {
                    Graphics g = Graphics.FromImage(map);//定义画笔
                    g.Clear(Color.White);//把画布更改为白色
                    int y = 0;//y轴坐标
                    foreach (Image image in images)
                    {
                        g.DrawImage(image, new Point(0, y));
                        y = y + image.Height;//y的告诉 5是为了让画布有个缝隙
                    }
                    map.Save(stream, ImageFormat.Jpeg);
                    //如果需要保存成图片文件,可以使用下面这段注释掉的代码
                    //map.Save("F:\\1.jpg", ImageFormat.Jpeg);
                }
            }
            else
            {
                images[0].Save(stream, ImageFormat.Jpeg);
            }
            byte[] arr = new byte[stream.Length];
            stream.Position = 0;
            stream.Read(arr, 0, (int)stream.Length);
            stream.Close();
            //这里将arr强转Base64
            return Convert.ToBase64String(arr);

        }
    }
}

标签:stream,image,BASE64,支持,using,images,PDF,图片
来源: https://blog.csdn.net/zpwvip/article/details/122702433

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有