欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PDF文档转换为图片、图片转成PDF 及PDF合并

程序员文章站 2022-08-23 15:29:57
简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档。 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当前的方法就是出现水印标签,最终在各位大佬的帮助下终于完成一个相对完整的代码(主要的是能满足需求)。 ......

简介

功能:pdf文档按每页转换成一张图片,一张图片转换成一张pdf 并将多张pdf合成一个多页的pdf文档。

经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当前的方法就是出现水印标签,最终在各位大佬的帮助下终于完成一个相对完整的代码(主要的是能满足需求)。

 

背景

之前在项目中遇到一个需求:将多页的pdf上传并转成图片展示要求一页一页的排列开看(例如图1),并要求在传送到服务中心平台看到的时候是pdf文档(服务中心平台只提供下载)。

 

PDF文档转换为图片、图片转成PDF 及PDF合并

 

 点击下载需要使用到的dll文件

o2s.components.pdfrender4net.dll 版本:4.7.4.0

itextsharp.dll 版本:5.5.10.0

 

主要的代码如下

        /// <summary>
        /// 将pdf文档转换为图片的方法
        /// </summary>
        /// <param name="pdfinputpath"></param>
        /// <param name="despath">输出相对路径</param>
        /// <param name="definition">设置图片的清晰度,数字越大越清晰</param>
        /// <returns></returns>
        public static list<string> convertpdf2image(string pdfinputpath, string despath, definition definition, string title)
        {
            list<string> imglist = new list<string>();
            pdffile pdffile = pdffile.open(pdfinputpath);
            int startpagenum = 1, endpagenum = pdffile.pagecount;
            int number = 1;
            for (int i = startpagenum; i <= endpagenum; i++)
            {
                bitmap pageimage = pdffile.getpageimage(i - 1, 56 * (int)definition);
                string filepath = despath + title + "-" + number + ".jpg";
                imglist.add(filepath);
                pageimage.save(system.web.httpcontext.current.server.mappath(filepath));
                number++;
            }
            pdffile.dispose();
            return imglist;
        }

        
        public enum definition
        {
            one = 1, two = 2, three = 3, four = 4, five = 5, six = 6, seven = 7, eight = 8, nine = 9, ten = 10
        }

        /// <summary>
        /// 合并pdf
        /// </summary>
        /// <param name="filelist">绝对路径集合</param>
        /// <param name="outmergefile">合并后的文件存在地址绝对路径</param>
        public static void mergepdffiles(list<string> filelist, string outmergefile)
        {
            pdfreader reader;
            //此处将内容从文本提取至文件流中的目的是避免文件被占用,无法删除
            filestream fs1 = new filestream(filelist[0], filemode.open);
            byte[] bytes1 = new byte[(int)fs1.length];
            fs1.read(bytes1, 0, bytes1.length);
            fs1.close();
            reader = new pdfreader(bytes1);
            reader.getpagesize(1);
            // itextsharp.text.rectangle rec = new itextsharp.text.rectangle(1000,800);//设置样式
            itextsharp.text.rectangle rec = reader.getpagesize(1);
            float width = rec.width;
            float height = rec.height;
            //创建一个文档变量
            itextsharp.text.document document = new itextsharp.text.document(rec, 50, 50, 50, 50);
            //创建该文档
            pdfwriter pdfwrite = pdfwriter.getinstance(document, new filestream(outmergefile, filemode.create));
            //打开文档
            document.open();
            //添加内容
            pdfcontentbyte contentbyte = pdfwrite.directcontent;
            pdfimportedpage newpage;
            for (int i = 0; i < filelist.count; i++)
            {

                filestream fs = new filestream(filelist[i], filemode.open);
                byte[] bytes = new byte[(int)fs.length];
                fs.read(bytes, 0, bytes.length);
                fs.close();
                reader = new pdfreader(bytes);
                int pagenum = reader.numberofpages;//获取文档页数
                for (int j = 1; j <= pagenum; j++)
                {
                    document.newpage();
                    newpage = pdfwrite.getimportedpage(reader, j);
                    contentbyte.addtemplate(newpage, 0, 0);
                }

            }
            document.close();
        }

 

        /// <summary>
        /// 图片转pdf
        /// </summary>
        /// <param name="imagepath">图片位置(绝地路径)</param>
        /// <param name="pdfpath">存放pdf地址(绝地路径)</param>
        public static void itextsharpcreatpdf(string imagepath, string pdfpath)
        {
            itextsharp.text.image image = itextsharp.text.image.getinstance(imagepath);
            float percentage = 1;
            //这里都是图片最原始的宽度与高度
            float resizedwidht = image.width;
            float resizedheight = image.height;
            document doc = new document(new itextsharp.text.rectangle(resizedwidht, resizedheight), 0, 0, 0, 0); //new rectangle(1000,1000)

            //指定文件预设开档时的缩放为100%
            //pdfdestination pdfdest = new pdfdestination(pdfdestination.xyz, 0, doc.pagesize.height, 1f);
            try
            {
                pdfwriter.getinstance(doc, new filestream(pdfpath, filemode.create));
                doc.open();
                #region 下面对图片进行操作
                ////这时判断图片宽度是否大于页面宽度减去也边距,如果是,那么缩小,如果还大,继续缩小,
                ////这样这个缩小的百分比percentage会越来越小
                while (resizedwidht > (doc.pagesize.width - doc.leftmargin - doc.rightmargin))
                {
                    percentage = percentage * 0.9f;
                    resizedheight = image.height * percentage;
                    resizedwidht = image.width * percentage;
                }
                #region 注释
                ////there is a 0.8 here. if the height of the image is too close to the page size height,
                ////the image will seem so big
                //while (resizedheight > (doc.pagesize.height - doc.topmargin - doc.bottommargin) * 0.8)
                //{
                //    percentage = percentage * 0.9f;
                //    resizedheight = image.height * percentage;
                //    resizedwidht = image.width * percentage;
                //}
                #endregion
                ////这里用计算出来的百分比来缩小图片
                image.scalepercent(percentage * 100);
                //让图片的中心点与页面的中心点进行重合
                image.setabsoluteposition(doc.pagesize.width / 2 - resizedwidht / 2, doc.pagesize.height / 2 - resizedheight / 2);
                doc.add(image);
                #endregion
            }
            catch (documentexception dex)
            {
                system.web.httpcontext.current.response.write(dex.message);
            }
            catch (ioexception ioex)
            {
                system.web.httpcontext.current.response.write(ioex.message);
            }

            catch (exception ex)
            {
                system.web.httpcontext.current.response.write(ex.message);
            }
            finally
            {
                doc.close();
            }
        }