C# 多张图片合成一张PDF

        我是将每张图片转为byte[],再将所有的字节数组转为byte[][],然后对byte[][]进行的处理,大家有其他格式的图片要进行处理的可以先转为上述数据格式。

语种:C#

用到的第三方库:PdfSharp.dll(可直接使用PDFsharp包),如下图

思路大概如下:

①申明一个PDF文件对象(PdfDocument变量)

②遍历我们要处理的所有图片

③   申明一个PDF页对象(PdfPage变量),申明一个画板(XGraphics对象)隶属于刚申明的PDF页对象,然后用画板将此次遍历到的图片(byte[])画到PDF页对象上,然后将PDF页对象塞到第①步申明的PDF文件对象

④此时,遍历完所有图像了,PDF文件对象中也有我们要处理的所有图片数据了,直接保存这份PDF文件对象就可以了。

下面是代码:

 /// <summary>
        /// 保存PDF图像【适用于小批量图片】
        /// </summary>
        /// <param name="buffer">要处理的所有图片数据</param>
        /// <param name="path">PDF的保存路径</param>
        /// <returns></returns>
        public static void SavePdf(byte[][] buffer, string savePath)
        {
            if (buffer == null || buffer.Length == 0)
            {
                throw new Exception("文件流为空!");
            }             
            Verif(savePath);//此方法我用来验证路径,逻辑依自己的业务来写就好,不需要可直接去掉。

            string folderPath = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
                
            PdfDocument doc = new PdfDocument();
            try
            {
                for (int i = 0; i < buffer.Length; i++)
                {
                    using (MemoryStream ms1 = new MemoryStream(buffer[i]))
                    {
                        //var stream = Image.FromStream(ms1);
                        //XImage img = XImage.FromGdiPlusImage(stream);
                        XImage img = XImage.FromStream(ms1);
                        PdfPage page = new PdfPage();
                        XGraphics xgr = XGraphics.FromPdfPage(page);
                        doc.Pages.Add(page);
                        xgr.DrawImage(img, 0, 0, page.Width.Value, page.Height.Value);//切记这里一定要指定宽高
                        
                        img.Dispose();
                    }
                }
                doc.Save(savePath);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                doc.Dispose();
                doc.Close();
            }
        }

雷点:

在画图像(即执行xgr.DrawImage()函数)时,一定要指定宽高,即上述代码中的page.Width.Value和page.Height.Value,否则在处理横图时,会出现图片显示不全的bug.

好了,这篇文章就到这里,小伙伴们有什么建议和意见或者不懂的地方,评论区交流就好。

猜你喜欢

转载自blog.csdn.net/weixin_45963929/article/details/131413073