当前位置: 移动技术网 > IT编程>开发语言>.net > PDF文档转换为图片、图片转成PDF 及PDF合并

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

2019年02月01日  | 移动技术网IT编程  | 我要评论

电视剧风筝迅雷下载,我若为仙txt全集下载,爱人下载

简介

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

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

 

背景

之前在项目中遇到一个需求:将多页的pdf上传并转成图片展示要求一页一页的排列开看(例如图1),并要求在传送到服务中心平台看到的时候是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();
            }
        }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网