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

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

懒得看文章的直接下载Demo自己研究:

使用.NETWEBAPI开发PDF转图片接口Demo-C#文档类资源-CSDN下载

C# 开发PDF转图片文件,支持Base64转换 WinForm项目-C#文档类资源-CSDN下载

项目引用包如下:

  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);

        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#中,将Base64编码的PDF转换图片Base64通常需要借助第三方库,因为.NET内置的处理能力有限。你可以使用一些开源库如iTextSharp(针对PDF)、System.Drawing.Common(用于像操作),或者在线API服务来进行这样的转换。 以下是一个简单的示例,使用iTextSharp库,假设已经安装了`iTextsharp.text.pdf`和`System.Drawing.Imaging`: ```csharp using System; using System.IO; using iTextSharp.text.pdf; using System.Drawing.Imaging; public string Base64PdfToImage(string pdfBase64) { byte[] pdfBytes = Convert.FromBase64String(pdfBase64); // 创建临时文件保存PDF内容 var tempFile = Path.GetTempFileName(); using (FileStream fileStream = File.OpenWrite(tempFile)) { fileStream.Write(pdfBytes, 0, pdfBytes.Length); // 使用iTextSharp读取PDF转换为image PdfReader reader = new PdfReader(tempFile); using (MemoryStream imgStream = new MemoryStream()) { Image image = null; try { image = iTextSharp.text.Image.GetInstance(reader.GetPage(1)); // 取出第一页,按需替换页码 image.SetAbsolutePosition(0, 0); // 调整位置到原点 image.ScaleToFit(800, 600); // 自适应缩放尺寸 image.Rotation = 0; // 设置旋角度,如需要 image.Save(imgStream, ImageFormat.Png); // 保存为PNG格式 imgStream.Seek(0, SeekOrigin.Begin); byte[] imgBytes = imgStream.ToArray(); return Convert.ToBase64String(imgBytes); } finally { if (image != null) image.Dispose(); } } } File.Delete(tempFile); // 删除临时文件 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇的饭团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值